zoukankan      html  css  js  c++  java
  • MailKit---发送邮件

       一封最复杂的电子邮件的基本情况为:含有邮件正文和邮件附件,邮件正文可以同时使用HTML格式和普通文本格式表示,并且HTML格式的正文中又引用了其他的内嵌资源。对于这种最复杂的电子邮件,可以采用如图所示的MIME消息结构进行描述。

      一封MIME邮件中的MIME消息可以有三种组合关系:混合、关联、选择,它们对应MIME类型如下:

      1、multipart/mixed

      表示消息体中的内容是混和组合类型,内容可以是文本、声音和附件等不同邮件内容的混和体,例如上图中的整封邮件的MIME类型就必须定义为multipart/mixed。

      2、multipart/related

      表示消息体中的内容是关联(依赖)组合类型,例如图5中的邮件正文要使用HTML代码引用内嵌的图片资源,它们组合成的MIME消息的MIME类型就应该定义为multipart/related,表示其中某些资源(HTML代码)要引用(依赖)另外的资源(图像数据),引用资源与被引用的资源必须组合成multipart/related类型的MIME组合消息。

      3、multipart/alternative

      表示消息体中的内容是选择组合类型,例如一封邮件的邮件正文同时采用HTML格式和普通文本格式进行表达时,就可以将它们嵌套在一个multipart/alternative类型的MIME组合消息中。这种做法的好处在于如果邮件阅读程序不支持HTML格式时,可以采用其中的文本格式进行替代。邮件内容可以只带有一种格式,是可选类型(即邮件正文可以只是普通文本,也可以只是html格式)。

      下面就演示一下mailkit发送一封文本、html、内嵌图片,附件的邮件。mailkit提供了两种方式供我们选择:

      注意点:Imap协议本身不支持中文,需转成base64编码或"quoted-printable"编码编码。这里要再提出一个问题,如果我们要写一个中文的标题应该怎么写?你会说,改 subject 那里为"中文标题"就可以啦。如果我们这样做的话,确实对方可以收到一封中文的邮件。但我要说的是这样做是错误的。这是因为mailkit帮我们转了编码方式。

       方式一:

     1 var message = new MimeMessage();
     2             message.To.Add(new MailboxAddress("xxxx@126.com", "xxxx@126.com"));//收件人邮箱
     3             message.From.Add(new MailboxAddress("xxxx@163", "xxxx@163.com"));//发件人邮件
     4             message.Subject = "邮件测试主题2";
     5 
     6             var builder = new BodyBuilder();
     7             var image = builder.LinkedResources.Add(path);
     8             //组合消息中的内嵌资源指定一个唯一标识号
     9             image.ContentId = MimeUtils.GenerateMessageId();
    10 
    11             var plain = new TextPart("plain")
    12             {
    13                 Text = @"Hey AnLong[cid:" + image.ContentId + "]"
    14             };
    15             var html = new TextPart("html")
    16             {
    17                 Text = @"<p>Hey AnLong<br>
    18                         <p>Will you be my +1<br>
    19                         <center><img src=""cid:" + image.ContentId + @"""></center>"
    20             };
    21             
    22             // create an image attachment for the file located at path
    23             var attachment = new MimePart("image", "png")
    24             {
    25                 ContentObject = new ContentObject(File.OpenRead(path), ContentEncoding.Default),
    26                 //指定邮件阅读程序处理数据内容的方式,有inline和attachment两种标准方式,inline表示直接处理,而attachment表示当做附件处理。
    27                 ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
    28                 //指定MIME消息体中的内容所采用的邮件编码方式
    29                 ContentTransferEncoding = ContentEncoding.Base64,
    30                 //表示MIME消息体的内容为邮件附件,附件名
    31                 FileName = Path.GetFileName(path)
    32             };
    33 
    34             //表示消息体中的内容是选择组合类型
    35             var alternative = new Multipart("alternative");
    36             alternative.Add(plain);
    37             alternative.Add(html);
    38 
    39             //表示消息体中的内容是关联(依赖)组合类型
    40             var relatavenative = new Multipart("related");
    41             relatavenative.Add(alternative);
    42             relatavenative.Add(image);
    43 
    44             // now create the multipart/mixed container to hold the message text and the
    45             // image attachment
    46             var multipart = new Multipart("mixed");
    47             multipart.Add(relatavenative);
    48             multipart.Add(attachment);
    49             message.Body = multipart;
    50 
    51             
    52 
    53             using (var client = new MailKit.Net.Smtp.SmtpClient())
    54             {
    55                 client.Connect("smtp.163.com", 465, true);
    56 
    57                 // Note: since we don't have an OAuth2 token, disable
    58                 // the XOAUTH2 authentication mechanism.
    59                 client.AuthenticationMechanisms.Remove("XOAUTH2");
    60 
    61                 // Note: only needed if the SMTP server requires authentication
    62                 client.Authenticate("xxxx@163.com", "123456");
    63 
    64                 client.Send(message);
    65                 client.Disconnect(true);
    66             }

       方式二:

     1 var message = new MimeMessage();
     2             message.To.Add(new MailboxAddress("xxxx@126.com", "xxxx@126.com"));//收件人
     3             message.From.Add(new MailboxAddress("xxxx", "xxxx@163.com"));//发件人
     4             message.Subject = "邮件测试主题2";
     5 
     6             var builder = new BodyBuilder();
     7             var image = builder.LinkedResources.Add(path);
     8             image.ContentId = MimeUtils.GenerateMessageId();
     9 
    10             builder.TextBody = string.Format(@"[cid:{0}] Hey AnLong", image.ContentId);
    11             builder.HtmlBody = string.Format(@"<p>Hey anlong</p><p>Will you be my +1</p><center><img src=""cid:{0}""></center>", image.ContentId);
    12 
    13             // We may also want to attach a calendar event for Monica's party...
    14             builder.Attachments.Add(@"C:UsersJoeyDocumentsparty.ics");
    15 
    16             message.Body = builder.ToMessageBody();
    17 
    18             
    19 
    20             using (var client = new MailKit.Net.Smtp.SmtpClient())
    21             {
    22                 client.Connect("smtp.163.com", 465, true);
    23 
    24                 // Note: since we don't have an OAuth2 token, disable
    25                 // the XOAUTH2 authentication mechanism.
    26                 client.AuthenticationMechanisms.Remove("XOAUTH2");
    27 
    28                 // Note: only needed if the SMTP server requires authentication
    29                 client.Authenticate("xxxx@163.com", "123456");
    30 
    31                 client.Send(message);
    32                 client.Disconnect(true);
    33             }

    通过上述方式组合成一封完整的邮件,然后发送即可。

  • 相关阅读:
    联想IdeaPad品牌出炉 三款笔记本亮相
    [推荐]2008年必不可少的20个网络产品
    微软公开.NET Base Classes源代码
    [共享一下]Head.First.设计模式.中文版
    IT: 蓝牙十岁了
    祝贺“阿来之家”博客正式开通~
    NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红
    NodeJS文件读取:感恩常在抓把糖果,愉悦客人
    NodeJS缓存机制:畅销货,就多囤一点呗
    安装pygame出现is not a supported wheel on this platform解决办法
  • 原文地址:https://www.cnblogs.com/zuimengaitianya/p/9227541.html
Copyright © 2011-2022 走看看