一、業務需求 在工作中遇到一個場景,軟體bug或功能發佈之後,會通知測試進行測試,要求寫一個小工具能自動發送郵件,功能包含發送和抄送支持多個,因為只是通知沒有寫進附件功能,這個其他博客都有搜一下就可以了。 二、以下是實現代碼 這裡要註意如果接收者郵箱三種方式都沒配置則需要手動輸入,其他的沒配置就是彈 ...
一、業務需求
在工作中遇到一個場景,軟體bug或功能發佈之後,會通知測試進行測試,要求寫一個小工具能自動發送郵件,功能包含發送和抄送支持多個,因為只是通知沒有寫進附件功能,這個其他博客都有搜一下就可以了。
二、以下是實現代碼
這裡要註意如果接收者郵箱三種方式都沒配置則需要手動輸入,其他的沒配置就是彈異常了。
這裡使用的三種配置方其中的環境變數和命令行參數需要導入以下包,我用的是.net5.0所以版本都是選的5.0。使用其他版本不知道會產生什麼問題,能一直就一致(前輩給的經驗)
使用json方式有個坑就是要把json文件的屬性里的複製到輸出目錄選成始終複製,Environment.CurrentDirectory才找得到它。
查看代碼
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Net.Mail;
using System.Text;
namespace gct.sendmail
{
public class Program
{
static void Main(string[] args)
{
Console.WriteLine(WriteEmail(args).ToString());
}
public static string WriteEmail(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
//json文件
.AddJsonFile("appsettings.json")
//系統參數
.AddCommandLine(args)
//環境變數
.AddEnvironmentVariables()
.Build();
//發送者郵箱
string strMailFrom = GetValue(configuration, "From:strMailFrom", "strMailFrom");
//校驗碼
string strCode = GetValue(configuration, "From:strCode", "strCode");
//是否Html文件格式
bool isHtml = !string.IsNullOrEmpty(configuration["From:isHtml"])?bool.Parse(configuration["From:isHtml"]) :
configuration["isHtml"]!=null ? bool.Parse(configuration["isHtml"]) : false;
//郵件伺服器
string strEmailServe = GetValue(configuration, "From:strEmailServe", "strEmailServe");
//埠號
int ePort = !string.IsNullOrEmpty(configuration["From:isHtml"])? int.Parse(configuration["From:ePort"]):
!string.IsNullOrEmpty(configuration["ePort"]) ? int.Parse(configuration["ePort"]) : 25;
//郵件發送名稱
string strMailFromName = GetValue(configuration, "From:strMailFromName", "strMailFromName");
string strMailTo = GetValue(configuration, "To:strMailTo", "strMailTo");
if (string.IsNullOrEmpty(strMailTo))
{
Console.WriteLine("請輸入收件人郵箱,以" + ";" + "間隔!");
strMailTo = Console.ReadLine().ToString();
}
//抄送
string strMailCC = GetValue(configuration, "To:strMailCC", "strMailCC");
//標題
string strMailSubject = GetValue(configuration, "Content:strMailSubject", "strMailSubject");
//正文
string strMailBody = GetValue(configuration, "Content:strMailBody", "strMailBody");
return SendEmail(strMailFrom, strMailTo, strMailCC, strMailSubject, strMailBody, isHtml, strCode, ePort, strEmailServe, strMailFromName);
}
/// <summary>
/// 發送電子郵件
/// </summary>
/// <param name="mailFrom">郵件發送方</param>
/// <param name="mailTo">郵件接收方</param>
/// <param name="mailCC">抄送</param>
/// <param name="mailHead">標題</param>
/// <param name="mailBody">正文</param>
/// <param name="isHtml">指示郵件正文是否為 HTML 格式。</param>
/// <param name="code">校驗碼</param>
/// <param name="ePort">埠號</param>
/// <param name="emailServe">郵箱伺服器</param>
/// <param name="mailFromName">發件人名稱</param>
/// <returns></returns>
public static string SendEmail(string mailFrom, string mailTo, string mailCC,
string mailHead, string mailBody, bool isHtml,
string code, int ePort,string emailServe,string mailFromName)
{
MailMessage eMail = new MailMessage();
SmtpClient eClient = new SmtpClient(emailServe, ePort);
eClient.Credentials = new System.Net.NetworkCredential(mailFrom, code);
eClient.EnableSsl = true;
eClient.UseDefaultCredentials = false;
eMail.Subject = mailHead;
eMail.SubjectEncoding = Encoding.UTF8;
eMail.Body = mailBody;
eMail.BodyEncoding = Encoding.UTF8;
eMail.From = new MailAddress(mailFrom, mailFromName,Encoding.UTF8);
string[] arrMailAddr;
try
{
//用";"分割多個收件人.
eMail.To.Clear();
if (!string.IsNullOrEmpty(mailTo))
{
arrMailAddr = mailTo.Split(';');
foreach (string strTo in arrMailAddr)
{
if (!string.IsNullOrEmpty(strTo))
{
eMail.To.Add(strTo);
}
}
}
//用";"分割多個抄送人.
eMail.CC.Clear();
if (!string.IsNullOrEmpty(mailCC))
{
arrMailAddr = mailCC.Split(';');
foreach (string strCC in arrMailAddr)
{
if (!string.IsNullOrEmpty(strCC))
{
eMail.CC.Add(strCC);
}
}
}
if (isHtml)
{
eMail.IsBodyHtml = true;
}
else
{
eMail.IsBodyHtml = false;
}
eClient.Send(eMail);
return "郵件已發送,請查收!";
}
catch (Exception ex)
{
return "郵件發送失敗,原因:" + ex.Message.ToString();
}
}
//獲取配置值
public static string GetValue(IConfiguration configuration,string value1,string value2)
{
if (!string.IsNullOrEmpty(configuration[value1]))
{
return configuration[value1];
}
return configuration[value2];
}
}
}
這裡需要註意,郵箱發送需要校驗碼,我這裡是用的qq郵箱,其他郵箱大概也要,我懶得截圖了,以下為參考來源:.Net調用QQ郵箱發送郵件 - 櫻滿集 - 博客園 (cnblogs.com)
首先發送郵件要開啟一個smtp的服務
第一步:打開qq郵箱點擊設置:
第二步:點擊賬戶
第三步:向下拉找到smtp字樣的地方,然後全部開啟
相信你能理解這句話,然後你開啟的時候會自動彈出授權碼,如果沒有當時沒有複製粘貼可以點擊生成授權碼 ,來重新生成:
第一種配置方式:json文件,以下是我的配置方式,取值格式是configuration["From:strCode"]
appsettings.json
{
"From": {
//發件人郵箱
"strMailFrom": "",
//郵箱伺服器,以下是qq郵箱伺服器
"strEmailServe": "smtp.qq.com",
//授權碼(註意此處,是授權碼你需要到qq郵箱里點設置開啟Smtp服務,然後會提示你第三方登錄時密碼處填寫授權碼)
"strCode": "",
//是否為Html文件形式
"isHtml": "false",
//埠,預設25
"ePort": "25",
//發送者名稱
"strMailFromName": ""
},
"To": {
//抄送,多個以英文符號;間隔
"strMailCC": "",
//收件人郵箱,多個以英文符號;間隔
"strMailTo": ""
},
"Content": {
//標題
"strMailSubject": "郵件測試",
//正文內容
"strMailBody": "郵件測試,請勿回覆"
}
}
第二種配置方式,環境變數,除了在項目內能設置,系統的環境變數也能識別到,以下只距離項目內設置的,這裡有個問題我還沒弄清楚,弄到Linux環境里去之後項目里設置的好像沒有生效,這裡我驗證之後再來更新,建議是使用json方式配置,優先順序也是json優先其次環境變數再其次命令行參數。
第三種配置方式,命令行參數
這裡很奇怪的是官方說明會用--開頭,但取值的時候--是不生效的也就是說--str和str是一樣的。具體的我也不知道,有興趣的可以去官網瞭解。
以上分享就這些,寫的不好或不對的地方歡迎指正。
轉載請註明出處