当前位置: 棋牌电玩游戏平台 > 游戏平台 > 正文

JavaMail入门第二篇 创建邮件

时间:2019-08-05 21:21来源:游戏平台
   发起的.NETCore开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数

   发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人说是用武汉话说“闹眼子”),.NET社区不是没有乐于共享知识的人,只是没有一个完整和良好的生态环境,总之希望国内的.NET发展越来越强大。我在这里想到一句话“我们希望自己可以做巨浪,但我们也甘愿做巨浪来袭前的小浪”。

JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类javax.mail.internet.MimeMessage类来创建Message类的实例对象,如果我们创建的是一个简单文本邮件,那么MimeMessage类就可以满足我们的需求了,但是如果需要创建一封包含内嵌资源或者是带附件的复杂邮件,则需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。

JavaMail入门第二篇 创建邮件,javamail第二篇

JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类javax.mail.internet.MimeMessage类来创建Message类的实例对象,如果我们创建的是一个简单文本邮件,那么MimeMessage类就可以满足我们的需求了,但是如果需要创建一封包含内嵌资源或者是带附件的复杂邮件,则需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。

1、MimeMessage类表示整封邮件

2、MimeBodyPart类表示邮件的一个MIME消息

3、MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

这三个类的工作关系如下图所示:

图片 1
虽然应用程序开发者在使用JavaMailAPI创建邮件内容时,通常只需要使用MimeMessage,MimeBodyPart和MimeMultipart这3个主要的类,但是了解他们的类继承关系也是必要的。下图列出了这三个类的继承关系以及常用方法。
图片 2

下面用javax.mail.internet.MimeMessage类来创建一封简单的文本邮件,

 1 import java.util.Date;
 2 import java.util.Properties;
 3 import javax.mail.Message;
 4 import javax.mail.Session;
 5 import javax.mail.internet.InternetAddress;
 6 import javax.mail.internet.MimeMessage;
 7 import java.io.FileOutputStream;
 8 
 9 public class TextMessage {
10     public static void main(String[] args) throws Exception {
11         String from = "[email protected]";
12         String to = "[email protected]";
13         String subject = "test";
14         String body = "test!!!";
15 
16         // 创建Session实例对象
17         Session session = Session.getDefaultInstance(new Properties());
18         // 创建MimeMessage实例对象
19         MimeMessage msg = new MimeMessage(session);
20         // 设置发件人
21         msg.setFrom(new InternetAddress(from));
22         // 设置收件人
23         msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
24         // 设置发送日期
25         msg.setSentDate(new Date());
26         // 设置邮件主题
27         msg.setSubject(subject);
28         // 设置纯文本内容的邮件正文
29         msg.setText(body);
30         // 保存并生成最终的邮件内容
31         msg.saveChanges();
32         // 把MimeMessage对象中的内容写入到文件中
33         msg.writeTo(new FileOutputStream("c:\test.eml"));
34     }
35 }

我们用邮件客户端(这里用foxmail)打开C盘下面的test.eml文件,可以看到如下信息,说明我们的邮件创建成功。

图片 3

下面简单解释一下上面出现的一些类

1、MimeMessage类:上面介绍过MimeMessage是Message类的一个具体实现类,用来创建Message类的实例对象,这里构造函数传入了一个Session对象作为参数;

2、Session类:该对象用于收集客户端与邮件服务器之间的网络连接信息和定义整个邮件程序所需的环境信息,这些信息作为Session对象的属性保存在Session对象中,Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息,由于Session类的构造方法是私有的,所以我们使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象;

3、Properties类:该类表示了一个持久的属性集,用于存放相关键值对信息作为参数来创建Session对象,这里构造了一个空的集合作为参数;

4、InternetAddress类:该类是抽象类Address类的一个子类,用来创建一个邮件地址;

5、RecipientType类:该类是Message类的一个内部类,该类有3个静态变量,TO表示收件人,CC表示抄送人(收件人知道抄送的人),BCC表示密送人(收件人不知道密送的人)。

 

上面的邮件只是包含了简单的文本,有时候我们需要使用HTML文件来丰富我们的邮件正文,例如使用HTML标签来对邮件正文进行排版,使用HTML标签在邮件正文中引入一些图片或者是声音等。下面这段代码创建了一个包含HTML格式的邮件

 1 import java.util.Date;
 2 import java.util.Properties;
 3 import javax.mail.Message;
 4 import javax.mail.Session;
 5 import javax.mail.internet.InternetAddress;
 6 import javax.mail.internet.MimeMessage;
 7 import java.io.FileOutputStream;
 8 
 9 public class HtmlMessage {
10     public static void main(String[] args) throws Exception {
11         String from = "[email protected]";
12         String to = "[email protected]";
13         String subject = "test";
14         String body = "<h4>欢迎大家阅读此邮件</h4>";
15         // 创建Session实例对象
16         Session session = Session.getDefaultInstance(new Properties());
17         // 创建MimeMessage实例对象
18         MimeMessage msg = new MimeMessage(session);
19         // 设置发件人
20         msg.setFrom(new InternetAddress(from));
21         // 设置收件人
22         msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
23         // 设置发送日期
24         msg.setSentDate(new Date());
25         // 设置邮件主题
26         msg.setSubject(subject);
27         // 设置HTML格式的邮件正文
28         msg.setContent(body, "text/html;charset=gb2312");
29         // 保存并生成最终的邮件内容
30         msg.saveChanges();
31         // 把MimeMessage对象中的内容写入到文件中
32         msg.writeTo(new FileOutputStream("c:\test.eml"));
33     }
34 }

我们再用foxmail打开test.eml,显示如下

图片 4

与之前代码不同的地方只是我们设置邮件内容的时候用setContent方法代替了setText方法,并且指定了邮件正文的MIME类型为text/html。

 

现在我们学会了创建含有HTML标签的邮件了,不过有时我们可能需要在邮件中插入一些图片来更直观的表达我们的意思,那么这时候我们就需要用到MimeMultipart类与MimeBodyPart类了

 1 import java.io.FileOutputStream;
 2 import java.util.Properties;
 3 import javax.activation.DataHandler;
 4 import javax.activation.FileDataSource;
 5 import javax.mail.Message;
 6 import javax.mail.Session;
 7 import javax.mail.internet.InternetAddress;
 8 import javax.mail.internet.MimeBodyPart;
 9 import javax.mail.internet.MimeMessage;
10 import javax.mail.internet.MimeMultipart;
11 
12 public class PictureMessage {
13     public static void main(String[] args) throws Exception {
14         String from = "[email protected]";// 发件人地址
15         String to = "[email protected]"; // 收件人地址
16         String subject = "HTML邮件";
17         String body = "<a href=http://www.cnblogs.com>"   "欢迎大家访问博客园</a></br>"
18                   "<img src="c:\dog.jpg">";
19 
20         Session session = Session.getDefaultInstance(new Properties());
21         // 创建MimeMessage对象,并设置各种邮件头字段
22         MimeMessage message = new MimeMessage(session);
23         message.setFrom(new InternetAddress(from));
24         message.setRecipients(Message.RecipientType.TO,
25                 InternetAddress.parse(to));
26         message.setSubject(subject);
27 
28         // 创建一个子类型为"related"的MimeMultipart对象。
29         MimeMultipart multipart = new MimeMultipart("related");
30 
31         /*
32          * 创建一个表示HTML正文的MimeBodyPart对象, 并将它加入到前面创建的MimeMultipart对象中
33          */
34         MimeBodyPart htmlBodyPart = new MimeBodyPart();
35         htmlBodyPart.setContent(body, "text/html;charset=gb2312");
36         multipart.addBodyPart(htmlBodyPart);
37 
38         /*
39          * 创建一个表示图片内容的MimeBodyPart对象, 并将它加入到前面创建的MimeMultipart对象中
40          */
41         MimeBodyPart gifBodyPart = new MimeBodyPart();
42         FileDataSource fds = new FileDataSource("c:\dog.jpg");
43         gifBodyPart.setFileName(fds.getName());
44         gifBodyPart.setDataHandler(new DataHandler(fds));
45         multipart.addBodyPart(gifBodyPart);
46 
47         /*
48          * 将MimeMultipart对象设置为整个邮件的内容, 要注意调用saveChanges方法进行更新
49          */
50         message.setContent(multipart);
51         message.saveChanges();
52 
53         // 把MimeMessage对象中的内容写入到文件中
54         message.writeTo(new FileOutputStream("c:\PictureMessage.eml"));
55     }
56 }

代码看起来似乎有点小复杂,可以再看看上面提到的MimeMessage,MimeMultipart与MimeBodyPart这三个类之间的关系图,这样会更会容易理解上面的代码,我们打开PictureMessage.eml,看到如下信息,说明我们成功的创建了一个带有图片的邮件了,并且该图片以附件的形式包含在邮件中了

图片 5

MimeMultipart有两种构造函数,

1 public MimeMultipart()
2 public MimeMultipart(String subtype)

第一种是无参数的,其默认的实例对象的MIME类型为mixed,第二种制定一个类型来创建MimeMultipart类的实例对象,其有三种常用的类型:mixed,related,alternative,这三种类型在MIME中的组合关系如下所示:

图片 6

现在我们用上面所示的这种组合关系来创建一封带有附件,并且正文中带有内嵌资源的邮件

 1 import java.io.FileOutputStream;
 2 import java.util.Properties;
 3 import javax.activation.DataHandler;
 4 import javax.activation.FileDataSource;
 5 import javax.mail.Message;
 6 import javax.mail.Session;
 7 import javax.mail.internet.InternetAddress;
 8 import javax.mail.internet.MimeBodyPart;
 9 import javax.mail.internet.MimeMessage;
10 import javax.mail.internet.MimeMultipart;
11 
12 public class ComplexMessage {
13     public static void main(String[] args) throws Exception {
14         Session session = Session.getDefaultInstance(new Properties());
15         MimeMessage message = createMessage(session);
16         message.writeTo(new FileOutputStream("c:\ComplexMessage.eml"));
17     }
18 
19     public static MimeMessage createMessage(Session session) throws Exception {
20         String from = "[email protected]";// 发件人地址
21         String to = "[email protected]"; // 收件人地址
22         String subject = "HTML邮件"; // 邮件主题
23         String body = "<a href=http://www.cnblogs.com>"   "欢迎大家访问博客园</a></br>"
24                   "<img src="c:\dog.jpg">";
25 
26         MimeMessage message = new MimeMessage(session);
27         message.setFrom(new InternetAddress(from));
28         message.setRecipients(Message.RecipientType.TO,
29                 InternetAddress.parse(to));
30         message.setSubject(subject);
31 
32         // 创建代表邮件正文和附件的各个MimeBodyPart对象
33         MimeBodyPart contentPart = createContent(body, "c:\dog.jpg");
34         // 下面的附件可以是视频或者是音频
35         MimeBodyPart attachPart1 = createAttachment("c:\音乐.MP3");
36         MimeBodyPart attachPart2 = createAttachment("c:\视频.avi");
37 
38         // 创建用于组合邮件正文和附件的MimeMultipart对象
39         MimeMultipart allMultipart = new MimeMultipart("mixed");
40         allMultipart.addBodyPart(contentPart);
41         allMultipart.addBodyPart(attachPart1);
42         allMultipart.addBodyPart(attachPart2);
43 
44         // 设置整个邮件内容为最终组合出的MimeMultipart对象
45         message.setContent(allMultipart);
46         message.saveChanges();
47         return message;
48     }
49 
50     public static MimeBodyPart createContent(String body, String filename)
51             throws Exception {
52         /*
53          * 创建代表组合MIME消息的MimeMultipart对象, 和将该MimeMultipart对象保存到的MimeBodyPart对象
54          */
55         MimeBodyPart contentPart = new MimeBodyPart();
56         MimeMultipart contentMultipart = new MimeMultipart("related");
57 
58         /*
59          * 创建用于保存HTML正文的MimeBodyPart对象, 并将它保存到MimeMultipart中
60          */
61         MimeBodyPart htmlBodyPart = new MimeBodyPart();
62         htmlBodyPart.setContent(body, "text/html;charset=gb2312");
63         contentMultipart.addBodyPart(htmlBodyPart);
64 
65         /*
66          * 创建用于保存图片的MimeBodyPart对象, 并将它保存到MimeMultipart中
67          */
68         MimeBodyPart gifBodyPart = new MimeBodyPart();
69         FileDataSource fds = new FileDataSource(filename);
70         gifBodyPart.setDataHandler(new DataHandler(fds));
71         contentMultipart.addBodyPart(gifBodyPart);
72 
73         // 将MimeMultipart对象保存到MimeBodyPart对象中
74         contentPart.setContent(contentMultipart);
75         return contentPart;
76     }
77 
78     public static MimeBodyPart createAttachment(String filename)
79             throws Exception {
80         // 创建保存附件的MimeBodyPart对象,并加入附件内容和相应信息
81         MimeBodyPart attachPart = new MimeBodyPart();
82         FileDataSource fds = new FileDataSource(filename);
83         attachPart.setDataHandler(new DataHandler(fds));
84         attachPart.setFileName(fds.getName());
85         return attachPart;
86     }
87 }

打开ComplexMessage.eml文件,可以看到如下内容,

图片 7

现在我们学会了如何创建一封纯文本的邮件,带有HTML格式的邮件,以及带有内嵌图片与附件的邮件了,下一篇将介绍如何发送邮件。

创建邮件,javamail第二篇 JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类...

   上面扯淡完毕(我这人干正事前,都要将一些扯淡的话,这个习惯改不掉了...)

1、MimeMessage类表示整封邮件

   项目中为了及时的通信,有直接发数据到页面,也有利用短信通知,也有我门今天介绍的邮件组件。我们今天的主要任务就是讲解一下有一个.NET的免费开源的邮件组件MailKit。本文将一如既往的结合实例和组件底层代码讲解一下相关组件的知识。(项目招人的时候,我都会问一下.NET的底层原理,有一个大神问我这样有什么意义吗?我们也写不出.NET底层那样的优秀处理方式,为何取了解这些,其实我个人觉得,问底层的原理,只是向为了跟好的处理一些程序出现的问题,以及对程序编码的时候,选择最合适的方式提升性能,任何一种方式都有优势和劣势,.NET的类库代码也是如此,如果我们知道.NET的底层实现,我们在项目的需求实现时,可以根据.NET底层实现,选择合适的方式,以求性能最优)。

2、MimeBodyPart类表示邮件的一个MIME消息

一.Mailkit组件概述

   项目中使用Email的操作机会比较多,一般稍微大一点的项目,都会使用到邮件操作这一个操作。对于.NET邮件操作的组件和方式比较多,今天我们就介绍一款邮件操作的组件MailKit,这个邮件组件是一个开源免费的,我们现在就来了解一下这一个组件的特点。MimeKit旨在通过尽可能接近地遵循MIME规范来解决这个问题,同时还为程序员提供了一个非常容易使用的高级API。

   组件的支持的客户端类型比较多,例如SMTP客户端、POP3客户端、IMAP客户端。该组件是一个跨平台的Email组件,该组件支持.NET 4.0,.NET 4.5,Xamarin.Android,Xamarin.iOS,Windows Phone 8.1等等平台。该组件提供了一个MIME解析器,组件具备的解析特性灵活、性能高、很好的处理各种各样的破碎的MIME格式化。MimeKit的性能实际上与GMime相当。

   该组件在安全性的还是比较高的,处理安全的方式较多,SASL认证、支持S / MIME v3.2、支持OpenPGP、支持DKIM签名等等方式。Mailkit组件可以通过CancellationToken取消对应的操作,CancellationToken传播应取消操作的通知,一个的CancellationToken使线程,线程池工作项目之间,或取消合作任务的对象。过实例化CancellationTokenSource对象来创建取消令牌,该对象管理从其CancellationTokenSource.Token属性检索的取消令牌。然后,将取消令牌传递到应该收到取消通知的任意数量的线程,任务或操作。令牌不能用于启动取消。

  MailKit组件支持异步操作,在内部编写的有关I/O异步操作的类。

3、MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

二.MailKit实例:

    上面介绍了MailKit组件的背景和特点,这里就介绍一下Email组件的简单应用。

这三个类的工作关系如下图所示:

  1.创建邮件方式:

 public void SentEmail(string path)
        {
            var message = new MimeMessage();
            //获取From标头中的地址列表,添加指定的地址
            message.From.Add(new MailboxAddress("Joey", "joey@friends.com"));
            //获取To头中的地址列表,添加指定的地址
            message.To.Add(new MailboxAddress("Alice", "alice@wonderland.com"));
            //获取或设置消息的主题
            message.Subject = "How you doin?";
            // 创建我们的消息文本,就像以前一样(除了不设置为message.Body)
            var body = new TextPart("plain")
            {
                Text = @"Hey Alice-- Joey"
            };
            // 为位于路径的文件创建图像附件
            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)
            };
            // 现在创建multipart / mixed容器来保存消息文本和图像附件
            var multipart = new Multipart("mixed")
            {
                body, attachment
            };
            // 现在将multipart / mixed设置为消息正文 
            message.Body = multipart;
        }

   调用该组件发送邮件和为邮件添加附件是比较简单的,第一步是实例化MimeMessage对象,对于该对象的解析将在下面进行,得到MimeMessage对象后,指定邮件的地址和主题等等相关信息。第二步实例化TextPart对象,为对象设定文本信息。若需要问邮件创建文件的附件,可以使用MimePart对象,包含内容(如消息正文文本或)的叶节点MIME部分一个附件。第四步为创建的邮件主体和文本以及附件信息后,可以创建Multipart对象,创建邮件容器,用来装载文本信息和附件。最后调用MimeMessage.body属性获取或设置消息的正文。

图片 8
虽然应用程序开发者在使用JavaMailAPI创建邮件内容时,通常只需要使用MimeMessage,MimeBodyPart和MimeMultipart这3个主要的类,但是了解他们的类继承关系也是必要的。下图列出了这三个类的继承关系以及常用方法。
图片 9

    2.邮件信息的解析:

var message = MimeMessage.Load(stream);

   邮件的信息我们需要进行对应的解析,这里我们使用MimeMessage的Load方法,该方法从指定的流加载MimeKit.MimeMessage。另一个加载数据的方式,可以使用MimeParser类,这里就不再解析了。

下面用javax.mail.internet.MimeMessage类来创建一封简单的文本邮件,

    3.邮件的接收:

   public static void HandleMimeEntity(MimeEntity entity)
        {
            //MimeEntity转化为Multipart实体
            var multipart = entity as Multipart;
            if (multipart != null)
            {
                for (int i = 0; i < multipart.Count; i  )
                    HandleMimeEntity(multipart[i]);
                return;
            }
            var rfc822 = entity as MessagePart;

            if (rfc822 != null)
            {
                var message = rfc822.Message;
                HandleMimeEntity(message.Body);
                return;
            }
            var part = (MimePart)entity;
        }

   以上是对接收到的消息的一个遍历,采用递归遍历MIME结构。MIME是内容的树结构,很像一个文件系统。MIME确实定义了一组通用规则,用于邮件客户端如何解释MIME部分的树结构。的 内容处置头是为了给接收客户端提供提示以哪些部分是为了显示作为消息体的一部分,并且意在被解释为附件。另外两种方式这离就不做介绍了。

 1 import java.util.Date;
 2 import java.util.Properties;
 3 import javax.mail.Message;
 4 import javax.mail.Session;
 5 import javax.mail.internet.InternetAddress;
 6 import javax.mail.internet.MimeMessage;
 7 import java.io.FileOutputStream;
 8 
 9 public class TextMessage {
10     public static void main(String[] args) throws Exception {
11         String from = "123456@qq.com";
12         String to = "123456@163.com";
13         String subject = "test";
14         String body = "test!!!";
15 
16         // 创建Session实例对象
17         Session session = Session.getDefaultInstance(new Properties());
18         // 创建MimeMessage实例对象
19         MimeMessage msg = new MimeMessage(session);
20         // 设置发件人
21         msg.setFrom(new InternetAddress(from));
22         // 设置收件人
23         msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
24         // 设置发送日期
25         msg.setSentDate(new Date());
26         // 设置邮件主题
27         msg.setSubject(subject);
28         // 设置纯文本内容的邮件正文
29         msg.setText(body);
30         // 保存并生成最终的邮件内容
31         msg.saveChanges();
32         // 把MimeMessage对象中的内容写入到文件中
33         msg.writeTo(new FileOutputStream("c:\test.eml"));
34     }
35 }

三.MailKit核心对象解析

   上面介绍了Email的基本操作就不做过多的介绍,在使用该组件时,较为的简单。这里就来看看该组件的类型结构和一些核心对象。类库结构有如下图:

图片 10

我们用邮件客户端(这里用foxmail)打开C盘下面的test.eml文件,可以看到如下信息,说明我们的邮件创建成功。

    1.MimeMessage.Load():

public static MimeMessage Load (ParserOptions options, Stream stream, bool persistent, 
                                CancellationToken cancellationToken = default (CancellationToken))
        {
            if (options == null)
                throw new ArgumentNullException (nameof (options));

            if (stream == null)
                throw new ArgumentNullException (nameof (stream));

            var parser = new MimeParser (options, stream, MimeFormat.Entity, persistent);

            return parser.ParseMessage (cancellationToken);
        }

     该方法从指定的流加载MimeMessage,具有6个方法重载。该方法返回一个MimeMessage对象,有源码可以看出,在该方法内部创建了一个MimeParser对象,MimeParser包含内容(例如邮件正文文本或附件)的叶节点MIME部分。调用ParseMessage方法,解析来自流的消息。

   2.TextPart.Text:

public string Text {
            get {
                if (ContentObject == null)
                    return string.Empty;
                var charset = ContentType.Parameters["charset"];
                using (var memory = new MemoryStream ()) {
                    ContentObject.DecodeTo (memory);
                    var content = memory.ToArray ();
                    Encoding encoding = null;
                    if (charset != null) {
                        try {
                            encoding = CharsetUtils.GetEncoding (charset);
                        } catch (NotSupportedException) {
                        }
                    }
                    if (encoding == null) {
                        try {
                            return CharsetUtils.UTF8.GetString (content, 0, (int) memory.Length);
                        } catch (DecoderFallbackException) {
                            encoding = CharsetUtils.Latin1;
                        }
                    }
                    return encoding.GetString (content, 0, (int) memory.Length);
                }
            }
            set {
                SetText (Encoding.UTF8, value);
            }
        }

    该属性获取解码的文本内容。该属性是一个可读可写的属性。ContentType.Parameters["charset"]用于获取charset参数的值。该方法用来将参数的值设置为数据流并设置对应的编码。看到这里的异常处理结构,就想简单的谈几句,.NET的异常比较的薄弱,很多时候在写.NET的异常时就更加的简单,以上是对异常知识捕获,有些地方并没有做处理,有些地方是对异常的地方进行恢复。

图片 11

   3.MimeEntity.WriteTo():

public virtual void WriteTo (FormatOptions options, Stream stream, bool contentOnly, 
                            CancellationToken cancellationToken = default (CancellationToken))
        {
            if (options == null)
                throw new ArgumentNullException (nameof (options));

            if (stream == null)
                throw new ArgumentNullException (nameof (stream));

            if (!contentOnly)
                Headers.WriteTo (options, stream, cancellationToken);
        }

    该方法将MimeEntity写入到指定的数据流中,该方法接受参数options格式选项。stream输出数据流,contentOnly判断是否可写。该方法定义为虚方法,在继承此方法后,可以在子类种对该方法进行重写。

下面简单解释一下上面出现的一些类

四.总结

   本人觉得在项目开发中,如果引入了第三方组件,我们尽量引入组件的源码,这样我们对整个组件的结构有一个认识,组件的实现方式我们也可以进行细致了解,尤其是我们在进行调试的事后更加有用,我们可以逐一的进行断点调试。以上是对该组件的一个简单介绍,有兴趣的可以去深入的了解和学习。

1、MimeMessage类:上面介绍过MimeMessage是Message类的一个具体实现类,用来创建Message类的实例对象,这里构造函数传入了一个Session对象作为参数;

编辑:游戏平台 本文来源:JavaMail入门第二篇 创建邮件

关键词: .NET技术 CLR C# MimeKit组件 Java