JavaMail
依赖
<!--JavaMail基本包-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!--邮件发送的扩展包-->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
收发代码
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.apache.commons.lang3.StringUtils;
// 邮件消息构建器
public class MessageBuilder {
// 发送者昵称
private String nick;
// 接收列表
private List<String> toList = new ArrayList<>();
// 抄送列表
private List<String> ccList = new ArrayList<>();
// 主题
private String subject;
// 邮件内容类型
private String type;
// 邮件内容
private Object content;
public MessageBuilder nick(String nick) {
this.nick = nick;
return this;
}
public MessageBuilder to(String to) {
this.toList.add(to);
return this;
}
public MessageBuilder cc(String cc) {
this.ccList.add(cc);
return this;
}
public MessageBuilder subject(String subject) {
this.subject = subject;
return this;
}
public MessageBuilder type(String type) {
this.type = type;
return this;
}
public MessageBuilder content(String type, Object content) {
this.type = type;
this.content = content;
return this;
}
public MessageBuilder content(Object content) {
this.content = content;
return this;
}
private void check() {
if (toList == null || toList.isEmpty()) {
throw new RuntimeException("接收人列表不可为空");
} else if (subject == null) {
throw new RuntimeException("邮件主题不可为空");
}
}
public MimeMessage build(Email email) throws MessagingException {
check();
MimeMessage message = new MimeMessage(email.getSession());
String account = email.getAccount();
if (nick != null) {
try {
account = MimeUtility.encodeText(nick) + "<" + account + ">";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
message.setFrom(new InternetAddress(account));
String to = StringUtils.join(toList, ",");
message.setRecipients(Message.RecipientType.TO, to);
String cc = null;
if (ccList != null && !ccList.isEmpty()) {
message.setRecipients(Message.RecipientType.CC, cc = StringUtils.join(ccList, ","));
}
message.setSubject(subject);
if (type == null || type.isEmpty()) {
message.setText(String.valueOf(content));
} else {
message.setContent(content, type);
}
message.setSentDate(new Date());
message.saveChanges();
System.out.println(String.format("%s 发送邮件给 %s, 主题 %s, 内容 %s", account, to, subject, content));
return message;
}
}
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.MimeMessage;
import lombok.Getter;
public class Email {
@Getter
private final String account;
@Getter
protected Session session;
@Getter
protected Store store;
public Email(String account) {
this.account = account;
}
public boolean sendHtmlMessage(MessageBuilder mb) {
return sendMessage(mb.type("text/html;charset=UTF-8"));
}
public boolean sendTextMessage(MessageBuilder mb) {
return sendMessage(mb.type(null));
}
public boolean sendMessage(MessageBuilder mb) {
long begin = System.currentTimeMillis();
try {
MimeMessage message = mb.build(this);
Transport.send(message);
System.out.println("发送成功, 耗时 " + (System.currentTimeMillis() - begin) + "ms");
return true;
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
System.out.println("发送失败, 耗时 " + (System.currentTimeMillis() - begin) + "ms");
return false;
}
public static class Email163 extends Email {
public Email163(final String account, final String code) {
super(account);
String host = "smtp.163.com";
String port = "25";
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.port", port);
properties.setProperty("mail.smtp.socketFactory.port", port);
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY");
// 获取默认session对象
session = Session.getInstance(properties, new Authenticator() {
// 设置认证账户信息
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(account, code);
}
});
// session.setDebug(true);
try {
store = session.getStore("pop3");
store.connect("pop3.163.com", account, code);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class EmailQQ extends Email {
public EmailQQ(final String account, final String code) {
super(account);
String host = "smtp.qq.com";
String port = "587";
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.port", port);
properties.setProperty("mail.smtp.socketFactory.port", port);
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY");
// 获取默认session对象
session = Session.getInstance(properties, new Authenticator() {
// 设置认证账户信息
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(account, code);
}
});
// session.setDebug(true);
try {
store = session.getStore("pop3");
store.connect("pop.qq.com", account, code);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws AddressException, MessagingException, IOException {
Email email;
email = new Email163("163邮箱", "163授权码");
email = new EmailQQ("QQ邮箱", "QQ授权码");
MessageBuilder mb = new MessageBuilder()
.nick("呵呵")
.to("906669319@qq.com")
.subject("test")
.content("<h1>测试1</h1>");
email.sendHtmlMessage(mb);
Folder folder = email.store.getFolder("INBOX"); // 收件箱
folder.open(Folder.READ_ONLY);
Message[] messages = folder.getMessages();
for (Message message : messages) {
System.out.println("发件人地址: " + Arrays.toString(message.getFrom()));
System.out.println("收件人地址: " + Arrays.toString(message.getRecipients(RecipientType.TO)));
System.out.println("抄送人地址: " + Arrays.toString(message.getRecipients(RecipientType.CC)));
System.out.println("主题: " + message.getSubject());
System.out.println("发送时间: " + message.getSentDate());
System.out.println("接收时间: " + message.getReceivedDate());
Object content = message.getContent();
System.out.println("邮件内容: " + content);
System.out.println("邮件大小: " + message.getSize());
}
}
}

简单连接
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendEmail {
public static void main(String[] args) {
if (args.length < 2) {
System.err.println("<标题> <内容>");
return;
}
long beginTime = System.currentTimeMillis();
String subject = args[0];
String text = args[1];
// 发件人电子邮箱
String from = "aa@bb.cc";
// 收件人电子邮箱
String to = "to@bb.cc";
String username = "aa@bb.cc";
String password = "aabbcc";
// 获取系统属性
Properties props = new Properties();
// 设置邮件服务器
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.host", "smtp.cc.com");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", "465");
// 获取默认session对象
Session session = Session.getDefaultInstance(props);
session.setDebug(false);
try {
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// Set From: 头部头字段
message.setFrom(new InternetAddress(from));
// Set To: 头部头字段
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Set Subject: 头部头字段
System.out.println("标题: " + subject);
message.setSubject(subject);
// 设置消息体
System.out.println("内容: " + text);
message.setText(text);
Transport transport = session.getTransport();
transport.connect(username, password);
// 发送消息
transport.sendMessage(message, message.getAllRecipients());
transport.close();
System.out.println("发送成功, 耗时: " + (System.currentTimeMillis() - beginTime) + " ms");
} catch (MessagingException mex) {
mex.printStackTrace();
}
}
}