.NetCore使用NETCore.MailKit發送郵件

前言

平時工作中很少用到需要發郵件的功能,所以郵件這塊的功能也沒有太過關注。近期有一個項目需要接收用戶的反饋,上邊決定使用郵件,直接將反饋信息發送給領導,也就有了這篇文章。實現發郵件不難,但是開發中遇到了一個問題,就是本地測試都是好好的,結果部署到阿里雲服務器後,郵件總是發送失敗,經過一番的折騰終於找到了問題,特此記錄。

一、安裝需要的類庫

我這邊使用的 .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端口發送郵件。

如果您覺得這篇文章有幫助到你,歡迎推薦,也歡迎關注我的公衆號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章