Java发送邮件
一、邮件概述
(1)收发邮件
发邮件大家都会吧!发邮件是从客户端把邮件发送到邮件服务器,收邮件是把邮件服务器的邮件下载到客户端。
我们在163、126、QQ等网站注册的Email账户,其实就是在邮件服务器中注册的。这些网站都有自己的邮件服务器。
(2)邮件协议
与HTTP协议相同,收发邮件也是需要有传输协议的。
- SMTP:(Simple Mail Transfer Protocol,简单邮件传输协议)发邮件协议;
- POP3:(Post Office Protocol Version 3,邮局协议第3版)收邮件协议;
(3)理解邮件收发过程
其实你可以把邮件服务器理解为邮局!如果你需要给朋友寄一封信,那么你需要把信放到邮筒中,这样你的信会“自动”到达邮局,邮局会把信邮到另一个省市的邮局中。然后这封信会被送到收信人的邮箱中。最终收信人需要自己经常查看邮箱是否有新的信件。
其实每个邮件服务器都由SMTP服务器和POP3服务器构成,其中SMTP服务器负责发邮件的请求,而POP3负责收邮件的请求。
例如163向162发送邮件:
(4)邮件服务器名称
smtp服务器的端口号为25,服务器名称为smtp.xxx.xxx。
pop3服务器的端口号为110,服务器名称为pop3.xxx.xxx。
例如:
- 163:smtp.163.com和pop3.163.com
- 126:smtp.126.com和pop3.126.com
- qq:smtp.qq.com和pop3.qq.com
- sina:smtp.sina.com和pop3.sina.com
JavaMail
- Java Mail是由SUN公司提供的专门针对邮件的API,导包:
mail.jar、activation.jar
- JavaMail中主要类:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport
(1)Session:表示会话,即客户端与邮件服务器之间的会话!想获得会话需要给出账户和密码,当然还要给出服务器名称。在邮件服务中的Session对象,就相当于连接数据库时的Connection对象。
(2)MimeMessage:表示邮件类,它是Message的子类。它包含邮件的主题(标题)、内容,收件人地址、发件人地址,还可以设置抄送和暗送,甚至还可以设置附件。
(3)Transport:用来发送邮件。
JavaMail实现发邮件
第一步:获得Session
Properties prop = new Properties();
prop.setProperty(“mail.host”, “smtp.163.com”);//设置服务器主机名
prop.setProperty(“mail.smtp.auth”, “true”);//设置需要认证
//Authenticator是一个接口表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账户和密码。
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication () {
new PasswordAuthentication(“xxx”, “xxxx”);//用户名和密码
}
};
//最后得到session
Session session = Session.getInstance(prop, auth);
第二步:创建MimeMessage对象
创建MimeMessage需要使用Session对象来创建
MimeMessage msg = new MimeMessage(session);
//然后需要设置发信人地址、收信人地址、主题,以及邮件正文。
msg.setFrom(new InternetAddress(“xxxxx@163.com”));//设置发信人
msg.addRecipients(RecipientType.TO, “xxxx@qq.com”);//设置收信人
msg.setSubject(“这是一封测试邮件”);//设置主题(标题)
msg.setContent(“测试邮件啊啊啊啊!”, “text/plain;charset=utf-8”);//设置正文
第三步:发送邮件
Transport.send(msg);//发送邮件
源代码
比如我的163邮箱向qq邮箱发送邮件
/*
原创:C位出道丶
*/
@Test
public void fun(){
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.163.com");//设置服务器主机名
prop.setProperty("mail.smtp.auth", "true");//设置需要认证
//Authenticator是一个接口表示认证器,即校验客户端的身份。我们需要自己来实现这个接口,实现这个接口需要使用账户和密码。
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication () {
return new PasswordAuthentication("用户名","授权码");
}
};
//最后得到session
Session session = Session.getInstance(prop, auth);
MimeMessage msg = new MimeMessage(session);
//然后需要设置发信人地址、收信人地址、主题,以及邮件正文。
try {
msg.setFrom(new InternetAddress("xxxx@163.com"));//设置发信人
msg.addRecipients(RecipientType.TO, "xxxxx@qq.com");//设置收信人
msg.setSubject("这是一封测试邮件");//设置主题(标题)
msg.setContent("今天是五四青年节!!", "text/plain;charset=utf-8");//设置正文
//发送邮件
Transport.send(msg);//发送邮件
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
注意:PasswordAuthentication(“用户名”,“授权码”); 这里的参数第一个填写自己的邮箱用户名 例如邮箱为123456@163.com就填123456,第二个参数应该填写授权码(授权码是用于登录第三方邮件客户端的专用密码),自己可以去邮箱生成授权码。代码中我自己的用户名和授权码由于隐私问题去掉了,同时我的QQ邮箱和163邮箱也去掉了
效果
163邮箱发邮件:
QQ邮箱收邮件: