学会网络邮件发送的程序设计技术。
网络程序设计的精髓是什么?
就是客户端和服务器的对话和响应契约(协议)。 简单邮件传输协议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 //退出