mailkit库收发邮件

时间:2022-08-21 19:02:57

mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库

环境  W10 / VS2017CMMT / MailKit version="2.0.3" "net46"  / MimeKit version="2.0.3" "net46"

mailkit使用nuget下载或者到GIT  https://github.com/jstedfast/MailKit


 

邮件收发是与邮件服务器交互,原理参考 https://www.cnblogs.com/ysocean/p/7652934.html

帮助类参考部份mailkit源码.可简单实现发邮件与收邮件.在处理大附件,草稿保存,时未找到解决办法


  1  public class MyMailKit
  2     {
  3         #region 属性 账户配置信息等
  4         /// <summary>
  5         ///  发件人邮箱地址
  6         /// </summary>
  7         private string fromEmail = null;
  8         /// <summary>
  9         ///  发件人别名
 10         /// </summary>
 11         private string fromAlias = null;
 12         /// <summary>
 13         /// 发件人邮箱密码(或授权码)
 14         /// </summary>
 15         private string fromPwd = null;
 16         /// <summary>
 17         /// SMTP服务器地址
 18         /// </summary>
 19         private string serverSMTP = null;
 20         private int portSMTP = 0;
 21         /// <summary>
 22         /// IMAP服务器地址
 23         /// </summary>
 24         private string serverIMAP = null;
 25         private int portIMAP = 0;
 26         /// <summary>
 27         /// POP服务器地址
 28         /// </summary>
 29         private string serverPOP = null;
 30         private int portPOP = 0;
 31         /// <summary>
 32         /// 邮件账户(收邮件时登录账户)
 33         /// </summary>
 34         private string account = null;
 35         /// <summary>
 36         /// 邮件账户密码(收邮件时登录密码)
 37         /// </summary>
 38         private string pwd = null;
 39         #endregion
 40 
 41         #region 属性 邮件主体内容 内容块容器
 42 
 43         /// <summary>
 44         /// 邮件对象
 45         /// </summary>
 46         private MimeMessage message = null;
 47         /// <summary>
 48         /// 邮件内容块的容器 放置邮件正文,附件等内容块
 49         /// </summary>
 50         private Multipart mimeparts = null;
 51         /// <summary>
 52         /// 收件人列表
 53         /// </summary>
 54         private List<MailboxAddress> toList = null;
 55         /// <summary>
 56         /// 附件列表
 57         /// </summary>
 58         private List<MimePart> attaList = null;
 59         #endregion
 60 
 61         /// <summary>
 62         /// 操作异常信息
 63         /// </summary>
 64         public string ErrMsg { get; private set; }
 65 
 66         #region 制作与发送邮件
 67 
 68         /// <summary>
 69         /// 添加一个收件人
 70         /// 在制作邮件方法之前调用
 71         /// </summary>
 72         /// <param name="address">收件人地址</param>
 73         /// <param name="name"></param>
 74         public void AddTo(string address, string name = null)
 75         {
 76             if (this.toList == null)
 77                 this.toList = new List<MailboxAddress>();
 78             if (string.IsNullOrWhiteSpace(name))
 79                 name = address.Substring(0, address.IndexOf('@'));
 80             this.toList.Add(new MailboxAddress(name, address));
 81         }
 82 
 83         /// <summary>
 84         /// 添加一个附件
 85         /// 在制作邮件方法之前调用
 86         /// </summary>
 87         /// <param name="atta">附件流</param>
 88         /// <param name="name">附件名字</param>
 89         /// <param name="size">附件大小(K)</param>
 90         public void AddAttachment(Stream atta, string name, long size = 0)
 91         {
 92             try
 93             {
 94                 if (this.attaList == null)
 95                     this.attaList = new List<MimePart>();
 96                 // 附件内容块
 97                 MimePart attapart = new MimePart();
 98                 attapart.Content = new MimeContent(atta);
 99 
100                 // 内容描述为附件
101                 attapart.ContentDisposition = new ContentDisposition(ContentDisposition.Attachment);
102 
103                 // 附件名字设置,如果名字有中文也没关系
104                 attapart.ContentDisposition.FileName = name;
105                 // 大小设置
106                 if (size > 0)
107                     attapart.ContentDisposition.Size = size;
108 
109                 // 采用base64编码传输
110                 attapart.ContentTransferEncoding = ContentEncoding.Base64;
111 
112                 //
113                 this.attaList.Add(attapart);
114             }
115             catch (Exception e)
116             {
117                 ErrMsg = $"添加附件异常:{e.ToString()} [{e.Message}]";
118             }
119         }
120 
121         /// <summary>
122         /// 制作一封邮件
123         /// 调用此方法之前,先调用邮件配置初始化方法和添加收件人,添加附件方法
124         /// </summary>
125         /// <param name="subject">邮件主题(标题)</param>
126         /// <param name="body">邮件正文(内容)</param>
127         /// <param name="ishtml">正文是否为HTML格式,纯文本格式=false</param>
128         public void MakeEmail(string subject, string body, bool ishtml = true)
129         {
130             try
131             {
132                 // 邮件类新实例
133                 message = new MimeMessage();
134 
135                 // 设置邮件主题
136                 message.Subject = subject;
137 
138                 // 设置发件人信息
139                 message.From.Add(new MailboxAddress(fromAlias, fromEmail));
140 
141                 // 设置收件人信息
142                 message.To.AddRange(this.toList);
143 
144                 // 设置邮件正文
145                 var content = new TextPart(ishtml ? "html" : "plain");
146                 content.SetText(Encoding.UTF8, body);
147 
148                 // 建立内容块容器,将内容或附件等添加到其中 MimeEntity是各种类型内容的基类
149                 mimeparts = new Multipart("mixed");
150                 mimeparts.Add(content);
151                 // 附件
152                 if (this.attaList != null)
153                 {
154                     foreach (var atta in this.attaList)
155                     {
156                         mimeparts.Add(atta);
157                     }
158                 }
159 
160                 // 将内容块容器设置到邮件的内容.到此已经填好邮件实体的主要属性
161                 message.Body = mimeparts;
162             }
163             catch (Exception e)
164             {
165                 ErrMsg = $"制作邮件异常:{e.ToString()} [{e.Message}]";
166             }
167         }
168 
169         /// <summary>
170         /// 设置此邮件是对指定邮件的回复(这是一封回复邮件)
171         /// 在调用制作邮件方法之后调用,在发送前调用.需要调用收件配置方法CfgIMAP()
172         /// </summary>
173         /// <param name="uniqueid">被回复邮件唯一标识</param>
174         /// <param name="folderName">被回复邮件文件夹</param>
175         public void SetReplyTo(uint uniqueid, string folderName = null)
176         {
177             try
178             {
179                 // 被回复的邮件
180                 MimeMessage remail;
181                 // 查找这个被回复的邮件,设置回复状态
182                 using (var client = ConnectIMAP())
183                 {
184                     if (folderName == null)
185                         folderName = client.Inbox.Name;
186                     var emailUniqueId = new UniqueId(uniqueid);
187                     var folder = client.GetFolder(folderName);
188                     folder.Open(FolderAccess.ReadWrite);
189 
190                     remail = folder.GetMessage(emailUniqueId);
191                     folder.AddFlags(emailUniqueId, MessageFlags.Answered, true);
192                     folder.Close();
193                     client.Disconnect(true);
194                 }
195                 // construct the In-Reply-To and References headers
196                 if (!string.IsNullOrEmpty(remail.MessageId))
197                 {
198                     // 设置此邮件是对这个MESSAGEID的邮件的回复
199                     message.InReplyTo = remail.MessageId;
200                     // 此邮件的"对其它消息"的引用属性设为这个邮件的引用属性
201                     foreach (var id in remail.References)
202                         message.References.Add(id);
203                     message.References.Add(remail.MessageId);
204                 }
205                 // 回复邮件主题前面加RE:
206                 if (!message.Subject.StartsWith("RE:", StringComparison.OrdinalIgnoreCase))
207                     message.Subject = "RE:" + message.Subject;
208             }
209             catch (Exception e)
210             {
211                 ErrMsg = $"设置为回复邮件异常:{e.ToString()} [{e.Message}]";
212             }
213         }
214 
215         /// <summary>
216         /// 设置
217         /// </summary>
218         /// <param name="uniqueid"></param>
219         /// <param name="folderName"></param>
220         //public void SetForWard(uint uniqueid, string folderName = null)
221         //{
222 
223         //}
224 
225         /// <summary>
226         /// 发送一个邮件
227         /// 调用此方法之前,请先调用建立邮件的方法MakeMessage()
228         /// </summary>
229         public bool SendEmail()
230         {
231             try
232             {
233                 // 建立发件服务客户端
234                 using (var client = new SmtpClient())
235                 {
236                     // SMTP服务器
237                     client.Connect(serverSMTP, portSMTP);
238 
239                     // 登录
240                     client.Authenticate(fromEmail, fromPwd);
241 
242                     // 发邮件
243                     client.Send(message);
244 
245                     // 关闭连接
246                     client.Disconnect(true);
247                     return true;
248                 }
249             }
250             catch (Exception e)
251             {
252                 ErrMsg = $"发送邮件异常:{e.ToString()} [{e.Message}]";
253                 return false;
254             }
255         }
256 
257         #endregion
258 
259         #region 接收与处理邮件
260 
261         /// <summary>
262         /// 连接到IMAP服务器        
263         /// </summary>
264         private ImapClient ConnectIMAP()
265         {
266             try
267             {
268                 ImapClient client = new ImapClient();
269                 client.Connect(serverIMAP, portIMAP);
270                 client.Authenticate(account, pwd);
271 
272                 /**********************************************************************/
273                 // 网易126 163相关邮箱时,要用这两句话,表明客户端身份.在连接后调用.否则无法登录邮箱.
274                 var clientImplementation = new ImapImplementation
275                 {
276                     Name = "MeSince",
277                     Version = "2.0"
278                 };
279                 var serverImplementation = client.Identify(clientImplementation);
280                 /*********************************************************************/
281 
282                 return client;
283             }
284             catch (Exception e)
285             {
286                 ErrMsg = $"连接到IMAP服务器异常:{e.ToString()} [{e.Message}]";
287                 return null;
288             }
289         }
290 
291         /// <summary>
292         /// 获取邮箱的所有文件夹列表
293         /// 调用前先调用配置方法CfgIMAP()
294         /// </summary>
295         public EmailViewM GetFolders()
296         {
297             try
298             {
299                 using (var client = ConnectIMAP())
300                 {
301                     List<IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList();
302                     var entity = FillEntity(null, null, mailFolderList.ToArray());
303                     client.Disconnect(true);
304                     //
305                     return entity;
306                 }
307             }
308             catch (Exception e)
309             {
310                 ErrMsg = $"获取邮箱的所有文件夹异常:{e.ToString()} [{e.Message}]";
311                 return null;
312             }
313         }
314 
315         /// <summary>
316         /// 根据唯一标识和文件夹名,获取单个邮件
317         /// </summary>
318         /// <param name="folderName"></param>
319         /// <returns></returns>
320         public EmailViewM GetEmailByUid(uint uniqueid, string folderName = null)
321         {
322             try
323             {
324                 using (ImapClient client = ConnectIMAP())
325                 {
326                     if (folderName == null)
327                         folderName = client.Inbox.Name;
328                     IMailFolder folder = client.GetFolder(folderName);
329                     folder.Open(FolderAccess.ReadOnly);
330                     var email = folder.GetMessage(new UniqueId(uniqueid));
331                     var entity = FillEntity(null, email);
332                     //
333                     folder.Close();
334                     client.Disconnect(true);
335                     // 
336                     return entity;
337                 }
338             }
339             catch (Exception e)
340             {
341                 ErrMsg = $"获取单个邮件异常:{e.ToString()} [{e.Message}]";
342                 return null;
343             }
344         }
345 
346         /// <summary>
347         /// 获取一个文件夹的邮件 返回一个列表,包含摘要信息.收件/发件人,有几个附件,时间和标题,是否已读
348         /// 默认只获取3个月内的邮件
349         /// 调用前先调用配置方法CfgIMAP()
350         /// </summary>
351         public List<EmailViewM> GetEmailByFolder(string folderName = null)
352         {
353             try
354             {
355                 using (ImapClient client = ConnectIMAP())
356                 {
357                     IMailFolder folder;
358                     // 默认是收件箱
359                     if (folderName == null||folderName.ToLower()=="inbox")
360                     {
361                         folder=client.GetFolder(client.Inbox.Name);
362                     }
363                     else {
364                         // 其它特定的文件夹
365                         string dirK = folderName.ToLower();
366                         Dictionary<string, SpecialFolder> fdict = new Dictionary<string, SpecialFolder>();
367                         fdict.Add("archive", SpecialFolder.Archive);
368                         fdict.Add("drafts", SpecialFolder.Drafts);
369                         fdict.Add("flagged", SpecialFolder.Flagged);
370                         fdict.Add("sent", SpecialFolder.Sent);
371                         fdict.Add("junk", SpecialFolder.Junk);
372                         fdict.Add("trash", SpecialFolder.Trash);
373                         if (fdict.ContainsKey(dirK))
374                             folder = client.GetFolder(fdict[dirK]);
375                         else
376                         {
377                             // 否则是自定义的文件夹,或者是邮件服务商的特别文件夹
378                             folder = client.GetFolder(folderName);
379                         }
380                     }
381                         
382                     folder.Open(FolderAccess.ReadOnly);
383 
384                     // 获取所有邮件的唯一标识列表
385                     SearchQuery sq = SearchQuery.DeliveredAfter(DateTime.Today.AddMonths(-3));
386                     var emailUids = folder.Search(sq);
387 
388                     // 获取这些邮件的摘要信息(MessageSummaryItems.BodyStructure这个项可以知道是否带附件)
389                     var mails = folder.Fetch(emailUids, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure | MessageSummaryItems.Full);
390                     List<EmailViewM> entityls = new List<EmailViewM>();
391                     foreach (var emhead in mails)
392                     {
393                         var entity = FillEntity(emhead, null, folder);
394                         entityls.Add(entity);
395                     }
396                     //
397                     folder.Close();
398                     client.Disconnect(true);
399                     //
400                     return entityls;
401                 }
402             }
403             catch (Exception e)
404             {
405                 ErrMsg = $"获取一个文件夹的邮件异常:{e.ToString()} [{e.Message}]";
406                 return null;
407             }
408         }
409 
410         /// <summary>
411         /// 使用唯一ID获取一封完整邮件
412         /// 调用前先调用配置方法CfgIMAP()
413         /// </summary>
414         /// <param name="folder">文件夹名,默认是收件箱</param>
415         /// <param name="uniqueid">邮件唯一编号</param>
416         public EmailViewM GetEmailByUniqueId(uint uniqueid, string folderName = null)
417         {
418             try
419             {
420                 using (ImapClient client = ConnectIMAP())
421                 {
422                     if (folderName == null)
423                         folderName = client.Inbox.Name;
424                     IMailFolder folder = client.GetFolder(folderName);
425                     folder.Open(FolderAccess.ReadWrite);
426                     UniqueId emailUniqueId = new UniqueId(uniqueid);
427 
428                     // 获取这些邮件的摘要信息
429                     List<UniqueId> uids = new List<UniqueId>();
430                     uids.Add(emailUniqueId);
431                     var emaills = folder.Fetch(uids, MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope);
432                     var emhead = emaills[0];
433 
434                     // 获取邮件含正文部分,然后设置为已读.
435                     MimeMessage embody = folder.GetMessage(emailUniqueId);
436                     folder.AddFlags(emailUniqueId, MessageFlags.Seen, true);
437 
438                     /*赋值到实体类*/
439                     var entity = FillEntity(emhead, embody, folder);
440                     //
441                     folder.Close();
442                     client.Disconnect(true);
443                     //
444                     return entity;
445                 }
446             }
447             catch (Exception e)
448             {
449                 ErrMsg = $"获取单个完整邮件异常:{e.ToString()} [{e.Message}]";
450                 return null;
451             }
452         }
453 
454         /// <summary>
455         /// 邮件添加标识(已读,已回复,已删除等等).参数值参考EmailViewM实体同名属性
456         /// 调用前先调用配置方法CfgIMAP()
457         /// </summary>
458         /// <param name="uniqueIdls">同一文件夹下的邮件唯一标识列表</param>
459         /// <param name="flag">标识代码 1=已读 2=已回复 8=删除</param>
460         /// <param name="folderType">文件夹名</param>
461         public void SetFlag(List<uint> uniqueIdls, int flag, string folderType = null)
462         {
463             try
464             {
465                 using (ImapClient client = ConnectIMAP())
466                 {
467                     List<UniqueId> uniqueids = uniqueIdls.Select(o => new UniqueId(o)).ToList();
468                     MessageFlags messageFlags = (MessageFlags)flag;
469                     if (folderType == null)
470                         folderType = client.Inbox.Name;
471                     IMailFolder folder = client.GetFolder(folderType);
472                     folder.Open(FolderAccess.ReadWrite);
473                     folder.AddFlags(uniqueids, messageFlags, true);
474                     //
475                     folder.Close();
476                     client.Disconnect(true);
477                 }
478             }
479             catch (Exception e)
480             {
481                 ErrMsg = $"邮件添加标识时异常:{e.ToString()} [{e.Message}]";
482             }
483         }
484 
485         /// <summary>
486         /// 将邮件保存到草稿箱 返回邮件的唯一标识
487         /// 调用前先调用配置方法CfgIMAP(),调用制做邮件方法
488         /// </summary>
489         public int SaveDrafts(int uniqueId = -1)
490         {
491             try
492             {
493                 using (ImapClient client = ConnectIMAP())
494                 {
495                     // 打开草稿箱,添加邮件
496                     IMailFolder folder = client.GetFolder(SpecialFolder.Drafts);
497                     folder.Open(FolderAccess.ReadWrite);
498 
499                     // 如果保存的是已经有的草稿邮件,则删除它再保存新的草稿.(没找到保存已有草稿的办法)
500                     if (uniqueId > -1)
501                     {
502                         List<UniqueId> uidls = new List<UniqueId>();
503                         uidls.Add(new UniqueId((uint)uniqueId));
504                         folder.SetFlags(uidls, MessageFlags.Seen | MessageFlags.Deleted, true);
505                         folder.Expunge(uidls);
506                     }
507 
508                     UniqueId? uid = folder.Append(this.message, MessageFlags.Seen | MessageFlags.Draft);
509                     //
510                     folder.Close();
511                     client.Disconnect(true);
512                     return uid.HasValue ? (int)uid.Value.Id : -1;
513                 }
514             }
515             catch (Exception e)
516             {
517                 ErrMsg = $"邮件保存草稿时异常:{e.ToString()} [{e.Message}]";
518                 return -1;
519             }
520         }
521         #endregion
522 
523         /// <summary>
524         /// 将邮件相关信息填充到实体对象
525         /// </summary>
526         /// <param name="emhead">邮件基本信息</param>
527         /// <param name="embody">邮件详细信息</param>
528         /// <param name="folders">邮箱文件夹</param>
529         /// <returns></returns>
530         private EmailViewM FillEntity(IMessageSummary emhead = null, MimeMessage embody = null, params IMailFolder[] folders)
531         {
532             try
533             {
534                 // 邮件基本信息 主题(标题),发件人名,地址,日期,状态等
535                 EmailViewM entity = new EmailViewM();
536                 if (emhead != null)
537                 {
538                     entity.UniqueId = emhead.UniqueId.Id;
539                     if (emhead.Envelope.From.Count > 0)
540                     {
541                         entity.Name = emhead.Envelope.From.Mailboxes.ElementAt(0).Name;
542                         entity.Address = emhead.Envelope.From.Mailboxes.ElementAt(0).Address;
543                     }
544                     entity.Date = emhead.Envelope.Date.Value.DateTime;
545                     entity.Subject = emhead.Envelope.Subject;
546                     if (folders.Length > 0)
547                     {
548                         entity.FolderType = folders[0].Name;
549                     }
550                     // 收件人可能有多个
551                     entity.ToList = new List<EmailViewM>();
552                     foreach (var to in emhead.Envelope.To.Mailboxes)
553                     {
554                         entity.ToList.Add(new EmailViewM { Name = to.Name, Address = to.Address });
555                     }
556                     // 邮件状态,已读未读等等
557                     if (emhead.Flags.HasValue)
558                     {
559                         entity.IsRead = emhead.Flags.Value.HasFlag(MessageFlags.Seen);
560                         entity.IsAnswered = emhead.Flags.Value.HasFlag(MessageFlags.Answered);
561                     }
562                     // 附件个数(只传emhead时)
563                     entity.Count = emhead.Attachments.Count();
564                 }
565 
566                 // 正文 附件
567                 if (embody != null)
568                 {
569                     // 正文
570                     entity.BodyText = embody.TextBody;
571                     entity.BodyHTML = embody.HtmlBody;
572 
573                     // 附件
574                     // 附件个数(传embody时,包含有附件完整信息)
575                     entity.Count = embody.Attachments.Count();
576                     // 附件信息
577                     if (entity.Count > 0)
578                     {
579                         entity.AttaList = new List<EmailViewM>();
580                         // 这里要转成mimepart类型
581                         foreach (MimePart attachment in embody.Attachments)
582                         {
583                             var atta = new EmailViewM();
584                             atta.Name = attachment.ContentDisposition.FileName;
585                             atta.AttaStream = new MemoryStream();
586                             attachment.Content.DecodeTo(atta.AttaStream);
587                             atta.Size = Math.Round((double)atta.AttaStream.Length / 1024, 1).ToString();
588                             entity.AttaList.Add(atta);
589                         }
590                     }
591                 }
592                 // 邮箱文件夹
593                 if (folders.Length > 0)
594                 {
595                     entity.FolderList = new List<EmailViewM>();
596                     foreach (var item in folders)
597                     {
598                         entity.FolderList.Add(new EmailViewM()
599                         {
600                             Name = item.Name,
601                             FolderType = item.Attributes.ToString(),
602                             Count = item.Count
603                         });
604                     }
605                 }
606                 return entity;
607             }
608             catch (Exception e)
609             {
610                 ErrMsg = $"邮件填充到实体时异常:{e.ToString()} [{e.Message}]";
611                 return null;
612             }
613         }
614 
615         #region 配置账号密码方法
616 
617         /// <summary>
618         /// 初始化一个发件人的配置,发件箱,发件箱密码,SMTP服务器
619         /// </summary>
620         /// <param name="emailCode"></param>
621         public void CfgSendEmail(int emailCode)
622         {
623             switch (emailCode)
624             {
625                 default:
626                     fromAlias = "发件人名称";
627                     fromEmail = "发件人地址";
628                     fromPwd = "授权码或密码";
629                     serverSMTP = "smtp服务器地址";
630                     portSMTP = 25;
631                     break;
632             }
633         }
634 
635         /// <summary>
636         /// 初始化一个接收邮件的配置 登录名和密码,IMAP服务器,
637         /// </summary>
638         /// <param name="accountCode"></param>
639         public void CfgIMAP(int accountCode)
640         {
641             switch (accountCode)
642             {
643                    default:
644                     account = "邮件地址";
645                     pwd = "邮件密码或者授权码";//"";
646                     serverIMAP = "IMAP服务器地址";
647                     portIMAP = 143;
648                     //serverPOP = "POP3服务器地址";
649                     //portPOP = 110;
650                     break;
651             }
652         }
653 
654         #endregion
655     }        
public class EmailViewM
    {
        /// <summary>
        /// 1.从服务器上获取的邮件的UniqueId
        /// </summary>
        public uint UniqueId { get; set; }
        /// <summary>
        /// 1.发件人名字,这个名字可能为null.因为发件人可以不设名字
        /// 2.收件人名(只在ToList里的对象有值)
        /// 3.附件名(只在AttaList里的对象有值)
        /// 4.文件夹名字(只在FolderList里的对象有值)
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 1.发件人地址
        /// 2.收件人地址(只在ToList里的对象有值)
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 发件人邮箱授权码
        /// </summary>
        public string AuthCode { get; set; }
        /// <summary>
        /// 收件人列表
        /// </summary>
        public List<EmailViewM> ToList { get; set; }
        /// <summary>
        /// 邮件主题(标题)
        /// </summary>
        public string Subject { get; set; }
        /// <summary>
        /// 邮件时间
        /// </summary>
        public DateTime Date { get; set; }
        /// <summary>
        /// 1.附件个数
        /// 2.文件夹内邮件个数(只在FolderList里的对象有值)
        /// </summary>
        public int Count { get; set; }
        /// <summary>
        /// 附件标识ID在保存附件在本地时设置(只在AttaList里的对象有值)
        /// 当附件从邮件服务器下载到本地后,需要向客户端提供下载时,用这个ID找到该附件.
        /// </summary>
        public string AttaGuid { get; set; }
        /// <summary>
        /// 附件大小(只在AttaList里的对象有值)
        /// </summary>
        public string Size { get; set; }
        /// <summary>
        /// 附件流(只在AttaList里的对象有值)
        /// </summary>
        public Stream AttaStream { get; set; }
        /// <summary>
        /// 附件列表
        /// </summary>
        public List<EmailViewM> AttaList { get; set; }
        /// <summary>
        /// 是否已经读
        /// </summary>
        public bool IsRead { get; set; }
        /// <summary>
        /// 是否已经回复
        /// </summary>
        public bool IsAnswered { get; set; }
        /// <summary>
        /// 邮件正文的纯文本形式
        /// </summary>
        public string BodyText { get; set; }
        /// <summary>
        /// 邮件正文的HTML形式.
        /// </summary>
        public string BodyHTML { get; set; }

        /// <summary>
        /// 邮箱的文件夹列表
        /// </summary>
        public List<EmailViewM> FolderList { get; set; }
        /// <summary>
        /// 文件夹类型名
        /// 1.表示当前邮件所处文件夹名字
        /// 2.在FolderList里的对象,表示文件夹名字
        ///inbox(收件箱),
        ///archive(档案箱),
        ///drafts(草稿箱),
        ///flagged(标记的),
        ///junk(垃圾箱),
        ///sent(发件箱),
        ///trash(回收箱)
        /// </summary>
        public string FolderType { get; set; }
        /// <summary>
        /// 邮件标识,需要修改邮件标识时,传入此值
        /// 1=Seen(设为已读),
        /// 2=Answered(设为已经回复),
        /// 8=Deleted(设为删除),
        /// </summary>
        public int Flag { get; set; }
    }