对于还没用动手写过程序的人来说,动手是必须的,只有自己动手写写程序才能在锻炼中不断提高,今天和大家一起探讨一个程序c#中邮件收发处理(POP3,IMAP,SMTP)的实现方法,程序有点长,希望大家坚持看完,看透,看明白。

本文涉及的内容:
1:自己制作Pop3Helper
   信件格式的处理有麻烦
2:使用现成的pop3类
   LumiSoft.Net.POP3.Client;
      有两种处理方法
3:使用IMAP收邮件
      功能似乎更多,比起pop3来。
4:SMTP发送邮件
   关于 Mailbox unavailable. The server response was: 5.7.1 Unable to relay for xx 的错误处理 
自己写一个POP3的接收程序并不是很简单。主要问题就是如何处理信件的格式。
其处理方法不是太复杂,用一个tcp联接就可以了。
这是代码
     public class Pop3Helper
    {
        string _pop3server;
        string _user;
        int _port;
        string _pwd;
        public TcpClient _server;
        public NetworkStream _netStream;
        public StreamReader _reader;
        public string _data;
        public byte[] _charData;
        public string _CRLF = \"\\r\\n\";
        private string _log;
        public string LogMSG
        {
            get { return _log; }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name=\"server\"></param>
        /// <param name=\"port\"></param>
        /// <param name=\"user\"></param>
        /// <param name=\"pwd\"></param>
        public Pop3Helper(string server, int port, string user, string pwd)
        {
            _pop3server = server; [Page]
            _port = port;
            _user = user;
            _pwd = pwd;
        }
        /// <summary>
        /// connect
        /// </summary>
        public void Connect()
        {
            //create a tcp connection
            _server = new TcpClient(_pop3server, _port);
            //prepare 
            _netStream = _server.GetStream();

if (!CheckResult(_reader.ReadLine()))
                throw new Exception(\"Pass Error\"); [Page]
        }
        /// <summary>
        /// get message Numbers
        /// </summary>
        /// <returns></returns>
        public int GetMailCount()
        {
            try
            {
                _data = \"STAT\" + _CRLF;
                _charData = System.Text.Encoding.ASCII.GetBytes(_data.ToCharArray());
                _netStream.Write(_charData, 0, _charData.Length);
                string resp = _reader.ReadLine();
                string[] tokens = resp.Split(new char[] { ’ ’ });
                return Convert.ToInt32(tokens[1]);
            }
            catch (Exception ex)
            {
                return 0;
            }
        }
        public string GetMail(int id)
        {
            string line;
            string content = \"\";
            try
            {
                //get by id
                _data = \"RETR \" + id + _CRLF;
                _charData = System.Text.Encoding.ASCII.GetBytes(_data.ToCharArray()); [Page]
                _netStream.Write(_charData, 0, _charData.Length);
                line = _reader.ReadLine();
                if (line[0] != ’-’)
                {
                    //end with ’.’
                    while (line != \".\")
                    {
                        line = _reader.ReadLine();
                        content += line + \"\\r\\n\";
                    }
                }

return content;
            }
            catch (Exception err)
            {
                Log(err.Message);
                return \"Error\";
            }
        }

_reader = new StreamReader(_server.GetStream());
            if (!CheckResult(_reader.ReadLine()))
                throw new Exception(\"Connect Error\");
            //login
            _data = \"USER \" + this._user + _CRLF;
            _charData = System.Text.Encoding.ASCII.GetBytes(_data.ToCharArray());
            _netStream.Write(_charData, 0, _charData.Length);
            if (!CheckResult(_reader.ReadLine()))
                throw new Exception(\"User Error\");
            _data = \"PASS \" + this._pwd + _CRLF;
            _charData = System.Text.Encoding.ASCII.GetBytes(_data.ToCharArray());
            _netStream.Write(_charData, 0, _charData.Length);

public void DeleteMail(int id)
        {
            _data = \"DELE\" + id + _CRLF;
            _charData = System.Text.Encoding.ASCII.GetBytes(_data.ToCharArray());
            _netStream.Write(_charData, 0, _charData.Length); [Page]
            if (!CheckResult(_reader.ReadLine()))
                throw new Exception(\"Delete Error\");
        }
        /// <summary>
        /// close connection
        /// </summary>
        public void Close()
        {
            _data = \"QUIT\" + _CRLF;
            _charData = System.Text.Encoding.ASCII.GetBytes(_data.ToCharArray());
            _netStream.Write(_charData, 0, _charData.Length);
            //close 
            _netStream.Close();
            _reader.Close();
        }
        private bool CheckResult(string reply)
        {
            Log(reply);
            if (reply.IndexOf(\"+OK\") > -1)
                return true;
            else
                return false;
        }
        private void Log(string msg)
        {
            _log += msg + \"\\r\\n\";
        }
    }
。。。。。
但是这种方式的一个问题就是关于解析信件的格式。如果是附件的话,他也直接给出了二进制,不容易使用。
所以,可以使用一个现成的工具:LumiSoft.Net.POP3.Client。这里面已经给写好了实现,用起来也很简单。
这是一个简单的用法(这里使用了两种处理方式,前一种是不建议使用的)
。。
            using (POP3_Client pop3 = new POP3_Client()) [Page]
            {
                //与Pop3服务器建立连接
                pop3.Connect(_popServer, _pop3port,false);
                //验证身份
                pop3.Authenticate(_user, _pwd, false);
                //get all messages
                POP3_MessagesInfo infos = pop3.GetMessagesInfo();
                 foreach (POP3_MessageInfo info in infos)
                {
                    byte[] bytes = pop3.GetMessage(info.MessageNumber);
                    Mime mime = Mime.Parse(bytes);
                    HandleMail(mime);
                    //delete it at last
                    //pop3.DeleteMessage(info.MessageNumber);
                }
                //the second way to do it

//for (int i = 0; i < pop3.Messages.Count; i++)
                //{
                //    byte[] bytes = pop3.Messages[i].MessageToByte();
                //    Mime mime = Mime.Parse(bytes);
                //    HandleMail(mime); [Page]
                //    //delete it at last
                //    //pop3.DeleteMessage(pop3.Messages[i].SequenceNumber);
                //}。
。。。
取得的邮件可以这要给获得。
   #region pop3
            //string customer = mime.MainEntity.To.ToAddressListString();//cargo company
            //string sender = mime.MainEntity.From.ToAddressListString();//this is customer who send
            #endregion
            string customer = MailboxesToString(envelope.To);//cargo company
            string sender = MailboxesToString(envelope.From);//this is customer who send
。。。
除此之外,它提供的另外一个工具是IMAP,它操作起来更加方便。代码如下:

  IMAP_Client clnt = new IMAP_Client();
            try
            {
                clnt.Connect(\"mail.xx.com\", 143, false);
                clnt.Authenticate(\"user\", \"password\");
                string[] folders = clnt.GetFolders();//get all types
                string folder = \"Inbox\";
                clnt.SelectFolder(folder);

IMAP_SequenceSet sequence_set = new IMAP_SequenceSet();
                // All messages
                sequence_set.Parse(string.Format(\"{0}:{1}\", 1, clnt.MessagesCount));
                IMAP_FetchItem[] fetchItems = clnt.FetchMessages( [Page]

}
                    catch (Exception ex)
                    {
                        Log(\"Sys\", ex.Message);
                    } [Page]
                }
                //delete it after hanlde
                clnt.DeleteMessages(sequence_set, false);
                //disconnect
                clnt.Disconnect();
                //MessageBox.Show(count.ToString() + \" of \" + fetchItems .Length+ \" Success\");
            }
            catch (Exception x)
            {
                Log(\"Sys\", x.Message);
                //MessageBox.Show(x.Message);
            }
 
。。
上边都是如何收邮件。
关于如何发送邮件是比较简单的。这里提供两种方式。
第一种方式是使用网上的smtp。这种方式必须要提供用户名和密码。这个适合于web应用,使用的smtp也是网上的,我一般使用163的smtp,基本没有问题。
第二种方式是使用本地的smtp。不需要提供密码,用户也可以是不存在的(垃圾邮件是不是就是这么产生的?),但是必要要提供smtp端口号。
第二种方法测试的时候有时候会报错“Mailbox unavailable. The server response was: 5.7.1 Unable to relay for xxx”,查过资料之后(在baidu上没找到,还是google信息多一点),才发现问题原来是IIS里SMTP服务的配置有问题。
这样修改可以解决:到开SMTP属性—>Access页面Reply Restrictions/ Reply-Only this Below选项,加上自己的ip:127.0.0.1(允许本机,使用loalhost,如果是允许其他机器,类似设置)
代码如下
public class EMail
    {
        static public string accountName;
        static public string password;
        static public string smtpServer;
        static public int smtpPort;
        /// <summary>
        /// need password,username, smtpserver
        /// </summary> [Page]
        /// <param name=\"to\"></param>
        /// <param name=\"subject\"></param>
        /// <param name=\"body\"></param>
        static public void SendMail(string sendTo, string subject, string body)
        {
            //.net smtp 
            System.Web.Mail.MailMessage mailmsg = new System.Web.Mail.MailMessage();
            mailmsg.To = sendTo;
            //mailmsg.Cc = cc;
            mailmsg.Subject = subject;
            mailmsg.Body = body;
            //sender here
            mailmsg.From = EMail.accountName; 
            // certify needed  
            mailmsg.Fields.Add(\"http://www.zxbc.cn/"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate/"\", \"1\");//1 is to certify
            //the user id   
            mailmsg.Fields.Add( 
                        sequence_set,
                        IMAP_FetchItem_Flags.UID | IMAP_FetchItem_Flags.MessageFlags | IMAP_FetchItem_Flags.Size | IMAP_FetchItem_Flags.Envelope,
                        true, false
                        );
                //int count =0;
                foreach (IMAP_FetchItem fetchItem in fetchItems)
                {
                    IMAP_Envelope envelope = fetchItem.Envelope;
                    //hanldle it, means read and search and reply
                    try
                    {
                        HandleMail(envelope);
                        //count++;

}
                    catch (Exception ex)
                    {
                        Log(\"Sys\", ex.Message);
                    } [Page]
                }
                //delete it after hanlde
                clnt.DeleteMessages(sequence_set, false);
                //disconnect
                clnt.Disconnect();
                //MessageBox.Show(count.ToString() + \" of \" + fetchItems .Length+ \" Success\");
            }
            catch (Exception x)
            {
                Log(\"Sys\", x.Message);
                //MessageBox.Show(x.Message);
            }
 
。。
上边都是如何收邮件。
关于如何发送邮件是比较简单的。这里提供两种方式。
第一种方式是使用网上的smtp。这种方式必须要提供用户名和密码。这个适合于web应用,使用的smtp也是网上的,我一般使用163的smtp,基本没有问题。
第二种方式是使用本地的smtp。不需要提供密码,用户也可以是不存在的(垃圾邮件是不是就是这么产生的?),但是必要要提供smtp端口号。
第二种方法测试的时候有时候会报错“Mailbox unavailable. The server response was: 5.7.1 Unable to relay for xxx”,查过资料之后(在baidu上没找到,还是google信息多一点),才发现问题原来是IIS里SMTP服务的配置有问题。
这样修改可以解决:到开SMTP属性—>Access页面Reply Restrictions/ Reply-Only this Below选项,加上自己的ip:127.0.0.1(允许本机,使用loalhost,如果是允许其他机器,类似设置)
代码如下
public class EMail
    {
        static public string accountName;
        static public string password;
        static public string smtpServer;
        static public int smtpPort;
        /// <summary>
        /// need password,username, smtpserver
        /// </summary> [Page]
        /// <param name=\"to\"></param>
        /// <param name=\"subject\"></param>
        /// <param name=\"body\"></param>
        static public void SendMail(string sendTo, string subject, string body)
        {
            //.net smtp 
            System.Web.Mail.MailMessage mailmsg = new System.Web.Mail.MailMessage();
            mailmsg.To = sendTo;
            //mailmsg.Cc = cc;
            mailmsg.Subject = subject;
            mailmsg.Body = body;
            //sender here
            mailmsg.From = EMail.accountName; 
            // certify needed  
            mailmsg.Fields.Add(\"http://www.zxbc.cn/"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate/"\", \"1\");//1 is to certify
            //the user id   
            mailmsg.Fields.Add(

"http://www.zxbc.cn/"http://schemas.microsoft.com/cdo/configuration/sendusername/"\",
                EMail.accountName);
             //the password
            mailmsg.Fields.Add(
                \"http://www.zxbc.cn/"http://schemas.microsoft.com/cdo/configuration/sendpassword/"\",
                 EMail.password);
            System.Web.Mail.SmtpMail.SmtpServer = EMail.smtpServer;
            System.Web.Mail.SmtpMail.Send(mailmsg); [Page]
        }

#region send mail2
        /// <summary>
        /// need username,smtp,smtp port
        /// </summary>
        /// <param name=\"sendTo\"></param>
        /// <param name=\"subject\"></param>
        /// <param name=\"body\"></param>
        static public void SendMail2(string sendTo, string subject, string body)
        {
            System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
            msg.To.Add(sendTo);
            msg.From = new System.Net.Mail.MailAddress(accountName );
            msg.Subject = subject;
            msg.SubjectEncoding = System.Text.Encoding.UTF8;
            msg.Body = body;//
            msg.BodyEncoding = System.Text.Encoding.UTF8;
            msg.IsBodyHtml = false;
            //msg.Priority = MailPriority.High;//
            System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
            client.Host = smtpServer;
            client.Port = smtpPort;
            //client.Credentials = new System.Net.NetworkCredential(\"http://www.zxbc.cn/"mailto:user@xxx.com/"\", \"pass\"); 
            client.Send(msg);
        }
        #endregion
    }

转载于:https://www.cnblogs.com/bluewelkin/archive/2008/08/13/1266531.html

c#中邮件收发处理(POP3,IMAP,SMTP)的实现方法相关推荐

  1. outlook 设置POP3/IMAP/SMTP服务 (账号密码-授权码)发送、获取授权码

    1. 说明 三方应用账号密码连接邮箱时,此时的密码并不是真正的邮箱密码,而是授权码.授权码需要去对应的邮箱设置中开通,此处是outlook 的授权码获取方式 2. 准备工作 2.1 申请邮箱 直接访问 ...

  2. 163/qq邮箱设置POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

    很多邮箱第三方使用POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务登录都是需要授权码的,这个授权码就是第三方登录时候的密码.下面已qq邮箱和163邮箱为例子讲解下. q ...

  3. QQ邮箱第三方POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务授权码

    参考QQ邮箱: 什么是授权码,它又是如何设置? 设置入口: 选择 账户 下拉找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务就好了.我这边已经开通,开通流程挺简单的 ...

  4. 邮件协议POP3/IMAP/SMTP介绍

    一.邮件发送.收取过程 图示的六个步骤分别进行如下的说明: ①.用户A的电子邮箱为:xx@qq.com,通过邮件客户端软件写好一封邮件,交到QQ的邮件服务器,这一步使用的协议是SMTP,对应图示的①: ...

  5. 邮件协议POP3/IMAP/SMTP服务的区别

    2016年09月09日 09時51分 wanglinqiang整理 通过网上查找的资料和自己的总结完成了下面的文章,看完之后相信大家对这三种协议会有更深入的理解.如有错误的地方望指正. POP3 PO ...

  6. 邮件协议POP3/IMAP/SMTP学习总结 SSL/TLS介绍 常用邮箱服务器设置

    邮箱协议介绍 首先,SMTP.POP和IMAP都是与邮件有关的协议.SMTP主要是负责传送邮件,而POP和IMAP是负责接收邮件. SMTP SMTP (Simple Mail Transfer Pr ...

  7. 在Outlook2007中设置QQ邮箱为IMAP/SMTP服务器

    写Outlook设置QQ邮箱的攻略很多,但是都设置成POP3服务器.原本以为设置IMAP服务器流程一致,没想到低估了outlook和腾讯的麻烦程度.搞了一上午终于正确设置,写下来给有需要的人参考. - ...

  8. imap服务器appleimap.163.com没有响应,163邮箱IMAP/SMTP设置,客户端授权码

    163邮箱使用邮件客户端收发信时,需要设置IMAP/SMTP,在IOS端无法获得163的IMAP/SMTP服务信息,只能手动填写. 163邮箱IMAP/SMTP地址 IOS地址,我的设置这个才可以 a ...

  9. 发送邮件程序报错454 Authentication failed以及POP3和SMTP简介

    一.发现问题 在测试邮件发送程序的时候,发送给自己的QQ邮箱,程序报错454 Authentication failed, please open smtp flag first. 二.解决问题 进入 ...

最新文章

  1. 如何用深度学习做自然语言处理?这里有份最佳实践清单
  2. Greenplum【环境搭建 01】CentOS Linux release 7.5 环境单机版详细安装配置步骤+问题解决(含安装包资源)
  3. 5g算法matlab怎么用,使用 MATLAB 开发 5G NR 设计
  4. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(1)
  5. python-带参数的装饰器
  6. java类初始化_Java的类/实例初始化过程
  7. POJ-2528 Mayor's posters 线段树+离散化 或 DFS
  8. Apache服务器全局配置之服务器标识配置篇
  9. 【java】简介(一)
  10. Java 9 Module的特性以及解决的问题
  11. 运维监控系列(4)-Prometheus控制台功能详解
  12. ZooKeeper作为注册中心
  13. cad渐开线齿轮轮廓绘制_CAD渐开线齿形怎么绘制
  14. 如何解决word中latex公式出现虚线小方框问题
  15. STM8电源模式管理及功耗控制
  16. Ubuntu / Windows 查看域名系统 (Domain Name System,DNS)
  17. python工资一般多少p-我会P图,工资5000,兼职1.5w……
  18. flux读取不到数据_WebFlux 中form data获取不到参数问题
  19. 嵌入式系统硬件体系设计(一)
  20. js 对象的解构赋值

热门文章

  1. 常用的Windows批处理
  2. Maven工程构建时报编码警告的解决办法
  3. 一种用XAML写Data Converter的方式
  4. centos 5.6安装及配置JDK环境变量
  5. 性能压测诡异的Requests/second 响应刺尖问题
  6. php:Mcrypt响应慢的原因解决备注
  7. 关于union的那些事儿
  8. noip2014滚粗记
  9. 比特币现金在稳定币领域的地位怎样
  10. 比特币现金vs莱特币,谁将夺得小额支付市场?