.NetCore使用NETCore.MailKit傳送郵件
阿新 • • 發佈:2022-03-31
前言
平時工作中很少用到需要發郵件的功能,所以郵件這塊的功能也沒有太過關注。近期有一個專案需要接收使用者的反饋,上邊決定使用郵件,直接將反饋資訊傳送給領導,也就有了這篇文章。實現發郵件不難,但是開發中遇到了一個問題,就是本地測試都是好好的,結果部署到阿里雲伺服器後,郵件總是傳送失敗,經過一番的折騰終於找到了問題,特此記錄。
一、安裝需要的類庫
我這邊使用的 .Net Core 3.1進行的開發,經過查詢最終決定使用 MailKit,這裡最終選擇了 NETCore.MailKit ,不為別的,時間緊任務重,這個實現起來最方便。
Install-Package NETCore.MailKit -Version 2.0.3
二、配置
配置 appsetting.json
以下示例使用的網易的163郵箱,在appsetting.json 中新增以下配置
"EmailOptions": { "SenderName": "系統郵件", //傳送者名稱,可在程式碼中重新替換 "FromAddress": "", //發件者郵箱 "ToAddress": "", //接收人郵箱 "Host": "smtp.163.com", //主機 "Port": 25, //埠 阿里雲預設25埠不開放,需要使用SSL的465埠 "UserName": "", //發件郵箱賬號 "Password": "" //發件郵箱密碼 }
新增 EmailOptions
針對上邊的配置,建立對應的類來實現配置檔案繫結。
public class EmailOptions { public string FromAddress { get; set; } public string ToAddress { get; set; } public string Host { get; set; } public string UserName { get; set; } public string Password { get; set; } }
配置 Startup
在 Startup的ConfigureServices方法中新增以下配置
//發郵件
services.Configure<EmailOptions>(Configuration.GetSection("EmailOptions"));
services.AddMailKit(optionBuilder =>
{
optionBuilder.UseMailKit(new MailKitOptions()
{
//get options from sercets.json
Server = Configuration.GetValue<string>("EmailOptions:Host"),
Port = Configuration.GetValue<int>("EmailOptions:Port"),
SenderName = Configuration.GetValue<string>("EmailOptions:SenderName"),
SenderEmail = Configuration.GetValue<string>("EmailOptions:FromAddress"),
// can be optional with no authentication
Account = Configuration.GetValue<string>("EmailOptions:UserName"),
Password = Configuration.GetValue<string>("EmailOptions:Password"),
// enable ssl or tls
Security = true
});
});
三、傳送郵件
將配置EmailOptions和 IEmailService 注入到需要使用的位置。如:
public class HomeController : Controller
{
private readonly EmailOptions options;
private readonly IEmailService _EmailService;
public HomeController(IOptions<EmailOptions> options, IEmailService emailService)
{
this.options = options.Value;
_EmailService = emailService;
}
[HttpPost]
public async Task<ActionResult> SendEmail(MyEntity entity)
{
//設定傳送人的郵件地址和名稱,在接收人接收到郵件提示時會顯示該資訊
var sendInfo = new SenderInfo
{
SenderEmail = options.FromAddress,
SenderName = "投訴",
};
await _EmailService.SendAsync(options.ToAddress, "投訴", "郵件內容", false, sender: sendInfo);
return Json(result);
}
}
遇到的問題
本地開發時使用的埠是25,本地測的好好的,但是當部署到阿里雲的時候,只要一執行發郵件的方法,就會超時,百思不得其解,後來得知阿里雲伺服器預設是禁止25埠的,解決方法就是改成465埠傳送郵件。
如果您覺得這篇文章有幫助到你,歡迎推薦,也歡迎關注我的公眾號。