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


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

          到今天为止我一直以为,.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的所有平台,包括移动电话、平板等,希望大家在架构多一种方案,多一种选择。

  • 相关阅读:
    51nod1089(最长回文子串之manacher算法)
    51nod1088(最长回文子串)
    51nod1256(乘法逆元)
    51nod1085(01背包)
    51nod1079(中国剩余定理)
    数据的特征工程
    30种提高mysql处理速度的方法
    机器学习资料
    python3.6安装-windows
    python import sklearn出错 "ImportError: DLL load failed: 找不到指定的模块。
  • 原文地址:https://www.cnblogs.com/davidzhou/p/5352539.html
Copyright © 2020-2023  润新知