介紹
發送郵件是一個很常見的需求,如用戶注冊,用戶密碼修改,密碼找回等。今天我們看一下使用JavaSE和Spring實現發送郵件的功能。
郵件協議
SMTP協議是基於TCP/IP的一個應用層協議,類似於HTTP,全稱為 Simple Mail Transfer Protocol,譯作簡單郵件傳輸協議,它定義了郵件客戶端軟件與SMTP 服務器之間,以及 SMTP 服務器與 SMTP 服務器之間的通信規則。我們通過郵件客戶端或程序發送郵件時就用到了該協議。
而 POP3 協議全稱為 Post Office Protocol ,譯作郵局協議,它定義了郵件客戶端與 POP3服務器之間的通信規則。我們通過郵件客戶端查看郵件時就用到了該協議。
IMAP(Internet Message Access Protocol)協議是對POP3協議的一種擴展,功能更強,作用類似。
發送前准備
發送前需要獲取郵箱的授權碼,以網易126郵箱為例
使用JavaSE發送簡單郵件
添加maven依賴
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
發送郵件
public class Client {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
//設置郵件地址
props.put("mail.smtp.host", "smtp.126.com");
//開啟認證
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, null);
Transport transport = session.getTransport();
//用戶名
String user = "xxx@126.com";
//授權碼
String password = "xxx";
transport.connect(user, password);
//創建郵件消息
MimeMessage msg = new MimeMessage(session);
msg.setSentDate(new Date());
//郵件發送人
InternetAddress fromAddress = new InternetAddress(user, "郵件服務");
msg.setFrom(fromAddress);
//郵件接收人
String to = "xxx@163.com";
InternetAddress[] toAddress = new InternetAddress[]{new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, toAddress);
//郵件主題
msg.setSubject("測試郵件發送", "UTF-8");
//郵件內容和格式
msg.setContent("this is a test mail", "text/html;charset=UTF-8");
msg.saveChanges();
//發送
transport.sendMessage(msg, msg.getAllRecipients());
}
}
發送帶附件的郵件
public class Client {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
//設置郵件地址
props.put("mail.smtp.host", "smtp.126.com");
//開啟認證
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, null);
Transport transport = session.getTransport();
//用戶名
String user = "xxx@126.com";
//授權碼
String password = "xxx";
transport.connect(user, password);
//創建郵件消息
MimeMessage msg = new MimeMessage(session);
msg.setSentDate(new Date());
//郵件發送人
InternetAddress fromAddress = new InternetAddress(user, "郵件服務");
msg.setFrom(fromAddress);
//郵件接收人
String to = "xxx@163.com";
InternetAddress[] toAddress = new InternetAddress[]{new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, toAddress);
//郵件主題
msg.setSubject("測試郵件發送", "UTF-8");
//內容和附件
Multipart multipart = new MimeMultipart();
//內容
BodyPart contentBodyPart = new MimeBodyPart();
contentBodyPart.setContent("this also is a test mail", "text/html;charset=UTF-8");
multipart.addBodyPart(contentBodyPart);
//附件
BodyPart fileBody = new MimeBodyPart();
DataSource source = new FileDataSource("D:/a.png");
fileBody.setDataHandler(new DataHandler(source));
fileBody.setFileName("測試附件.png");
multipart.addBodyPart(fileBody);
//郵件內容
msg.setContent(multipart);
msg.saveChanges();
//發送
transport.sendMessage(msg, msg.getAllRecipients());
}
}
使用Spring發送簡單郵件
spring在原有的基礎上又封裝了一層,簡化了開發。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
public class Client {
public static void main(String[] args) throws Exception {
JavaMailSender mailSender = createJavaMailSender();
//創建郵件消息
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
//發送人
messageHelper.setFrom("xxx@126.com", "郵件服務");
//收件人
messageHelper.setTo("xxx@163.com");
//主題
messageHelper.setSubject("測試郵件發送");
//發送時間
messageHelper.setSentDate(new Date());
//發送內容
messageHelper.setText("this is a test mail by spring");
mailSender.send(mimeMessage);
}
private static JavaMailSender createJavaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setDefaultEncoding(StandardCharsets.UTF_8.name());
String username = "xxx@126.com";
//設置用戶名
mailSender.setUsername(username);
//設置授權碼
mailSender.setPassword("xxx");
Properties props = new Properties();
//設置郵件地址
props.put("mail.smtp.host", "smtp.126.com");
//開啟認證
props.put("mail.smtp.auth", "true");
mailSender.setJavaMailProperties(props);
return mailSender;
}
}
使用Spring發送帶附件的郵件
public class Client {
public static void main(String[] args) throws Exception {
JavaMailSender mailSender = createJavaMailSender();
//創建郵件消息
MimeMessage mimeMessage = mailSender.createMimeMessage();
//multipart為true表示可以帶附件
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
//發送人
messageHelper.setFrom("xxx@126.com", "郵件服務");
//收件人
messageHelper.setTo("xxx@163.com");
//主題
messageHelper.setSubject("測試郵件發送");
//發送時間
messageHelper.setSentDate(new Date());
//發送內容
messageHelper.setText("this is a test mail by spring");
//添加附件
messageHelper.addAttachment("測試附件.png", new FileDataSource("D:/a.png"));
mailSender.send(mimeMessage);
}
private static JavaMailSender createJavaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setDefaultEncoding(StandardCharsets.UTF_8.name());
String username = "xxx@126.com";
//設置用戶名
mailSender.setUsername(username);
//設置授權碼
mailSender.setPassword("xxx");
Properties props = new Properties();
//設置郵件地址
props.put("mail.smtp.host", "smtp.126.com");
//開啟認證
props.put("mail.smtp.auth", "true");
mailSender.setJavaMailProperties(props);
return mailSender;
}
}