mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库
环境 W10 / VS2017CMMT / MailKit version="2.0.3" "net46" / MimeKit version="2.0.3" "net46"
mailkit使用nuget下载或者到GIT https://github.com/jstedfast/MailKit
邮件收发是与邮件服务器交互,原理参考
帮助类参考部份mailkit源码.可简单实现发邮件与收邮件.在处理大附件,草稿保存,时未找到解决办法
发送邮件
MyMailKit mymail = new MyMailKit();
// 设置发件人
mymail.CfgSendEmail(1);
// 添加1个或多个收件人
mymail.AddTo("xxx@qq.com", "收件人XXX");
mymail.AddTo("yyy@163.com");
// 添加1个或多个附件
MemoryStream ms = new MemoryStream();
using (FileStream fs = new FileStream("123.doc", FileMode.Open))
{
fs.CopyTo(ms);
}
mymail.AddAttachment(ms, "123.doc", ms.Length);
// 发送邮件
mymail.SendEmail();
接收邮件
// 查看一个文件夹的邮件
MyMailKit mymail = new MyMailKit();
// 收邮件配置
mymail.CfgIMAP(1);
// 获取文件夹的所有邮件(3个月内的)
var list = mymail.GetEmailByFolder(folder);
if (list == null)
{
// 没找到邮件出错信息提示
mymail.ErrMsg;
return;
}
foreach (var item in list)
{
// 收件人
StringBuilder tolist = new StringBuilder();
foreach (var to in item.ToList)
{
tolist.Append($"{to.Name}<{to.Address}>,");
}
//
item.UniqueId; // 邮件标识
item.IsRead;// 是否已读
item.Count;// 附件数
item.IsAnswered;// 是否回复
item.Name;// 发件人
item.Address;// 发件人邮箱
item.Subject;// 标题
item.Date.ToString("yyyy-MM-dd");// 日期
}
// 显示邮件详细
var emdetail = mymail.GetEmailByUniqueId(uint.Parse(id), folder);
// 设置删除邮件
List uids = new List();
uids.Add(id);
mymail.SetFlag(uids, 8, folder);
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; }
}