zoukankan      html  css  js  c++  java
  • 利用DOS命令窗口进行Mail通信(二)

    一:SMTP协议(对邮件进行发送)

    <SP>代表空格,<CRLF>代表回车和换行

    SMTP命令格式 说明
    ehlo<SP><domain><CRLF>        ehlo命令是SMTP邮件发送程序与SMTP邮件接收程序建立连接后必须发送的第一条SMTP命令,参数<domain>表示SMTP邮件发送者的主机名。
    ehlo命令用于替代传统SMTP协议中的helo命令。
    auth<SP><para><CRLF>       如果SMTP邮件接收程序需要SMTP邮件发送程序进行认证时,它会向SMTP邮件发送程序提示它所采用的认证方式,SMTP邮件发送程序接着应该使用这个命令回应SMTP邮件接收程序,参数<para>表示回应的认证方式,通常是SMTP邮件接收程序先前提示的认证方式。
    mail<SP>From:<reverse-path><CRLF>     此命令用于指定邮件发送者的邮箱地址,参数<reverse-path>表示发件人的邮箱地址
    rcpt<SP>To:<forword-path><CRLF>      此命令用于指定邮件接收者的邮箱地址,参数<forward-path>表示接收者的邮箱地址。如果邮件要发送给多个接收者,那么应使用多条rcpt<SP>To命令来分别指定每一个接收者的邮箱地址。
    data<CRLF>      此命令用于表示SMTP邮件发送程序准备开始输入邮件内容,在这个命令后面发送的所有数据都将被当做邮件内容,直至遇到“<CRLF>.<CRLF>"标志符,则表示邮件内容结束。
    quit<CRLF>     此命令表示要结束邮件发送过程,SMTP邮件接收程序接收到此命令后,将关闭与SMTP邮件发送程序的网络连接。

     smtp服务器的默认网络监听端口是25。

    在命令行中输入:telnet smtp.163.com 25进行连接

    注意:当我们向服务器进行登入时,默认的是使用Base64编码,我们可以这样编写

    package com.wp.utils;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    import Decoder.BASE64Encoder;
    
    /**
     * base64编码,用于email
     * 
     * @author admin
     * 
     */
    public class Base64Util {
        public static void main(String[] args) throws Exception {
            BASE64Encoder base64 = new BASE64Encoder();
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("please input your email name");
            String username = br.readLine();
            username = base64.encode(username.getBytes());
            System.out.println("username in base64:" + username);
            System.out.println("please input your email pwd");
            String password = br.readLine();
            password = base64.encode(password.getBytes());
            System.out.println("password in base64:" + password);
        }
    }

     二:POP3协议(对邮件进行接收)

    POP3命令格式 说明
    user<SP>username<CRLF>       user 命令是POP3客户端程序与POP3邮件服务器建立连接后通常发送的第一条命令,参数 username 表示收件人的帐户名称。
    pass<SP>password<CRLF>       pass 命令是在user命令成功通过后,POP3客户端程序接着发送的命令,它用于传递帐户的密码,参数 password 表示帐户的密码。
    apop<SP>name,digest<CRLF>       apop 命令用于替代user和pass命令,它以MD5 数字摘要的形式向POP3邮件服务器提交帐户密码。
    stat<CRLF>      stat 命令用于查询邮箱中的统计信息,例如:邮箱中的邮件数量和邮件占用的字节大小等。
    uidl<SP>msg#<CRLF>      uidl 命令用于查询某封邮件的唯一标志符,参数msg#表示邮件的序号,是一个从1开始编号的数字。
    list<SP>[MSG#]<CRLF>      list 命令用于列出邮箱中的邮件信息,参数 msg#是一个可选参数,表示邮件的序号。当不指定参数时,POP3服务器列出邮箱中所有的邮件信息;当指定参数msg#时,POP3服务器只返回序号对应的邮件信息。
    retr<SP>msg#<CRLF>     retr 命令用于获取某封邮件的内容,参数 msg#表示邮件的序号。
    dele<SP>msg#<CRLF>     dele 命令用于在某封邮件上设置删除标记,参数msg#表示邮件的序号。POP3服务器执行dele命令时,只是为邮件设置了删除标记,并没有真正把邮件删除掉,只有POP3客户端发出quit命令后,POP3服务器才会真正删除所有设置了删除标记的邮件。
    rest<CRLF>     rest 命令用于清除所有邮件的删除标记。
    top<SP>msg#<SP>n<CRLF>     top 命令用于获取某封邮件的邮件头和邮件体中的前n行内容,参数msg#表示邮件的序号,参数n表示要返回邮件的前几行内容。使用这条命令以提高 Web Mail系统(通过Web站点上收发邮件)中的邮件列表显示的处理效率,因为这种情况下不需要获取每封邮件的完整内容,而是仅仅需要获取每封邮件的邮件头信息。
    noop<CRLF>     noop 命令用于检测POP3客户端与POP3服务器的连接情况。
    quit<CRLF>     quit 命令表示要结束邮件接收过程,POP3服务器接收到此命令后,将删除所有设置了删除标记的邮件,并关闭与POP3客户端程序的网络连接。

     连接服务器:telnet pop.163.com 110

     三:用IDE工具发送邮件

    package com.wp.emailClient;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    
    /**
     * 用socket发送邮件
     * 
     * @author admin
     * 
     */
    public class EmailClient {
        public static void main(String[] args) throws Exception {
            // telnet smtp.163.com 25。25是163的smtp端口号,110是163的pop3的端口号
            Socket socket = new Socket("smtp.163.com", 25);
            InputStream in = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in));// 接收服务器的反馈信息
            OutputStream out = socket.getOutputStream();// 向服务器发送消息
    
            // 对应图片的7个换行
            out.write("ehlo aaa
    ".getBytes());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
            // 登入
            out.write("auth login
    ".getBytes());// 登入
            System.out.println(br.readLine());
            out.write("MTg3Nzk3NDA1Njk=
    ".getBytes());// 根据base64编码后的用户
            System.out.println(br.readLine());
            out.write("MTUxNzAxNzIxMTJ3dw==
    ".getBytes());// 密码,要在163里面设置第三方客户端授权码(15170172112ww)
            System.out.println(br.readLine());
            // 发件收件人
            out.write("mail from:<18779740569@163.com>
    ".getBytes());// 发件人
            System.out.println(br.readLine());
            out.write("rcpt to:<18779740569@163.com>
    ".getBytes());// 收件人
            System.out.println(br.readLine());
            // data表示开始发内容,'.'表示结束
            out.write("data
    ".getBytes());// 开始
            System.out.println(br.readLine());
            // 遵循RFC822规范
            out.write("from:18779740569@163.com
    ".getBytes());// 从哪到哪
            out.write("to:18779740569@163.com
    ".getBytes());
            out.write("subject:asdasd<主题>
    ".getBytes());// 主题
            out.write("
    ".getBytes());// 换行
            out.write("我给你发信息了,你去看一下
    ".getBytes());// 内容
            out.write(".
    ".getBytes());// 结束
            socket.close();// quit
        }
    }
  • 相关阅读:
    计算1至n中数字X出现的次数
    DOM处理
    SQL Server中日志
    怎样玩转千万级别的数据
    协议的分用以及wireshark对协议的识别
    序列化json对象,通过ajax传入asp.net mvc后台
    新时代的Vim C++自动补全插件 clang_complete
    ASP.NET Web API 接口执行时间监控
    应用之星在线app开发平台,菜鸟也会做应用
    1.11 查找空值
  • 原文地址:https://www.cnblogs.com/lirenzhujiu/p/5927584.html
Copyright © 2011-2022 走看看