• .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端口发送邮件。

    如果您觉得这篇文章有帮助到你,欢迎推荐,也欢迎关注我的公众号。

  • 相关阅读:
    浏览器加载AMD标准的输出文件
    Mac安装brew && brew 安装yarn
    插件集
    vue-router复用组件时不刷新数据
    加入sass后运行项目报错:TypeError: this.getResolve is not a function
    安装cnpm后运行报cnpm : 无法加载文件 C:UsersyizonAppDataRoaming pmcnpm.ps1,因为在此系统上禁止运行脚本
    图片canvas跨域问题解决方案之一
    vscode配置
    搭建express服务
    项目初始化
  • 原文地址:https://www.cnblogs.com/imlxp/p/16080866.html
Copyright © 2020-2023  润新知