一、E-Mail协议简介
1、邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器 和 接收邮件的服务器。
2、发送邮件的服务器使用发送协议,现在常用的是SMTP协议。所以,通常发邮件的服务器也称为SMTP服务器。
3、接收邮件的服务器使用接收协议,现在常用的是POP3协议或IMAP协议,所以通常也被称为POP3或IMAP服务器。
4、目前经常见到的服务器为SMTP和POP3服务器。如大家在注册了126的邮箱之后,它的发邮件服务器为smtp.126.com:25,而收邮件服务器则为pop3.126.com:110.(冒号后面的为端口号)。
5、当然,发邮件服务器和收邮件服务器也可能是同一台主机,但端口号一定不相同。默认发邮件服务器的端口为25,收邮件的端口为110.
邮件发送的工作图:
二、邮件收/发协议
1、SMTP协议-发邮件协议:
全称为Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。端口一般为25.
2、POP3协议-收邮件协议
全称为Post Office Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。端口一般为110.
3、IMAP协议-对POP3的扩展
全称为Internet Message Access Protocal(Internet消息访问协议),它是对POP3协议的一种扩展,定义了邮件客户端软件与IMAP服务器的通讯规则。
三、SMTP发邮件协议的命令
四、POP3协议的命令
五、通过命令行发送邮件的步骤如下
※发邮件
telnet smtp.sina.com 25
ehlo hncu
auth login
aG5jdWphdmE=
aG5jdTEyMzQ1Njc=
mail from:hncujava@sina.com
rcpt to:hncujava@126.com
data
from:hncujava@sina.com
to:hncujava@126.com
subject:hncu mail test
[空行]
hello hncu, are you OK?!
. //邮件结束符
六、通过命令行接收邮件的步骤如下
※收邮件(sina成功)
telnet pop3.sina.com 110
user hncujava
pass hncu*****7
stat //显示总体信息
list //列出所有信件
retr n //收取序号为n的邮件
quit
七、通过Java发邮件
1、利用sun.misc.BASE64Encoder类编码用户名和密码:
package cn.hncu.base64;
import sun.misc.BASE64Encoder;
public class Base64EncoderDemo {
public static void main(String[] args) {
String name= "hncujava";
String pwd = "hncu1234567";
BASE64Encoder en = new BASE64Encoder();
name = en.encode(name.getBytes());
pwd = en.encode(pwd.getBytes());
System.out.println("name : "+name+"\npwd : "+pwd);
}
}
/*结果:
name : aG5jdWphdmE=
pwd : aG5jdTEyMzQ1Njc=
*/
2、如果sun.misc.BASE64Encoder找不到,请这样做:
3、用Java代码发送邮件:
@Test //发送: 纯文本内容的邮件
public void send1() throws Exception{
Properties p = new Properties();
p.setProperty("mail.host", "smtp.sina.com");
p.setProperty("mail.smtp.auth", "true");//认证登录
Session session = Session.getDefaultInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("hncujava","hncu1*****7");
}
});
session.setDebug(true);//以debug方式(应答方式)进行通讯
//准备邮件
MimeMessage msg = new MimeMessage(session); //从session中创建邮件
msg.setFrom( new InternetAddress("hncujava@sina.com") );
msg.setRecipient(RecipientType.TO, new InternetAddress("hncujava@126.com"));
msg.setSubject("邮件的主题OKOK!");
msg.setContent("这是第一次用Java发邮件,请多多关照....", "text/plain;charset=utf-8"); //纯文本格式的内容
//msg.setContent("这是第一次用<a href='http://www.baidu.com?age=20'>Java发邮件</a>,请多多关照....", "text/html;charset=utf-8"); //html格式的内容
//发送邮件
Transport.send(msg);
}
4、用Java发送带有附件的邮件:
@Test //发送:文本内容+附件
public void send2() throws Exception{
Properties p = new Properties();
p.setProperty("mail.host", "smtp.sina.com");
p.setProperty("mail.smtp.auth", "true");//认证登录
Session session = Session.getDefaultInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("hncujava","hncu*****7");
}
});
session.setDebug(true);//以debug方式(应答方式)进行通讯
//准备邮件
MimeMessage msg = new MimeMessage(session); //从session中创建邮件
msg.setFrom( new InternetAddress("hncujava@sina.com") );
msg.setRecipient(RecipientType.TO, new InternetAddress("hncujava@126.com"));
msg.setSubject("邮件的主题OKOK!");
//body1:邮件正文文本内容
MimeBodyPart body1 = new MimeBodyPart();
body1.setContent("这是第一次用<a href='http://www.baidu.com?age=20'>Java发邮件</a>,请多多关照....", "text/html;charset=utf-8"); //html格式的内容
//body2:附件1
MimeBodyPart body2 = new MimeBodyPart();
body2.setDataHandler( new DataHandler( new FileDataSource("./img/a.jpg")));
body2.setFileName( MimeUtility.encodeText("美女1.jpg")); //能够支持中文的附件文件名设置
//body3:附件2
MimeBodyPart body3 = new MimeBodyPart();
body3.setDataHandler( new DataHandler( new FileDataSource("./img/b.jpg")));
body3.setFileName( MimeUtility.encodeText("美女2.jpg")); //不采用编码方式则文件名会中文乱码
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(body1);
multipart.addBodyPart(body2);
multipart.addBodyPart(body3);
msg.setContent(multipart);
//发送邮件
Transport.send(msg);
}