• 邮件发送和接收原理以及smtp和pop3和imap协议


    一、 邮件开发涉及到的一些基本概念

    1.1、邮件服务器和电子邮箱

      要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。

      这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

      电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个账号分配一定的空间,用户从而可以使用这个帐号以及空间发送电子邮件和保存别人发送过来的电子邮件。

    1.2、邮件传输协议

    1.2.1、SMTP协议

      用户连接上邮件服务器之后,要想给它发送一封电子邮件,需要遵循一定的通讯规则,SMTP协议就是用来定义这种通讯规则的。因此,我们通常也把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

    1.2.2、POP3协议

      同样,用户若想从邮件服务器管理的电子邮箱当中接收一封电子邮件话,它连上邮件服务器后,也要遵循一定的通讯格式,POP3协议就是用来定义这种通讯格式的。因此,我们通常也把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

    1.3、电子邮件的发送和接收过程

      通过一张图来说明一封邮件的发送和接收过程,如下图所示:

      

      简单说一下这个邮件收发过程:

      1、xdp@sohu.com 用户写好一封Email发送到sohu的Smtp服务器。对应于上图的步骤①

      2、sohu的Smtp服务器开始处理xdp@sohu.com 用户的请求,它会根据收件人的地址判断,当前收件人是不是自己管辖的用户,如果是,就直接将Email存放到为该收件人的分配的邮箱空间当中。sohu的Smtp服务器判断收件人地址发现,这一封Email的收件人gacl@sina.com 是Sina的邮件服务器管理的,于是又将Email转发给Sina的Smtp服务器。对应于上图的步骤②

      3、Sina的Smtp服务器开始处理sohu的Smtp服务器发送过来的Email,Sina的Smtp服务器根据收件人的地址判断,发现收件人自己管辖的用户,于是就直接将Email存放到为gacl@sina.com 用户的分配的邮箱空间当中。对应于上图的步骤③。

      4、xdp@sohu.com 用户将邮件发出去之后,就通知gacl@sina.com 用户去收取。gacl@sina.com 用户于是就连接上Sina的POP3服务器收取邮件,对应于上图的步骤④。

      5、POP3服务器从gacl@sina.com 用户的邮箱空间当中取出Email,对应于步骤⑤。

      6、POP3服务器将取出来的Email发给gacl@sina.com 用户,对应于步骤⑥。

    二、使用Smtp协议发送邮件

    2.1、Smtp协议讲解

      使用smtp协议发送邮件给邮件服务器时规定了要做以下几件事

      1、使用"ehlo"命令和连接上的smtp服务器打声招呼,例如:

         ehlo gacl

      2、使用"auth login"命令登录到Smtp服务器,登录使用的用户名和密码必须经过Base64加密,例如:   

        ①、输入命令:auth login  

        ②、输入使用Base64加密过后的用户名:Z2FjbA==  

        ③、输入Base64加密过后的密码:MTIzNDU2

      3、指明邮件的发件人和收件人

        mail from:<gacl@sohu.com>

        rcpt to:<xdp_gacl@sina.cn>

       4、编写要发送的邮件内容,邮件的编写格式是有一定的规则的,一封格式良好的邮件应该包含邮件头和邮件的主体内容。

        邮件头使用下面的三个字段来指明

      1. from字段用于指明邮件的发送人
      2. to字段用于指明邮件的收件人
      3. subject字段用于指明邮件的主题

        邮件的内容包含了这些信息之后才是一封格式良好的邮件。

        ①、输入"data"命令

          data

        ②、编写邮件内容

          from:<gacl@sohu.com>    ----邮件头

          to:<xdp_gacl@sina.cn>     ----邮件头

          subject:hello          ----邮件头

                          -----空行

          hello gacl            ----邮件的具体内容

      5、输入一个.告诉邮件服务器邮件内容已经写完了

        .

      6、输入quit命令断开与邮件服务器的连接

        quit

      以上的6个步骤就是Smtp协议规定的发送一封Email必须要做的事情。

    2.2、使用Smtp协议手工发送邮件

      在对Smtp协议有一定的了解之后,我们就可以使用Smtp协议来发送邮件了。下面演示一下使用Telnet客户端连接上搜狐的邮件服务器然后发一封Email到新浪的邮箱中去

      为了能够对Smtp协议有一个直观的认识,这里我们不借助任何第三方邮件客户端工具,而是使用最原始的的Telnet客户端来完成邮件的发送过程,Telnet是一个Window自带的网络客户端程序,通过它可以连接上互联网上面的任意一台主机。

      使用telnet客户端连接到搜狐的smtp服务器,如下图所示:

      

      通过telnet客户端发Email,如下图所示:

       

      我们登录到<xdp_gacl@sina.cn>邮箱当中,就可以收取到由<gacl@sohu.com>发送的Email了,如下图所示:

      

      这就是使用Smtp协议发送邮件的过程。

    三、使用POP3协议接收邮件

    3.1、POP3协议讲解

      POP3协议规定了收取邮件时要做以下几件事

    ①、输入用户名和密码登录到POP3服务器,用户名和密码不需要经过Base64加密

      user username --登录邮箱的用户名
      pass password --登录邮箱使用的密码

    ②、使用retr命令收取邮件
      retr 数字 收取邮件,retr 1表示收取邮箱当中的第一封邮件,这是POP3协议里面最重要的一个命令。

      在使用retr命令收取邮件之前,可以使用如下的两个命令查看一下邮箱里面的邮件的一些相关信息。

      stat

        返回邮箱里面的邮件数量以及邮件占用的空间大小信息
      list 数字

        返回某一封邮件的统计信息

    ③、邮件收取完成之后使用quit命令断开与POP3服务器的连接。
      quit 断开与POP3服务器的连接

    3.2、使用POP3协议手工接收邮件

      收取邮件我们也不借助任何第三方客户端工具,而是使用Telnet客户端连接到POP3服务器进行收取。

      例如:现在我的搜狐邮箱当中有这样的一封邮件,如下图所示:

      

      现在我们不用使用foxmail或者outLook这样的客户端工具去收取,而是使用Telnet客户端连接到搜狐的POP3服务器去手工收取。

      1、使用Telnet连接上搜狐的POP3服务器,使用命令:telnet pop3.sohu.com 110,如下图所示:

      

      根据POP3协议规定的邮件收取步骤来收取邮件。如下图所示:

      

      可以看到,我们POP3协议纯手工从搜狐的POP3服务器当中收取回来了一封Email,Email里面的内容都经过了Base64编码处理,下面我们写一个小程序将经过Base64编码后的邮件内容进行解码,还原回邮件的内容,代码如下:

    复制代码
    复制代码
     1 package me.gacl.encrypt;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 
     7 import sun.misc.BASE64Decoder;
     8 import sun.misc.BASE64Encoder;
     9 
    10 public class Base64Encrypt {
    11 
    12     public static void main(String args[]) throws IOException{
    13         /*System.out.print("请输入用户名:");
    14         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    15         String userName = in.readLine();
    16         System.out.print("请输入密码:");
    17         String password = in.readLine();
    18         BASE64Encoder encoder = new BASE64Encoder();
    19         System.out.println("编码后的用户名为:" + encoder.encode(userName.getBytes()));
    20         System.out.println("编码后的密码为:" + encoder.encode(password.getBytes()));*/
    21         
    22         BASE64Decoder decoder = new BASE64Decoder();
    23         //邮件主题的Base64编码
    24         String emailSubject = "=?GBK?B?08q8/rLiytQ=?=";
    25         //邮件文本内容的Base64编码
    26         String emailPlainContent = "vPK1pbXE08q8/reiy82y4srUo6E=";
    27         //带html标签和邮件内容的Base64编码
    28         String emailHtmlContent = "PFA+vPK1pbXE08q8/reiy82y4srUo6E8L1A+";
    29         //将使用Base64编码过后的文本内容再使用Base64来解码
    30         emailSubject = new String(decoder.decodeBuffer(emailSubject),"GBK");
    31         emailPlainContent = new String(decoder.decodeBuffer(emailPlainContent),"GBK");
    32         emailHtmlContent = new String(decoder.decodeBuffer(emailHtmlContent),"GBK");
    33         System.out.println("邮件标题:"+emailSubject);
    34         System.out.println("邮件内容:"+emailPlainContent);
    35         System.out.println("带html标签的邮件内容:"+emailHtmlContent);
    36     }
    37 }
    复制代码
    复制代码

      运行结果如下:
      

      这就是使用POP3协议收取邮件的过程。

      以上就是邮件的发送与接收原理的相关内容,这一篇文章主要是介绍邮件发送和接收过程中使用到的smtp协议和pop3协议。没有涉及到太多代码方面的东西,后面会具体介绍使用JavaMail来进行邮件发送。

    原文连接:https://www.cnblogs.com/panxuejun/p/10094152.html

    IMAP(Internet Message Access Protocol,因特网邮件读取协议)是一个应用层协议,用来从本地邮件客户端访问远程服务器上的邮件。

    测试代码下载

    IMAP和POP3是邮件访问最为普遍的Internet标准协议。事实上绝大多数现代的邮件客户端和服务器都对两者给予支持。IMAP现在的版本是"IMAP第四版第一次修订版"(IMAP4rev1),在RFC3501中定义。

    相对于POP3,IMAP提供了一些重要的功能:

    1、支持连接和断开两种操作模式。

    2、支持多个客户同时连接到一个邮箱。

    3、支持访问消息中的MIME部分和部分获取。

    4、支持在服务器保留消息状态信息。

    5、支持在服务器上访问多个邮箱。

    6、支持服务器端搜索。

    7、支持一个定义良好的扩展机制。

    不像大多数旧的Internet协议,IMAP4原生支持加密注册机制。IMAP4中也支持明文传输密码。因为加密机制的使用需要客户端和服务器双方的一致,明文密码的使用是在在一些客户端和服务器类型不同的情况下(例如Microsoft Windows客户端和非Windows服务器)。使用SSL也可以对IMAP4的通信进行加密,通过将在SSL上的IMAP4通信通过993端口传输或者在IMAP4线程创建的时候声明 " " "、"STARTTLS"。

    IMAP4使用端口143在TCP/IP连接上工作。

    .NET 框架中没有封装IMAP的相关操作,故继续使用第三方组件LumiSoft.Net。

    LumiSoft.Net是一个开源的组件,实现了很多协议,源代码是学习网络协议的不错的参考资料。

    测试代码:

    复制代码
            private static void fnIMAPDemo()
            {
                IMAP_Client client = new IMAP_Client();
                FileStream log = new FileStream(@"C:log.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                StreamWriter sw = new StreamWriter(log);

                try
                {
                    //连接邮件服务器通过传入邮件服务器地址和用于IMAP协议的端口号
                    client.Connect("imap.gmail.com", 993, true);
                    client.Login("mymbrooks", "******");

                    IMAP_Client_FetchHandler fetchHandler = new IMAP_Client_FetchHandler();
                    fetchHandler.Rfc822 += new EventHandler<IMAP_Client_Fetch_Rfc822_EArgs>(delegate(object s, IMAP_Client_Fetch_Rfc822_EArgs e)
                    {
                        MemoryStream storeStream = new MemoryStream();
                        e.Stream = storeStream;
                        e.StoringCompleted += new EventHandler(delegate(object s1, EventArgs e1)
                        {
                            storeStream.Position = 0;
                            Mail_Message mime = Mail_Message.ParseFromStream(storeStream);
                            sw.WriteLine(mime.BodyText);
                        });
                    });

                    //获取邮件
                    IMAP_SequenceSet seqSet = new IMAP_SequenceSet();
                    seqSet.Parse("1:*");

                    IMAP_r_u_List[] list = client.GetFolders(null);
                    foreach (IMAP_r_u_List l in list)
                    {
                        client.SelectFolder(l.FolderName);

                        client.Fetch(
                                true,
                                seqSet,
                                new IMAP_Fetch_DataItem[]{
                                    new IMAP_Fetch_DataItem_Rfc822()
                                                },
                                fetchHandler
                            );
                    }
                }
                catch
                {

                }
                finally
                {
                    sw.Flush();
                    sw.Close();
                    log.Close();
                }
            }
    复制代码

    我将Gmail中的邮件写入到了C:log.txt文件里:

    hMail Server 配置

    hMail Server 是Windows下的一款免费邮件服务器,支持SMTP、POP3、IMAP协议,官方主页:http://www.hmailserver.com/

    我使用的是最新测试版:hMailServer 5.3.4 - 1913

    支持SQL Server、MySQL、PgSQL数据库,安装时需要注意一下,SQL Server很简单,若使用的MySQL,需要将MySQL x86 lib目录下的一个dll复制过去,PgSQL 我在Windows Server 2008 R2 SP1上无法安装成功,有点bug。

    首先添加一个domain:

    由于只是测试,我使用了127.0.0.1,添加了两个测试账户:user1@127.0.0.1、user2@127.0.0.1。

    配置一下 SMTP、POP3、IMAP协议:

    其他选项默认即可,可扩展性很强,可以配置访问规则、DNS、反病毒、日志等,功能很强大。结合DNS服务器完全可以当做一个小型的企业级邮件服务器使用。

    配置好了服务端,下面配置一下客户端,我用的ThunderBird:

    将刚才设置的user1、user2添加进来:

    发送邮件试试:

    可以看到,顺利收到了邮件:

    小结:

    IMAP是目前获取邮件的事实上的标准,绝大多数邮件服务提供商均支持加密的IMAP服务,建议在工作生活中使用IMAP(SSL、TLS)来收取邮件。LumiSoft.Net提供了大量封装好的组件,很有研究价值,有兴趣的朋友可以深入研究。最后简单介绍了下hMail Server的安装与配置,在Windows下可以快速的搭建一个小型的企业级邮件服务器,给很多中小企业带来了福音。

    原文连接:https://www.cnblogs.com/brooks-dotnet/archive/2011/03/20/1989463.html

  • 相关阅读:
    /etc/fstab 参数详解及如何设置开机自动挂载
    spring: 创建环绕通知
    spring: 使用Aspectj代理EnabelAspectjAutoProxy
    jsp: jstl标签库 uri标签
    jsp:jstl标签forTokens
    spring: @Pointcut给重复的注解/切点定义表达式
    js:for循环ul/li,获取当前被点击元素的id,以及给其他li设置属性
    jsp:forEach标签
    jsp:choose 、when 和 和 otherwise 一组标签
    windows7下docker配置镜像加速
  • 原文地址:https://www.cnblogs.com/guantou1992/p/12856251.html
Copyright © 2020-2023  润新知