《互联网程序设计(Java)》——课程笔记9:邮件发送程序设计

版权声明: https://blog.csdn.net/bensonrachel/article/details/83684162

学会网络邮件发送的程序设计技术。  

   网络程序设计的精髓是什么?

   就是客户端和服务器的对话和响应契约(协议)。 简单邮件传输协议SMTP可以很好地诠释这一点。

   邮件传输协议包括SMTP(简单邮件传输协议,RFC821)及其扩充协议MIME;

   邮件接收协议包括POP3和功能更强大的IMAP协议。

25端口(SMTP):25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。

如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的25号端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。

110端口(POP3):110端口是为POP3(Post Office Protocol Version 3,邮局协议3)服务开放的,是用于接收邮件的。

   服务邮件发送的服务器其端口为25,服务邮件接收的服务器其端口为110。

SMTP协议、POP2协议、POP3协议、IMAP协议都是不安全的协议

按SMTP过程,要成功地发送和接收邮件,用户名和密码需要BASE64编码后才能有效传输:

 

public  class BASE64Encoder.java{
       public static void main(String args[]){
    String username=“你的邮箱用户名”;
    String password= “你的邮箱密码”;
 
   username = new sun.misc.BASE64Encoder().encode(username.getBytes());
   password = new sun.misc.BASE64Encoder().encode(password.getBytes());
 
    System.out.println(username);//显示用户名的编码结果
      System.out.println(userpass);//显示密码的编码结果  
}
}
 

手动体验SMTP协议过程

 

打开操作系统的命令行窗口,键入:telnet smtp.163.com 25(完成三次握手连接),然后完成如下的对话过程,或者用我们以前的TCPThreadClient对话窗口程序,完成如下的对话过程,其中加粗字体是必须的且一致的.

HELO  hostname// hostname可以是IP或其他别名

AUTH LOGIN

 //在输入AUTH LOGIN回车后,先粘贴BASE64Encoder程序编码的用户名;

//再粘贴编码的用户密码;

//旧式邮件服务器不需要身份验证,可跳过

MAIL FROM:<your mail address> //在这里填写自己的邮箱地址

RCPT TO:<your mail address>  //在这里填写自己的邮箱地址,便于接收和验证

DATA       

 I am 李四.    //在输入DATA回车后,接下来开始发送邮件内容

.  //在邮件正文发送完毕后,单独用一行输入一个小圆点,作为结束标志,然后回车

QUIT   //结束通信(含4次握手断开)。

 

 

程序设计第二步:体验SMTP协议过程2:

(1)使用原有的TCPClient.java程序;

(2)原TCPClientThreadJFrame.java对话窗口程序,复制并命名为TCPMailClientJFrame.java,并添加针对用户名和密码的Base64编码功能。

(3)运行TCPMailClientJFrame.java程序,按照如下的对话顺序,给自己成功发送邮件。

TCPMailClient tmc = new TCPMailClient(ip,port);
            tmc.send("HELO abc");
            tmc.send("AUTH LOGIN");
            
            String username ="";
            String password = "";//"";
        
            String msg = new sun.misc.BASE64Encoder().encode(username.getBytes());
            tmc.send(msg);
            
            msg = new sun.misc.BASE64Encoder().encode(password.getBytes());
            tmc.send(msg);
            
            msg = "MAIL FROM:<" + jTextField3.getText() + ">";
            
            tmc.send(msg);
            
            msg = "RCPT TO:<" + jTextField4.getText() + ">";
            tmc.send(msg);
            
            msg = "data";
            tmc.send(msg);
            
            msg = "subject:"+jTextField5.getText();
            tmc.send(msg);
            
            msg = jTextArea1.getText();
            tmc.send(msg);
            
            tmc.send(".");
            
            tmc.send("quit");
            

 

记得telnet 也是启用一个socket,所以是模拟了命令行的操作,每一步要sleep200ms。

  public void send(String msg)
    {
        pw.println(msg);//写入网卡输出流,由系统调用底层函数,经网卡输出
        
        try
        {
            Thread.sleep(200);
            
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    

 

程序设计进阶之二:POP3(110)电子邮件接收协议

  telnet   pop.qq.com 110

    user 放你的用户名

    pass 放你的密码 //一些安全级别高的邮箱已经不支持,需要加密通道SSL传输

    stat 或list //查看邮件情况

retr 1 //看第一份邮件

 

quit //退出

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/bensonrachel/article/details/83684162