本文章内容——通过java语言以最简单的方式实现邮件发送功能。
文章目的是能够引导读者成功发送邮件,将在帮助理解邮箱发送的同时,附上最简单的实例代码,并尽可能简洁明了。
首先了解发送邮件之原理(不需要了解的可以跳过):
首先介绍SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组由源地址向目标地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。
SMTP服务器即是遵循SMTP协议的邮件发送服务器,用来发送或中转电子邮件。
更加简单的理解方式,可以这样总结 —— SMTP协议:地址获取者,寻找者。 SMTP服务器:邮件转发者。 以上构成对JAVA何以实现邮件发送之最基础解答。
图:发送SMTP邮件的基本原理
了解了SMTP服务器之后,我们要完成邮件发送的功能,只需要完成三个步骤——
1:完成开发准备
2:配置SMTP服务器
3:在JAVA中配置发件人的信息与收件人信息
1:完成开发准备
需要发件与收件邮箱 并开启SMTP服务 下图以网易163邮箱举例:
重点注意:第一次设置SMTP需要设置客户端授权密码(和邮箱登录密码不同),此后代码中的发件人密码以客户端为准。
需要导入一个JAR包(javax.mail.jar) 附上Jar包下载地址:http://www.oracle.com/technetwork/java/javamail/index-138643.html
2:配置SMTP服务器
为方便调用,首先创造一个邮件发送工具类。
邮件发送工具MailUtil包含两个方法,第一个方法用来完成SMTP服务器配置及邮件发送,第二个方法用来生成一封邮件实例。
代码已作了详细的注释,此处不作过多解释。
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.util.Date;
import java.util.Properties;
/**
* @创建人 Levi
* @功能描述 邮件发送工具
* @创建时间 2018-07-18 14:08:08
*/
public class MailUtil {
/**
* SMTP服务器配置及邮件发送
* @throws Exception
*/
public void sendMail(MailConfig mc) throws Exception {
try{
// 连接邮件服务器的参数配置
Properties props = new Properties();
// 设置用户的认证方式
props.setProperty("mail.smtp.auth", "true");
// 设置传输协议(JavaMail规范要求)
props.setProperty("mail.transport.protocol","smtp");
// 设置发件人的SMTP服务器地址
props.setProperty("mail.smtp.host", "smtp.163.com");
// 设置SMTP服务器端口 一般填写:25
props.setProperty("mail.smtp.port","25");
// 创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getInstance(props);
// 设置调试信息在控制台打印出来
session.setDebug(true);
// 创建邮件的实例对象
Message msg = getMimeMessage(session,mc);
// 根据session对象获取邮件传输对象Transport
Transport transport = session.getTransport();
// 设置发件人的账户名和密码
if(mc.getSenderAccount()==null || mc.getSenderAccount().isEmpty()){
throw new Exception("发件人账户为空");
}
if(mc.getSenderPassword()==null || mc.getSenderPassword().isEmpty()){
throw new Exception("发件人密码为空");
}
transport.connect(mc.getSenderAccount(), mc.getSenderPassword());
// 发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(msg,msg.getAllRecipients());
// 关闭邮件连接
transport.close();
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 获取邮件的实例对象
* @param session
* @return MimeMessage
* @throws MessagingException
* @throws AddressException
*/
private MimeMessage getMimeMessage(Session session,MailConfig mc) throws Exception{
// 创建一封邮件的实例对象
MimeMessage msg = new MimeMessage(session);
// 设置发件人地址
if (mc.getSenderAddress()!=null && !mc.getSenderAddress().isEmpty()){
msg.setFrom(new InternetAddress(mc.getSenderAddress()));
}else{
throw new Exception("发件人地址为空");
}
/**
* 设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
* MimeMessage.RecipientType.TO:发送
* MimeMessage.RecipientType.CC:抄送
* MimeMessage.RecipientType.BCC:密送
*/
if (mc.getRecipientAddresses()!=null && !mc.getRecipientAddresses().isEmpty()){
InternetAddress[] recipients = new InternetAddress().parse(mc.getRecipientAddresses());
msg.setRecipients(MimeMessage.RecipientType.TO, recipients);
}else{
throw new Exception("收件人地址为空");
}
if (mc.getCopyToAddresses()!=null && !mc.getCopyToAddresses().isEmpty()){
InternetAddress[] copyTos = new InternetAddress().parse(mc.getCopyToAddresses());
msg.setRecipients(MimeMessage.RecipientType.CC,copyTos);
}
// 设置邮件主题
if (mc.getSubject()!=null && !mc.getSubject().isEmpty()){
msg.setSubject(mc.getSubject(),"UTF-8");
}else{
throw new Exception("邮件主题为空");
}
//设置邮件正文
// 设置(文本+图片)和 附件 的关系(合成一个大的混合"节点" / Multipart )
MimeMultipart mm = new MimeMultipart();
// 混合关系
mm.setSubType("mixed");
// 创建附件"节点"
MimeBodyPart body = new MimeBodyPart();
if (mc.getContent()!=null && !mc.getContent().isEmpty()){
body.setContent(mc.getContent(), "text/html;charset=UTF-8");
}else{
throw new Exception("邮件内容为空");
}
mm.addBodyPart(body); // 如果有多个附件,可以创建多个多次添加
if(mc.getAttachmentPaths()!=null && mc.getAttachmentPaths().length>0){
for (String attachmentPath: mc.getAttachmentPaths()) {
// 创建附件"节点"
MimeBodyPart attachment = new MimeBodyPart();
// 读取本地文件
DataHandler dh = new DataHandler(new FileDataSource(attachmentPath));
// 将附件数据添加到"节点"
attachment.setDataHandler(dh);
// 设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dh.getName()));
mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加
}
}
// 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象)
msg.setContent(mm);
// 设置邮件的发送时间,默认立即发送
msg.setSentDate(new Date());
msg.saveChanges();
return msg;
}
}
3:在JAVA中配置邮件内容
配置完SMTP服务器内容后,我们将配置邮件内容(包括发件人,收件人信息,邮件主题,内容等)
首先构建邮件实体类
public class MailConfig {
//发件人地址
private String senderAddress;
//发件人账户名
private String senderAccount;
//发件人账户密码
private String senderPassword;
/**
* 收件人地址,多个以","隔开
*/
private String recipientAddresses;
/**
* 抄送人地址,多个以","隔开
*/
private String copyToAddresses;
//邮件标题
private String subject;
//邮件正文
private String content;
//附件路径
private String[] attachmentPaths;
public String getSenderAddress() {
return senderAddress;
}
public void setSenderAddress(String senderAddress) {
this.senderAddress = senderAddress;
}
public String getSenderAccount() {
return senderAccount;
}
public void setSenderAccount(String senderAccount) {
this.senderAccount = senderAccount;
}
public String getSenderPassword() {
return senderPassword;
}
public void setSenderPassword(String senderPassword) {
this.senderPassword = senderPassword;
}
public String getRecipientAddresses() {
return recipientAddresses;
}
public void setRecipientAddresses(String recipientAddresses) {
this.recipientAddresses = recipientAddresses;
}
public String getCopyToAddresses() {
return copyToAddresses;
}
public void setCopyToAddresses(String copyToAddresses) {
this.copyToAddresses = copyToAddresses;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String[] getAttachmentPaths() {
return attachmentPaths;
}
public void setAttachmentPaths(String[] attachmentPaths) {
this.attachmentPaths = attachmentPaths;
}
}
然后,配置邮件的具体内容 并调用邮件发送工具类。
public class MailSend {
//采用单例以提供持久可用的工具类对象
static MailUtil mu = new MailUtil();
public static void main(String arg[]){
try {
MailConfig mc = new MailConfig();
//设置发件人地址
mc.setSenderAddress("sender@163.com");
//设置发件人账户名
mc.setSenderAccount("sender@163.com");
//设置发件人密码(备注:密码需要用邮箱SMTP客户端授权密码,而非登录密码,此处需注意)
mc.setSenderPassword("mypassword");
//设置邮件主题
mc.setSubject("邮件发送测试");
//设置收件人地址,多个地址可用逗号隔开
mc.setRecipientAddresses("xx@qq.com,xxx@163.com");
//设置抄送人地址,多个地址可用逗号隔开
mc.setCopyToAddresses("xxxx@qq.com");
//设置邮件内容
mc.setContent("邮件发送成功啦!");
//设置附件地址,多个附件地址用逗号隔开
String[] s = {"C:/测试附件1.txt","C:/测试附件2.pdf"};
mc.setAttachmentPaths(s);
//邮件信息配置完毕,调用MailUtil发送邮件。
mu.sendMail(mc);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行以上代码,邮件即可成功发送。
提示:本文展示演示代码,若需要实际测试,代码中的“账号”和“密码”需更换为自己所使用的邮箱。
代码GIT CLONE地址:https://github.com/ooo8866923/MailSend.git
以上仅为邮件发送功能的简单实现,若需进阶拓展,或了解底层,需要更进一步查阅相关书籍和网站。
本人能力有限,若文章存在纰漏,或对该文章有任何疑问,批评,建议,衷心渴望您的指教。
本文结束,感谢浏览。