这里使用LumiSoft.Net组建帮助接收邮件。用using导入命名空间后,输入如下代码:
接收邮件(<>括号内根据个人情况填写)
1 using (POP3_Client pop3 = new POP3_Client())
2 {
3 //与Pop3服务器建立连接
4 pop3.Connect("<pop3服务器ip地址>", <pop3服务端口号默认为110>, <是否使用ssl true或false>);
5 //验证身份
6 pop3.Authenticate(UserId + EmailAdd, Password, false);
7 //获取邮件信息列表
8 POP3_ClientMessageCollection infos = pop3.Messages;
9 foreach (POP3_ClientMessage info in infos)
10 //获取这封邮件的内容
11 byte[] bytes = info.MessageToByte();
12 //解析从Pop3服务器发送过来的邮件信息
13 Mime mime = Mime.Parse(bytes);
14 //是否有附件
15 bool isatt = mime.Attachments.Count() == 0 ? false : true;
16 if (isatt)
17 {
18 Random ran = new Random();
19 foreach (MimeEntity me in mime.Attachments)
20 {
21 //附件文件名
22 string attname = me.ContentType_Name;//附件名称
23 //附件大小
24 string attsize = ((int)(me.Data.Length / 1024) == 0 ? 1 : (int)(me.Data.Length / 1024)).ToString() + "KB";
25 //附件存盘名
26 string newfilename = attname.Split('.')[0] + DateTime.Now.ToString("yyyyMMdd") + ran.Next(1, 1000)+"." + attname.Split('.')[1];//为了防止重复使用附件文件名+日期+随机数为存储到服务器的附件名
27 //附件存储到服务器
28 FileStream fs = new FileStream("存储附件的目录(服务器相对地址)" + newfilename, FileMode.Create);//这里可使用CreateNew抛出异常重新命名新的文件名,防止重复文件名产生覆盖
29 fs.Write(me.Data,0,me.Data.Length); //将字节数组存储到文件流中
30 fs.Close();
31 }
32 }
33 //往服务器存储附件的时候可以开一个新的线程防止等待。
34 //邮件信息
35 //info.UID 这个邮件在邮件服务器内的不重复id
36 //mime.MainEntity.From.ToAddressListString() 收件人地址
37 // mime.MainEntity.To.ToAddressListString() 发件人地址
38 //mime.MainEntity.Cc == null ? "" : mime.MainEntity.Cc.ToAddressListString() 抄送地址
39 //mime.MainEntity.Bcc == null ? "" : mime.MainEntity.Bcc.ToAddressListString() 密件抄送地址
40 //mime.MainEntity.Subject 信件标题
41 //mime.BodyHtml != null ? mime.BodyHtml : mime.BodyText 信件内容 (html编码与文本编码)
42 //((int)bytes.Length / 1024 == 0 ? 1 : (int)bytes.Length / 1024).ToString() + "KB" 邮件大小单位为kb
43 // mime.MainEntity.Date 邮件发送日期
44 }
45 }
46
需要注意的地方:
1.关于编码:
发件人地址分为两种情况,一种是 "小李 ab@bc.com " 另一种是ab@bc.com
如果是前面那种情况中文名称会出现乱码。与此相同,附件名称等出现中文的地方也会出现乱码。而且乱码中空格用_符号代替
下面是转换编码的方法
转换编码
1 public string MailEncoding(string str)
2 {
3 try
4 {
5 string[] token = str.Split('?');
6 //符合"=?utf-8?B?5Y+R5L+h6ZmE5Lu2LnR4dA==?="这种格式才能用此方法解析
7 if (token.Length == 5 && token[2] == "B")
8 {
9 string msg = token[3].; //解析后的字符串
10 byte[] test = Convert.FromBase64String(msg);//因为第三个分隔字符为B所以是Base64编码
11 return Encoding.GetEncoding(token[1]).GetString(test);//根据第一个分隔字符可以看出是utf-8编码
12 }
13 else
14 {
15 return str;
16 }
17 }
18 catch (Exception ex)
19 {
20 return str;
21 }
22 }
下面需要添加下载附件模块了。由于在服务器存储的是为了防止重复经过修改的文件名与真实的文件名不同,所以需要更改文件名后让用户下载。代码如下:
更改文件名下载
1 Response.Clear(); //清空response输出
2 Response.Charset = "utf-8"; //文件名为utf-8编码
3 Response.Buffer = true;
4 this.EnableViewState = false;
5 Response.ContentEncoding = System.Text.Encoding.UTF8;
6 Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode("<用户下载文件时的文件名>"));
7 Response.WriteFile("<要下载的文件在服务器中的绝对地址>");
8 Response.Flush();
9 Response.Close();
10 Response.End();
文章就写到这里了,由于邮局代码庞大复杂无法一一介绍。抛砖引玉希望能对您有所启发,由于本人从业不久。所以不足之处还望见谅。