邮件发送已经说烂了的功能

       我相信每一个系统,都会有邮件发送的场景,而且这种使用场景有很多,比如登入一个系统,忘记密码,那就要通过忘记密码功能,检查你注册邮件,然后发一封重设密码的邮件给你(当然现在可能通过手机验证码处理的方案多)。

      到今天为止我一直以为,.NET发送邮件组件有很多,我之前了解的有.Net 自带的System.Net.Mail,JMail,MimeKit&MailKit。

今天我用度娘搜索了一下“发送邮件 组件”,搜索结果大概汇总一下,.Net 自带的,CDO 组件,JMail 组件 就这三个。没有搜索到 MimeKit&MailKit,

但是单独搜“MailKit”能够搜索到,而且是大牛 张善友 写的,那我暂时先说一下 MimeKit&MailKit吧。

友情推荐一下 张善友 http://www.cnblogs.com/shanyou/p/4034298.html 

MimeKit&MailKit 外国开源邮件发送组件,其实是由两个组件组成

MimeKit 负责处理寄件者,消息,附件 等等内容相关的。

MimeKit 官网:http://www.mimekit.net/

MimeKit GitHub https://github.com/jstedfast/MimeKit

开发指南:http://www.mimekit.net/docs/html/Introduction.htm

MailKit 负责发送相关的。

MailKit GitHub:https://github.com/jstedfast/MailKit

贴几段代码让大家感受一下

MimeKit 部分

var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Joey", "joey@friends.com"));
message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com"));
message.Subject = "How you doin?";

message.Body = new TextPart ("plain") {
    Text = @"Hey Alice,

What are you up to this weekend? Monica is throwing one of her parties on
Saturday and I was hoping you could make it.

Will you be my +1?

-- Joey
"
};
var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Joey", "joey@friends.com"));
message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com"));
message.Subject = "How you doin?";

// create our message text, just like before (except don't set it as the message.Body)
var body = new TextPart ("plain") {
    Text = @"Hey Alice,

What are you up to this weekend? Monica is throwing one of her parties on
Saturday and I was hoping you could make it.

Will you be my +1?

-- Joey
"
};

// create an image attachment for the file located at path
var attachment = new MimePart ("image", "gif") {
    ContentObject = new ContentObject (File.OpenRead (path), ContentEncoding.Default),
    ContentDisposition = new ContentDisposition (ContentDisposition.Attachment),
    ContentTransferEncoding = ContentEncoding.Base64,
    FileName = Path.GetFileName (path)
};

// now create the multipart/mixed container to hold the message text and the
// image attachment
var multipart = new Multipart ("mixed");
multipart.Add (body);
multipart.Add (attachment);

// now set the multipart/mixed as the message body
message.Body = multipart;
   var message = new MimeMessage ();
            message.From.Add (new MailboxAddress ("Joey", "joey@friends.com"));
            message.To.Add (new MailboxAddress ("Alice", "alice@wonderland.com"));
            message.Subject = "How you doin?";

            var builder = new BodyBuilder ();

            // Set the plain-text version of the message text
            builder.TextBody = @"Hey Alice,

What are you up to this weekend? Monica is throwing one of her parties on
Saturday and I was hoping you could make it.

Will you be my +1?

-- Joey
";

            // In order to reference sexy-pose.jpg from the html text, we'll need to add it
            // to builder.LinkedResources and then use its Content-Id value in the img src.
            var image = builder.LinkedResources.Add (@"C:UsersJoeyDocumentsSelfiessexy-pose.jpg");
            image.ContentId = MimeUtils.GenerateMessageId ();

            // Set the html version of the message text
            builder.HtmlBody = string.Format (@"<p>Hey Alice,<br>
<p>What are you up to this weekend? Monica is throwing one of her parties on
Saturday and I was hoping you could make it.<br>
<p>Will you be my +1?<br>
<p>-- Joey<br>
<center><img src=""cid:{0}""></center>", image.ContentId);

            // We may also want to attach a calendar event for Monica's party...
            builder.Attachments.Add (@"C:UsersJoeyDocumentsparty.ics");

            // Now we just need to set the message body and we're done
            message.Body = builder.ToMessageBody ();

怎么样?是不是感觉老外写得东西,比较好看,易懂啊。

MailKit 部分

using System;

using MailKit.Net.Smtp;
using MailKit;
using MimeKit;

namespace TestClient {
    class Program
    {
        public static void Main (string[] args)
        {
            var message = new MimeMessage ();
            message.From.Add (new MailboxAddress ("Joey Tribbiani", "joey@friends.com"));
            message.To.Add (new MailboxAddress ("Mrs. Chanandler Bong", "chandler@friends.com"));
            message.Subject = "How you doin'?";

            message.Body = new TextPart ("plain") {
                Text = @"Hey Chandler,

I just wanted to let you know that Monica and I were going to go play some paintball, you in?

-- Joey"
            };

            using (var client = new SmtpClient ()) {
                client.Connect ("smtp.friends.com", 587, false);

                // Note: since we don't have an OAuth2 token, disable
                // the XOAUTH2 authentication mechanism.
                client.AuthenticationMechanisms.Remove ("XOAUTH2");

                // Note: only needed if the SMTP server requires authentication
                client.Authenticate ("joey", "password");

                client.Send (message);
                client.Disconnect (true);
            }
        }
    }
}

这个是不是感觉跟.Net 发送邮件部分差不多啊!

下面是我封装的.Net 发送邮件部分代码,做个对比

    public class Mail
    {
        
        private static SystemMailHostConfig _config;
        public static Mail SystemMail
        {
            get { return new Mail(); }
        }

        public Mail()
        {
            _config = new SystemMailHostConfig
            {
                FromName = MailConfig.SystemMailFromName,
                From = MailConfig.SystemMailFrom,
                MailHostConfig = new MailHostConfig
                {
                    HostName = MailConfig.SmtpHostName,
                    Account = MailConfig.MailAccount,
                    Password = MailConfig.MailPassword
                }
            };
        }

        public Mail(SystemMailHostConfig config)
        {
            _config = config;
        }

        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message">默认为null。 System.Net.Mail.MailMessage </param>
        public void Send(MailContext context, MailMessage message = null)
        {
            //ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
            var sender = new SmtpClient();
            message = message ?? new MailMessage();
            if (context.Receivers.IsNotNullOrEmpty())
            {
                message.To.AddRange(context.Receivers.ToArray());
            }
            if (context.Ccs.IsNotNullOrEmpty())
            {
                message.CC.AddRange(context.Ccs.ToArray());
            }
            if (context.Bccs.IsNotNullOrEmpty())
            {
                message.Bcc.AddRange(context.Bccs.ToArray());
            }
            message.Subject = context.Subject;
            message.Body = context.Body;

            if (context.Attachments.IsNotNullOrEmpty())
            {
                message.Attachments.AddRange(context.Attachments.ToArray());
            }
            message.IsBodyHtml = true;
            try
            {
                message.From = new MailAddress(_config.From, _config.FromName);
                sender.Port = 2620;
                sender.Host = _config.MailHostConfig.HostName;
                sender.UseDefaultCredentials = false;
                sender.Credentials = new NetworkCredential(_config.MailHostConfig.Account, _config.MailHostConfig.Password);
                sender.DeliveryMethod = SmtpDeliveryMethod.Network;
                sender.EnableSsl = true;
                sender.Send(message);
            }
            catch
            {
                _config = new SystemMailHostConfig
                {
                    FromName = MailConfig.StandbySystemMailFromName,
                    From = MailConfig.StandbySystemMailFrom,
                    MailHostConfig = new MailHostConfig
                    {
                        HostName = MailConfig.StandbySmtpHostName,
                        Account = MailConfig.StandbyMailAccount,
                        Password = MailConfig.StandbyMailPassword
                    }
                };
                message.From = new MailAddress(_config.From, _config.FromName);
                sender.Port = 587;
                sender.Host = _config.MailHostConfig.HostName;               
                sender.UseDefaultCredentials = false;
                sender.Credentials = new NetworkCredential(_config.MailHostConfig.Account, _config.MailHostConfig.Password);
                sender.DeliveryMethod = SmtpDeliveryMethod.Network;
                sender.EnableSsl = true;
                sender.Send(message);
            }
        }
    }

MimeKit 和 MailKit 支持最新的国际化的电子邮件标准,是.NET 中为一个支持完整支持这些标准电子邮件库,且它还支持.NET/Mono的所有平台,包括移动电话、平板等,希望大家在架构多一种方案,多一种选择。

原文地址:https://www.cnblogs.com/davidzhou/p/5352539.html