java.mail
avaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。但它并没有包含在JDK中,而是作为JavaEE的一部分。
厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:
- SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
- POP3:用于接收电子邮件的标准协议;
- IMAP:互联网消息协议,是POP3的替代协议。
这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。
除JavaMail服务提供程序之外,JavaMail还需要JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。
mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服务提供程序;
activation.jar:此JAR文件包含JAF API和Sun的实现。
简单邮件发送demo
- 创建maven项目,导入相关依赖包
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- 不设置scope就是全局
<scope>test</scope> -->
</dependency>
</dependencies>
- 定义简单邮件类:
private String subject;
//邮件的内容(正文)
private String content;
//可根据需要增加其他邮件元素
public void setSubject(String subject) {
this.subject = subject;
}
public void setContent(String content) {
this.content = content;
}
public String getSubject() {
return subject;
}
public String getContent() {
return content;
}
}
- 定义MailAuthenticator类,继承javax.mail.Authenticator
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class MailAuthenticator extends Authenticator {
// 用户名(登录邮箱)
private String username;
// 密码
private String password;
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
/**
* 初始化邮箱和密码
* @param username 邮箱
* @param password 密码
*/
public MailAuthenticator(String username, String password){
this.username = username;
this.password = password;
}
String getPassword() {
return password;
}
String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public void setUsername(String username) {
this.username = username;
}
}
- 定义邮件发送类以及邮件发送相关操作
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
public class SimpleMailSender {
//发送邮件的props文件
private final transient Properties props = System.getProperties();
//邮件服务器登录验证
private transient MailAuthenticator authenticator;
//邮箱session
private transient Session session;
/**
* 初始化邮件发送器
* @param smtpHostName SMTP邮件服务器地址(IP)
* @param username 发送邮件的用户名(地址)
* @param password 发送邮件的密码
*/
public SimpleMailSender(final String smtpHostName, final String username,
final String password) {
init(username, password, smtpHostName);
}
/**
* 初始化邮件发送器
* @param username 发送邮件的用户名(地址),并以此解析SMTP服务器地址
* @param password 发送邮件的密码
*/
public SimpleMailSender(final String username, final String password) {
// 通过邮箱地址解析出smtp服务器,对大多数邮箱都管用,或者使用IP地址
//final String smtpHostName = "smtp." + username.split("@")[1];
final String smtpHostName = "10.10.28.106";
init(username, password, smtpHostName);
}
/**
* 初始化
* @param username 发送邮件的用户名(地址)
* @param password 密码
* @param smtpHostName SMTP主机地址
*/
private void init(String username, String password, String smtpHostName) {
// 初始化props
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", smtpHostName);
// 验证
System.out.println("相关配置:"+props);
authenticator = new MailAuthenticator(username, password);
System.out.println("authenticator:"+authenticator);
// 创建session
session = Session.getInstance(props, authenticator);
session.setDebug(true);
}
/**
* 发送单个收件人邮件
* @param recipient 收件人邮箱地址
* @param subject 邮件主题
* @param content 邮件内容
* @throws AddressException
* @throws MessagingException
*/
public void send(String recipient, String subject, String content)
throws AddressException, MessagingException, IOException {
// 创建mime类型邮件
final MimeMessage message = new MimeMessage(session);
// 设置发信人
message.setFrom(new InternetAddress(authenticator.getUsername()));
System.out.println("发件人:"+message.getFrom());
// 设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
// 设置主题
message.setSubject(subject);
System.out.println("主题:"+message.getSubject());
// 设置邮件内容
Multipart mp = new MimeMultipart("related");
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent(content.toString(),"text/html;charset=utf-8");
mp.addBodyPart(mbp);
message.setContent(mp);
System.out.println("message:"+message.getContent());
// 设置邮件内容
// message.setContent(content.toString(), "text/html;charset=utf-8");
// 发送
Transport.send(message);
}
/**
* 群发邮件
* @param recipients 收件人们
* @param subject 主题
* @param content 内容
* @throws AddressException
* @throws MessagingException
*/
public void send(List<String> recipients, String subject, String content)
throws AddressException, MessagingException {
// 创建mime类型邮件
final MimeMessage message = new MimeMessage(session);
// 设置发信人
message.setFrom(new InternetAddress(authenticator.getUsername()));
// 设置收件人们
final int num = recipients.size();
InternetAddress[] addresses = new InternetAddress[num];
for (int i = 0; i < num; i++) {
addresses[i] = new InternetAddress(recipients.get(i));
}
message.setRecipients(RecipientType.TO, addresses);
// 设置主题
message.setSubject(subject);
// 设置邮件内容
message.setContent(content.toString(), "text/html;charset=utf-8");
// 发送
Transport.send(message);
}
/**
* 发送邮件
* @param recipient 收件人邮箱地址
* @param mail 邮件对象
* @throws AddressException
* @throws MessagingException
*
*/
public void send(String recipient, SimpleMail mail)
throws AddressException, MessagingException, IOException {
send(recipient, mail.getSubject(), mail.getContent());
}
}
- 添加test测试
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import org.junit.Test;
public class EmailTest {
@Test
public void sendEmail() throws Exception {
SimpleMail simpleMail = new SimpleMail();
simpleMail.setSubject("第一封邮件");
simpleMail.setContent("这时邮件");
SimpleMailSender simpleMailSender = new SimpleMailSender("smtp.qq.com","请用自己的邮件地址", "请用自己的密码");
try {
simpleMailSender.send("请用自己的邮件地址", simpleMail);
System.out.println("执行完成!!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置文件做配置项
# 邮件服务器,邮件服务器的地址绑定(根据实际情况修改配置文件)
mail_host=smtp.qq.com
# 发件人邮箱 (根据实际情况修改配置文件)
mail_username=
# 发件人密码 这个需要相应发件人邮箱的授权码 不是账户登录密码 (根据实际情况修改配置文件)
mail_password=
# 收件人的邮箱地址 (根据实际情况修改配置文件)
mail_to=
# 主题 邮件的主题 英文 (建议采用默认)
mail_subject=hello
# 正文 邮件的内容 为英文 (建议采用默认)
mail_body=test
添加main入口函数
public static void main(String[] args) {
String path = System.getProperty("user.dir");
Properties p=new Properties();
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\mail_demo\\src\\main\\resources\\config.properties"));
p.load(bufferedReader);
String mail_host = p.getProperty("mail_host","smtp.qq.com");
String mail_username = p.getProperty("mail_username");
String mail_password = p.getProperty("mail_password");
String mail_to = p.getProperty("mail_to");
String mail_subject = p.getProperty("mail_subject","主题");
String mail_body = p.getProperty("mail_body","这是一封邮件");
SimpleMail simpleMail = new SimpleMail();
simpleMail.setSubject(mail_subject);
simpleMail.setContent(mail_body);
SimpleMailSender simpleMailSender = new SimpleMailSender(mail_host,mail_username, mail_password);
try {
simpleMailSender.send(mail_to, simpleMail);
System.out.println("+++++++++++++++++++++++++++");
System.out.println("simplemail:"+simpleMail.toString());
System.out.println("mail_to:"+mail_to);
System.out.println("执行完成!!");
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
到此,就可以发送成功了。