1.首先需要引入jar包
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api --> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.0</version> </dependency>2.非maven项目请自行下载jar包,下载地址:http://mvnrepository.com/artifact/javax.mail/javax.mail-api/1.6.0。
3.编写工具类。
说明:工具类中抛出异常部分根据项目去调整,这里只做了简单的处理,。
package com.common.email;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
/**
* Created by houpy on 2017/6/20.
*/
public class EmailUtils {
protected static final Logger logger = LoggerFactory.getLogger(EmailUtils.class);
// 发件人的邮箱和密码
public static String myEmailAccount = "发件人邮箱";
public static String myEmailPassword = "发件人邮箱密码";
//发件人的邮箱的 SMTP 服务器地址
public static String myEmailSMTPHost = "smtp.163.com";//例如
/**
* 发送简单邮件
* @param receiveMails 收件人地址
* @param receiveCCMails 抄送人地址
* @param subject 邮件主题
* @param sendNick 发送者昵称
* @param contents 发送内容
* @return
*/
public static Boolean sendNormalEmail(List<String> receiveMails, List<String> receiveCCMails,
String subject, String sendNick,String contents) throws Exception {
// 参数校验
if(StringUtils.isBlank(contents)) {
throw new Exception("参数异常");
}
if (null == receiveMails || receiveMails.size() == 0) {
throw new Exception("收件箱为空");
}
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
Session session = Session.getDefaultInstance(props);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
try{
MimeMessage message = createSimpleMessage(session, myEmailAccount,
sendNick, receiveMails,receiveCCMails, subject, contents);
// 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 使用 邮箱账号 和 密码 连接邮件服务器
transport.connect(myEmailAccount, myEmailPassword);
// 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
return true;
} catch (MessagingException e) {
logger.warn("调用邮件服务异常");
throw new Exception("调用邮件服务异常");
} catch (UnsupportedEncodingException e1) {
logger.warn("调用邮件服务异常");
throw new Exception("调用邮件服务异常");
} catch (Exception e2) {
logger.warn("调用邮件服务异常");
throw new Exception("调用邮件服务异常");
}
}
/**
* 构建简单邮件
* @param session
* @param sendMail
* @param sendNick
* @param receiveMails
* @param receiveCCMails
* @param subject
* @param contents
* @return
* @throws UnsupportedEncodingException
* @throws MessagingException
*/
private static MimeMessage createSimpleMessage(Session session, String sendMail, String sendNick,
List<String> receiveMails, List<String> receiveCCMails,
String subject, String contents)
throws UnsupportedEncodingException, MessagingException {
// 1. 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(sendMail, sendNick, "UTF-8"));
// 3. To: 收件人
for (String receiveMail : receiveMails) {
message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail));
}
// 4. To: 抄送人
if (null != receiveCCMails && receiveCCMails.size() > 0) {
for (String receiveCCMail : receiveCCMails) {
message.addRecipient(MimeMessage.RecipientType.CC, new InternetAddress(receiveCCMail));
}
}
// 5. Subject: 邮件主题
message.setSubject(subject, "UTF-8");
// 6. 邮件内容
message.setContent(contents, "text/html;charset=UTF-8");
// 7. 设置发件时间
message.setSentDate(new Date());
// 8. 保存上面的所有设置
message.saveChanges();
return message;
}
/**
* 发送带附件的邮件
* @param receiveMails
* @param receiveCCMails
* @param subject
* @param sendNick
* @param contents
* @param filePaths
* @return
*/
public static Boolean sendComplexEmail(List<String> receiveMails, List<String> receiveCCMails,
String subject, String sendNick,String contents, List<String> filePaths ) throws Exception {
// 参数校验
if(StringUtils.isBlank(contents)) {
throw new Exception("参数异常");
}
if (null == receiveMails || receiveMails.size() == 0) {
throw new Exception("收件箱为空");
}
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
Session session = Session.getDefaultInstance(props);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
try{
MimeMessage message = createComplexMessage(session, myEmailAccount,
sendNick, receiveMails,receiveCCMails, subject, contents,filePaths);
// 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 使用 邮箱账号 和 密码 连接邮件服务器
transport.connect(myEmailAccount, myEmailPassword);
// 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
return true;
} catch (MessagingException e) {
logger.warn("调用邮件服务异常");
throw new Exception("调用邮件服务异常");
} catch (UnsupportedEncodingException e1) {
logger.warn("调用邮件服务异常");
throw new Exception("调用邮件服务异常");
} catch (Exception e2) {
logger.warn("调用邮件服务异常");
throw new Exception("调用邮件服务异常");
}
}
/**
* 构建符合邮件 (目前只支持到文本加附件,加图片的看需求)
* @param session
* @param sendMail
* @param sendNick
* @param receiveMails
* @param receiveCCMails
* @param subject
* @param contents
* @param filePaths
* @return
* @throws UnsupportedEncodingException
* @throws MessagingException
*/
private static MimeMessage createComplexMessage(Session session, String sendMail, String sendNick,
List<String> receiveMails, List<String> receiveCCMails,
String subject, String contents, List<String> filePaths )
throws UnsupportedEncodingException, MessagingException {
// 1. 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(sendMail, sendNick, "UTF-8"));
// 3. To: 收件人
for (String receiveMail : receiveMails) {
message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail));
}
// 4. To: 抄送人
if (null != receiveCCMails && receiveCCMails.size() > 0) {
for (String receiveCCMail : receiveCCMails) {
message.addRecipient(MimeMessage.RecipientType.CC, new InternetAddress(receiveCCMail));
}
}
// 5. Subject: 邮件主题
message.setSubject(subject, "UTF-8");
// 6. 邮件内容
// 6.1. 创建文本“节点”
MimeBodyPart text = new MimeBodyPart();
text.setContent(contents, "text/html;charset=UTF-8");
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
for (String filePath:filePaths) {
// 6.2. 创建附件“节点”
MimeBodyPart attachment = new MimeBodyPart();
// 读取本地文件
DataHandler dh = new DataHandler(new FileDataSource(filePath));
// 将附件数据添加到“节点”
attachment.setDataHandler(dh);
// 设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dh.getName()));
mm.addBodyPart(attachment); // 如果有多个附件,可以创建多个多次添加
}
mm.setSubType("mixed"); // 混合关系
message.setContent(mm);
// 7. 设置发件时间
message.setSentDate(new Date());
// 8. 保存上面的所有设置
message.saveChanges();
return message;
}
public static void main(String[] args) throws Exception {
List<String> receiveMails = new ArrayList<>();
String receiveMail = "houpeiyun@163.com";
receiveMails.add(receiveMail);
List<String> receiveCCMails = new ArrayList<>();
String subject = "测试";
String sendNick = "比克大魔王";
String contents = "生活很简单,我是大魔王";
// sendNormalEmail(receiveMails, receiveCCMails, subject, sendNick,
// contents);
String filePath = "D:\\fileDemo.xls";
List<String> filePaths = new ArrayList<>();
filePaths.add(filePath);
sendComplexEmail(receiveMails, receiveCCMails, subject, sendNick,contents,filePaths);
}
}