C#基础--基于POP3协议的邮件接收和基于STMP的邮…

2018-06-18 03:04:16来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

  最近在用outlook同步邮件。对邮件协议有一点兴趣。于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发。

  

     一:SMTP协议

     1.什么是SMTP协议:

      SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。(来自百度百科)

 2.如何实现:

      为了实现SMTP协议,.net提供了MailMessage类,用于存储邮件信息(包括主题,发件人地址,收件人地址,附件,包括邮件的格式[文本,HTML...]。SmtpClient类来实现协议连接。StmpClient提供了stmp 和port两个参数,有关协议和端口号是可以再网上查询到的。常用邮箱端口号: STMP默认25.实现代码如下:

        public static bool SendEmail()
        {
            try
            {
                MailMessage msg = new MailMessage();
                msg.From = new MailAddress(fromEmailAddress); // 发件人邮箱
                msg.Subject = "来自小聪的邮件";
                msg.Body = "今天吃饭了没有呀,小强同学";
                msg.BodyEncoding = System.Text.Encoding.Default;
                msg.To.Add(toEmailAddress); //收件人地址,可以添加多个
                SmtpClient client = new SmtpClient(smtp, port); // smtp = "smtp.qq.com"; port=25 QQ邮箱
                client.Credentials = new System.Net.NetworkCredential(msg.From.Address, password);
                client.DeliveryMethod = SmtpDeliveryMethod.Network;
                client.Send(msg);
            }
            catch (Exception ex)
            {
                return false;
            }           
            return true;
        }

         二:POP3协议:
              1.什么是POP3协议:

       邮局协议Post Office Protocol,简称POP)是TCP/IP协议族中的一员,由RFC 1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。最新版本为POP3,全名“Post Office Protocol - Version 3”,而提供了SSL加密的POP3协议被称为POP3S。(来自维基百科)

     2.如何实现:

        要想实现邮件的操作。只需要遵守相应的命令协议即可。对于一般操作。需要先通过user 和pass的验证。验证成功后。方可执行后面的命令。

命令描述
user 用户名
pass  密码,执行命令后可以获取到邮件数量和邮件总字节
apop 一种安全传输口令的办法,digest是md5消息摘要,执行成功导致状态转换
stat 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
uidl 返回邮件的唯一标识符,pop3会话的每个标识符都将是唯一的
list 返回邮件数量和每个邮件的大小
retr 返回由参数标识的邮件的全部文本,retr+5 表示返回前5封邮件的文本,但是返回回来的信息是乱码,需要转码
dele 服务器将由参数标识的邮件标记为删除,由quit命令执行
rset 服务器将重置所有标记为删除的邮件,用于撤消dele命令
top 服务器将返回由参数标识的邮件前n行内容,n必须是正整数
noop 服务器返回一个肯定的响应,不做任何操作。
quit 退出

       如上面的命令为了更方便的理解,请看下面代码: 对于每次的sr.Readline 如果获取成功了。在读取的字符串里面都会有一个"+OK",可以通过判断字符串是否包含OK,来确定是否命令操作成功(代码中我忽略了). 其次对于RERT命令来说。返回的是乱码。需要转码。这个会在后续的博客更新。

NOTES: pop3端口号默认110,代码的宽口好。账号密码,是存在了类的静态变量。没有展示出来。

 public static void GetMessage()
        {
            TcpClient Server = new TcpClient(pop3,pop_port); //Tcp协议
            NetworkStream netSream = Server.GetStream();
            StreamReader sr = new StreamReader(netSream);
            byte[] byData;
            string data;
            try
            {
                string str = string.Empty;
                data = "USER " + fromEmailAddress+ "\r\n";
                byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray());
                netSream.Write(byData, 0, byData.Length);
                Console.WriteLine(sr.ReadLine()); 
                data = "PASS " + password + "\r\n";
                byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray());
                netSream.Write(byData, 0, byData.Length);
                Console.WriteLine(sr.ReadLine());
data = "STAT" + "\r\n"; byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray()); netSream.Write(byData, 0, byData.Length); Console.WriteLine(sr.ReadLine()); Console.WriteLine("链接成功..."); } catch (Exception ex) { Console.Write("链接服务器失败..."); return; } try { data = "RETR " +5 +"\r\n"; byData = System.Text.Encoding.ASCII.GetBytes(data.ToCharArray()); netSream.Write(byData, 0, byData.Length); string emailData = string.Empty; string szTemp = sr.ReadLine(); if (szTemp[0] != '-') // 如果获取有错的话.服务器会返回一个字符串以"-"开头 { while (szTemp != ".") { szTemp = sr.ReadLine(); emailData += szTemp; } Console.WriteLine(emailData); } else { Console.WriteLine(szTemp); } } catch (Exception ex) { Console.WriteLine("Get email 失败"); } }

    

    三.总结:博客很多地方需要改进。里面大部分都是借鉴的别人的代码。以及其他博客的文章。然后凑在一起的。希望博友对这方面了解多的。都给给自己的意见。3KU。

                       代码Link:http://files.cnblogs.com/FourLeafCloverZc/SpongeBob.Email.Learn.zip

           

   

    

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:多线程中变量的内存分配

下一篇:无限参数的写法