MailKit发送邮件

smtp发送邮件偶尔会遇到超时的情况,故换MailKit发送尝试。 

引用MailKit包时,注意版本需要支持当前Framework的版本


                using (var smtp = new MailKit.Net.Smtp.SmtpClient())
                {

                    MimeMessage mail = new MimeMessage();
                    //发送方
                    mail.From.Add(new MailboxAddress(request.From, request.From));
                    //接受方
                    mail.To.Add(new MailboxAddress(request.To, request.To));
                    //标题
                    mail.Subject = request.Subject;
                    //抄送邮箱
                    if (request.CC != null && request.CC.Length > 0)
                    {
                        foreach (var c in request.CC)
                        {
                            mail.Cc.Add(new MailboxAddress(c));
                        }
                    }
                    //密件抄送邮箱
                    if (request.BCC != null && request.BCC.Length > 0)
                    {
                        foreach (var c in request.BCC)
                        {
                            mail.Bcc.Add(new MailboxAddress(c));
                        }
                    }

                    var multipart = new Multipart("mixed");
                    //内容
                    if (!string.IsNullOrEmpty(request.HtmlBody))
                    {
                        var Html = new TextPart(MimeKit.Text.TextFormat.Html)
                        {
                            Text = request.HtmlBody
                        };
                        multipart.Add(Html);
                    }
                    //附件
                    if (request.Attachments != null)
                    {
                        foreach (var attachment in request.Attachments)
                        {
                            if ((!string.IsNullOrEmpty(attachment.MediaType) && attachment.MediaType == MediaTypeNames.Application.Zip) || attachment.FileName.EndsWith(".zip"))
                            {
                                var attimg = new MimePart(MediaTypeNames.Application.Zip)
                                {
                                    ContentObject = new ContentObject(new MemoryStream(attachment.FileData), ContentEncoding.Default),
                                    ContentDisposition = new MimeKit.ContentDisposition(MimeKit.ContentDisposition.Attachment),
                                    ContentTransferEncoding = ContentEncoding.Base64,
                                    FileName = attachment.FileName,
                                    IsAttachment = true,
                                };
                                multipart.Add(attimg);
                            }
                            else if ((!string.IsNullOrEmpty(attachment.MediaType) && attachment.MediaType == MediaTypeNames.Application.Pdf) || attachment.FileName.EndsWith(".pdf"))
                            {
                                var attimg = new MimePart(MediaTypeNames.Application.Pdf)
                                {
                                    ContentObject = new ContentObject(new MemoryStream(attachment.FileData), ContentEncoding.Default),
                                    ContentDisposition = new MimeKit.ContentDisposition(MimeKit.ContentDisposition.Attachment),
                                    ContentTransferEncoding = ContentEncoding.Base64,
                                    FileName = attachment.FileName,
                                    IsAttachment = true,
                                };
                                multipart.Add(attimg);
                            }
                            else
                            {
                                var attimg = new MimePart()
                                {
                                    ContentObject = new ContentObject(new MemoryStream(attachment.FileData), ContentEncoding.Default),
                                    ContentDisposition = new MimeKit.ContentDisposition(MimeKit.ContentDisposition.Attachment),
                                    ContentTransferEncoding = ContentEncoding.Base64,
                                    FileName = attachment.FileName,
                                    IsAttachment = true,
                                };
                                multipart.Add(attimg);
                            }
                        }
                    }
                    mail.Body = multipart;

                    smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
                    //连接邮箱服务器
                    smtp.Connect(request.SmtpServer ?? smtpServer, request.Port, request.EnableSsl);
                    //登录认证
                    if (!string.IsNullOrWhiteSpace(request.FromUserId))
                    {
                        smtp.Authenticate(request.FromUserId, request.PasswordOfFrom); //一些邮件服务器除发送人邮箱外需要发送人Id验证
                    }
                    else
                    {
                        smtp.Authenticate(request.From, request.PasswordOfFrom);
                    }

                    smtp.Timeout = 600000;
                    Yahee.Logging.Log4net.LoggerManager.ErrorLog.Error("SendEmailService begin: " + request.Subject);
                    smtp.Send(mail);
                    smtp.Disconnect(true);
                }

    /// <summary>
    /// 邮寄发送接口参数类
    /// </summary>
    public class SendEmailRequest
    {
        /// <summary>
        /// 发送人邮箱
        /// </summary>
        public string From
        {
            get;
            set;
        }

        /// <summary>
        /// 发送人Id(一些邮件服务器除发送人邮箱外需要发送人Id验证)
        /// </summary>
        public string FromUserId
        {
            get;
            set;
        }
        
        /// <summary>
        /// 密码明文
        /// 空值。使用admin@yahee.com.cn发送邮件,
        /// 非空值,使用发送人邮箱发送邮件
        /// </summary>
        public string PasswordOfFrom
        {
            get;
            set;
        }

        /// <summary>
        /// 收件邮箱
        /// </summary>
        public string To
        {
            get;
            set;
        }

        /// <summary>
        /// 抄送邮箱集合
        /// </summary>
        public string[] CC
        {
            get;
            set;
        }

        /// <summary>
        /// 密送邮箱集合
        /// </summary>
        public string[] BCC
        {
            get;
            set;
        }
        /// <summary>
        /// 主题
        /// </summary>
        public string Subject
        {
            get;
            set;
        }
        /// <summary>
        /// 带html的内容
        /// </summary>
        public string HtmlBody
        {
            get;
            set;
        }

        /// <summary>
        /// 需要附加的附件集合
        /// </summary>
        public FileAttachment[] Attachments
        {
            get;
            set;
        }

        /// <summary>
        /// 是否新增发送记录
        /// </summary>
        private bool _isInsertSendEmail = true;
        public bool IsInsertSendEmail
        {
            set
            {
                _isInsertSendEmail = value;
            }
            get
            {
                return _isInsertSendEmail;
            }
        }

        /// <summary>
        /// 邮件服务器
        /// //必须和密码同步
        /// </summary>
        public string SmtpServer
        {
            get;
            set;
        }

        /// <summary>
        /// 发送端口
        /// </summary>
        public int Port
        {
            get;
            set;
        }

        /// <summary>
        /// 是否需要SSL验证
        /// </summary>
        public bool EnableSsl
        {
            get;
            set;
        }

        /// <summary>
        /// 是否需要身份验证
        /// </summary>
        public bool IsSendAuth
        {
            get;
            set;
        }
    }


    public class FileAttachment
    {
        /// <summary>
        /// 附件在邮件中的名称
        /// </summary>
        public string FileName
        {
            get;
            set;
        }

        /// <summary>
        /// 文件内容
        /// </summary>
        public byte[] FileData
        {
            get;
            set;
        }

        /// <summary>
        /// 附件类型
        /// </summary>
        /// <see cref="System.Net.Mime.MediaTypeNames"/>
        public string MediaType
        {
            get;
            set;
        }
    }
附件添加

            string fileAttachmentPath2 = @"E:\software\XXX.zip";
            FileAttachment attachment2 = new FileAttachment();
            attachment2.FileName = "XXX.zip";
            attachment2.FileData = System.IO.File.ReadAllBytes(fileAttachmentPath2);
            attachment2.MediaType = System.Net.Mime.MediaTypeNames.Application.Zip;
            allAttachments.Add(attachment2);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Asp.Net Core 中使用 MailKit 发送邮件需要以下步骤: 1. 安装 MailKit:在 Visual Studio 中,右键单击项目,选择“管理 NuGet 包”,搜索 MailKit 并安装。 2. 在 appsettings.json 文件中配置 SMTP 服务器信息: ``` "SmtpSettings": { "Host": "smtp.example.com", "Port": 587, "Username": "your_username", "Password": "your_password" } ``` 3. 创建一个邮件服务类,例如: ``` using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.Extensions.Options; using MimeKit; using System.Threading.Tasks; public class EmailService : IEmailService { private readonly SmtpSettings _smtpSettings; public EmailService(IOptions<SmtpSettings> smtpSettings) { _smtpSettings = smtpSettings.Value; } public async Task SendEmailAsync(string toEmail, string subject, string message) { var email = new MimeMessage(); email.From.Add(new MailboxAddress(_smtpSettings.SenderName, _smtpSettings.SenderEmail)); email.To.Add(new MailboxAddress(toEmail)); email.Subject = subject; var builder = new BodyBuilder(); builder.HtmlBody = message; email.Body = builder.ToMessageBody(); using (var smtp = new SmtpClient()) { await smtp.ConnectAsync(_smtpSettings.Host, _smtpSettings.Port, SecureSocketOptions.StartTls); await smtp.AuthenticateAsync(_smtpSettings.Username, _smtpSettings.Password); await smtp.SendAsync(email); await smtp.DisconnectAsync(true); } } } ``` 4. 在 Startup.cs 文件的 ConfigureServices 方法中注册服务: ``` services.Configure<SmtpSettings>(Configuration.GetSection("SmtpSettings")); services.AddTransient<IEmailService, EmailService>(); ``` 5. 在需要发送邮件的地方注入 IEmailService 并调用 SendEmailAsync 方法即可发送邮件。 ``` public class HomeController : Controller { private readonly IEmailService _emailService; public HomeController(IEmailService emailService) { _emailService = emailService; } public IActionResult Index() { return View(); } public async Task<IActionResult> SendEmail(string email) { await _emailService.SendEmailAsync(email, "测试邮件", "这是一封测试邮件。"); return RedirectToAction("Index"); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值