在Java中,我们可以使用JavaMail,基于SMTP协议轻松实现邮件发送。
首先我们来认识一下SMTP协议
SMTP
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议一样,SMTP也存在两个 端:在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。
SMTP协议与人们用于面对面交互的礼仪之间有许多相似之处。首先,运行在发送端邮件服务器主机上的SMTP客户,发起建立一个到运行在接收端邮件服务 器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作,SMTP客户就等待一段时间后再尝试建立该连接。SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样,SMTP客户和服务器也在传送信息之前先自我介绍一下。 在这个SMTP握手阶段,SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后,客户发出邮件消息。
准备
1、引入外部jar包
在编写代码发送邮件之前,我们需要引入JavaMail API和Java Activation Framework (JAF) 。可以新建一个maven项目,在pom.xml里引入相关依赖:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.habitdiary</groupId>
<artifactId>JMail</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
</project>
2、在QQ邮箱开启POP3/SMTP服务
本实例以 QQ 邮件服务器为例,你需要在登录QQ邮箱后台在“设置”=》“账号”中开启POP3/SMTP服务 ,如下图所示:
我们会得到一个授权码,记录下来,之后发送邮件时用于代替密码进行用户认证。
发送邮件代码
不多说,直接上代码,具体细节见注释:
import com.sun.mail.util.MailSSLSocketFactory;
import java.util.*;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
/**
*JavaMail发送邮件:前提是QQ邮箱里帐号设置要开启POP3/SMTP协议
*/
public class SendEmail {
public static void main(String[] args) throws Exception {
//创建Properties对象
Properties prop = new Properties();
// 开启debug调试,以便在控制台查看
prop.setProperty("mail.debug", "true");
// 设置邮件服务器主机名为QQ邮箱的服务器主机名
prop.setProperty("mail.host", "smtp.qq.com");
// 发送服务器需要身份验证
prop.setProperty("mail.smtp.auth", "true");
// 设置发送邮件协议名称为SMTP(Simple Mail Transfer Protocol)
prop.setProperty("mail.transport.protocol", "smtp");
// 开启SSL加密,否则会失败
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
// 创建session
Session session = Session.getInstance(prop);
// 通过session得到transport对象
Transport ts = session.getTransport();
// 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全)
ts.connect("smtp.qq.com","573668878", 16位授权码);
// 创建邮件
Message message1 = createSimpleMail(session);
Message message2 = createMailWithHtml(session);
Message message3 = createMailWithResource(session);
// 发送邮件
ts.sendMessage(message1, message1.getAllRecipients());
ts.sendMessage(message2, message2.getAllRecipients());
ts.sendMessage(message3, message3.getAllRecipients());
ts.close();
}
/**
* @Method: createSimpleMail
* @Description: 创建一封只包含文本的邮件
*/
public static MimeMessage createSimpleMail(Session session)
throws Exception {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 指明邮件的发件人
/*如果你想发送一封e-mail给多个收件人,那么使用下面的方法来指定多个收件人ID:
void addRecipients(Message.RecipientType type,
Address[] addresses) throws MessagingException
type:要被设置为 TO, CC 或者 BCC,这里 CC 代表抄送、BCC 代表秘密抄送。
举例:Message.RecipientType.TO
addresses: 这是 email ID 的数组。在指定电子邮件 ID 时,你将需要使用 InternetAddress() 方法。
*/
message.setFrom(new InternetAddress("573668878@qq.com"));
// 指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("573668878@qq.com"));
// 邮件的标题
message.setSubject("JavaMail发送简单文本邮件");
// 邮件的文本内容
message.setContent("这是一封JavaMail发送的简单文本邮件!", "text/html;charset=UTF-8");
// 返回创建好的邮件对象
return message;
}
/**
* @Method: createMailWithHtml
* @Description: 创建一封HTML邮件
*/
public static MimeMessage createMailWithHtml(Session session)
throws Exception {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 指明邮件的发件人
message.setFrom(new InternetAddress("573668878@qq.com"));
// 指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("573668878@qq.com"));
// 邮件的标题
message.setSubject("JavaMail发送HTML邮件");
// 邮件的文本内容
message.setContent("<h1>这是一封JavaMail发送的HTML邮件!</h1>", "text/html;charset=UTF-8");
// 返回创建好的邮件对象
return message;
}
/**
* @Method: createMailWithResource
* @Description: 创建一封包含附件的邮件
*/
public static MimeMessage createMailWithResource(Session session)
throws Exception {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 指明邮件的发件人
message.setFrom(new InternetAddress("573668878@qq.com"));
// 指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("573668878@qq.com"));
// 邮件的标题
message.setSubject("JavaMail发送带附件的邮件");
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText("这是一封JavaMail发送的带附件的邮件!");
// 创建多重消息
Multipart multipart = new MimeMultipart();
// 设置文本消息部分
multipart.addBodyPart(messageBodyPart);
// 附件部分
messageBodyPart = new MimeBodyPart();
String filename = "./resource/img.jpg";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// 发送完整消息
message.setContent(multipart);
return message;
}
}