需求:
使用JavaMail发送邮件,要求实现带多个附件功能。
下面代码可以直接使用,也可以按需优化,实现的功能如下:
- 自定义输出debug信息。
- 自定义开启SSL认证。
*QQ邮箱会自动检测开启,也可以通过setSSLAuth(boolean SSLAuth)方法关闭。 - 发送内容为Html的邮件,支持携带附件,可以同时发送给多个收件人,抄送人,密送人。
代码示例
MailSender类使用Smtp协议,这意味着你需要获得发件服务器的Smtp协议服务器的host地址,可以邮件服务器官网获取。
例如,
网易邮箱:smtp.163.com
QQ邮箱:smtp.qq.com
同时,使用非官方的客户端登录邮箱,需要打开邮箱账户的smtp服务,并且获得发件服务提供商产生的授权码,这里不再过多赘述。
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.security.GeneralSecurityException;
import java.util.Properties;
/**
* 邮件发送器
*
* @version 2.0
*/
public class MailSender {
/**
* 邮件发送地址
*/
private String FROM;
/**
* 邮件发送人名
*/
private String FROM_NAME;
/**
* 授权码
*/
private String PASSWORD;
/**
* 邮件发送人
*/
private String[] TO;
/**
* 邮件抄送人
*/
private String[] CC;
/**
* 邮件密送人
*/
private String[] BCC;
/**
* 邮件smtp协议host地址
*/
private String HOST;
/**
* 是否开启SSL认证,QQ邮箱自动检测开启
*/
private boolean isSSLAuth;
/**
* 是否输出debug,默认开启
*/
private boolean isDebug = true;
public void setDebug(boolean isDebug){
this.isDebug = isDebug;
}
public void setSSLAuth(boolean SSLAuth) {
isSSLAuth = SSLAuth;
}
private MailSender() {
}
/**
* 值得注意的是,在new MailSender()对象时并不支持无参构造,也不强制设置抄送人和密送人。
* <n>
*
* @param FROM 发件人地址
* @param FROM_NAME 发件人名
* @param TO 收件人地址
* @param HOST smtp协议host地址
*/
public MailSender(String FROM, String FROM_NAME, String PASSWORD, String[] TO, String HOST) {
this.FROM = FROM;
this.FROM_NAME = FROM_NAME;
this.PASSWORD = PASSWORD;
this.TO = TO;
this.HOST = HOST;
checkQQMail();
}
/**
* 值得注意的是,在new MailSender()对象时并不支持无参构造,也不强制设置抄送人和密送人。
* <n>
* 更推荐使用public MailSender(String FROM, String FROM_NAME, String PASSWORD, String[] TO, String HOST)方法构造对象,以设置发件人名
*
* @param FROM 发件人地址
* @param PASSWORD 授权码
* @param TO 收件人地址
* @param HOST smtp协议host地址
*/
public MailSender(String FROM, String PASSWORD, String[] TO, String HOST) {
this.FROM = FROM;
this.PASSWORD = PASSWORD;
this.TO = TO;
this.HOST = HOST;
checkQQMail();
}
/**
* 设置抄送人
*
* @param CC 抄送人
*/
public void setCC(String[] CC) {
this.CC = CC;
}
/**
* 设置密送人
*
* @param BCC 密送人
*/
public void setBCC(String[] BCC) {
this.BCC = BCC;
}
public void sendHtmlMail(String subject, String content) throws GeneralSecurityException, MessagingException, UnsupportedEncodingException {
//1.保存配置信息
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.host", HOST);
if (isSSLAuth) {
//*需要SSL认证的邮箱
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
}
//2.建立连接
Session session = Session.getInstance(properties);
//输出Debug信息
session.setDebug(this.isDebug);
//3.创建邮件对象
MimeMessage message = new MimeMessage(session);
//设置发件人
if ("".equals(FROM_NAME)) message.setFrom(FROM);
else message.setFrom(new InternetAddress(FROM, FROM_NAME, "UTF-8"));
//设置收件人
StringBuilder sbTo = new StringBuilder();
for (int i = 0;i< TO.length;i++){
if (i== TO.length-1){
sbTo.append(TO[i]);
}else{
sbTo.append(TO[i]).append(",");
}
}
String to = new String(sbTo);
InternetAddress[] internetAddressTo = InternetAddress.parse(to);
message.setRecipients(MimeMessage.RecipientType.TO,internetAddressTo);
//设置抄送人
if (CC!=null){
StringBuilder sbCC = new StringBuilder();
for (int i = 0;i< CC.length;i++){
if (i== CC.length-1){
sbTo.append(CC[i]);
}else{
sbTo.append(CC[i]).append(",");
}
}
String cc = new String(sbCC);
InternetAddress[] internetAddressCC = InternetAddress.parse(cc);
message.setRecipients(MimeMessage.RecipientType.CC,internetAddressCC);
}
if (BCC!=null){
//设置密送人
StringBuilder sbBCC = new StringBuilder();
for (int i = 0;i< BCC.length;i++){
if (i== BCC.length-1){
sbTo.append(BCC[i]);
}else{
sbTo.append(BCC[i]).append(",");
}
}
String bcc = new String(sbBCC);
InternetAddress[] internetAddressBcc = InternetAddress.parse(bcc);
message.setRecipients(MimeMessage.RecipientType.BCC,internetAddressBcc);
}
message.setSubject(subject, "UTF-8");
message.setContent(content, "text/html;charset=UTF-8");
message.saveChanges();
//用流传送
Transport transport = session.getTransport();
transport.connect(FROM, PASSWORD);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
public void sendHtmlMailWithFiles(String subject, String content, File[] files) throws GeneralSecurityException, MessagingException, UnsupportedEncodingException {
//1.保存配置信息
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");
properties.put("mail.smtp.host", HOST);
if (isSSLAuth) {
//*需要SSL认证的邮箱
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
}
//2.建立连接
Session session = Session.getInstance(properties);
//输出Debug信息
session.setDebug(this.isDebug);
//3.创建邮件对象
MimeMessage message = new MimeMessage(session);
//设置发件人
if ("".equals(FROM_NAME)) message.setFrom(FROM);
else message.setFrom(new InternetAddress(FROM, FROM_NAME, "UTF-8"));
//设置收件人
StringBuilder sbTo = new StringBuilder();
for (int i = 0;i< TO.length;i++){
if (i== TO.length-1){
sbTo.append(TO[i]);
}else{
sbTo.append(TO[i]).append(",");
}
}
String to = new String(sbTo);
InternetAddress[] internetAddressTo = InternetAddress.parse(to);
message.setRecipients(MimeMessage.RecipientType.TO,internetAddressTo);
//设置抄送人
if (CC!=null){
StringBuilder sbCC = new StringBuilder();
for (int i = 0;i< CC.length;i++){
if (i== CC.length-1){
sbTo.append(CC[i]);
}else{
sbTo.append(CC[i]).append(",");
}
}
String cc = new String(sbCC);
InternetAddress[] internetAddressCC = InternetAddress.parse(cc);
message.setRecipients(MimeMessage.RecipientType.CC,internetAddressCC);
}
if (BCC!=null){
//设置密送人
StringBuilder sbBCC = new StringBuilder();
for (int i = 0;i< BCC.length;i++){
if (i== BCC.length-1){
sbTo.append(BCC[i]);
}else{
sbTo.append(BCC[i]).append(",");
}
}
String bcc = new String(sbBCC);
InternetAddress[] internetAddressBcc = InternetAddress.parse(bcc);
message.setRecipients(MimeMessage.RecipientType.BCC,internetAddressBcc);
}
message.setSubject(subject, "UTF-8");
Multipart multipart = new MimeMultipart();
//邮件正文
BodyPart contentPart = new MimeBodyPart();
contentPart.setContent(content, "text/html;charset=utf-8");
multipart.addBodyPart(contentPart);
if (files.length != 0) {
for (File attachment : files) {
BodyPart attachmentPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachment);
attachmentPart.setDataHandler(new DataHandler(source));
//避免中文乱码的处理
attachmentPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
multipart.addBodyPart(attachmentPart);
}
}
message.setContent(multipart);
message.saveChanges();
//用流传送
Transport transport = session.getTransport();
transport.connect(FROM, PASSWORD);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
/**
* 检查是否是QQ邮箱
*/
private void checkQQMail() {
if (FROM.contains("qq.com")) {
isSSLAuth = true;
}
}
}
关于password参数:不是指邮箱密码,是指smtp服务授权码。
需要添加的依赖:
JavaMail包下载链接:https://github.com/javaee/javamail/releases
可以使用library的形式将JavaMail添加到libs目录下,也可以直接在maven项目的pom.xml文件中添加依赖,如下:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.0</version>
</dependency>
Android项目中使用,添加如下依赖:
implementation 'com.sun.mail:android-mail:1.6.7'
implementation 'com.sun.mail:android-activation:1.6.7'
到此,Java实现发送邮件带多个附件功能基本实现。