Java实现发邮件功能---网易邮箱
生活随笔
收集整理的這篇文章主要介紹了
Java实现发邮件功能---网易邮箱
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄Java實現發郵件功能前言開發環境代碼效果結束語
Java實現發郵件功能
前言
電子郵件的應用場景非常廣泛,例如新用戶加入,即時發送優惠清單、通過郵件找回密碼、監聽后臺程序,出現異常自動郵件通知等。
本文以網易郵箱為例,通過Java代碼實現發送郵件功能。
開發環境
請參照: 基于SpringBoot構建分模塊項目
代碼
pom.xml引入依賴
<properties>
<java.version>1.8</java.version>
<!-- 你的其他依賴... -->
<javax.mail.version>1.6.0</javax.mail.version>
</properties>
<dependencies>
<!-- 你的其他依賴... -->
<!-- 發送短信 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${javax.mail.version}</version>
</dependency>
</dependencies>
發送郵件工具類
package com.wayne.common.utils;
import com.wayne.common.entity.CmsMailConfig;
import com.wayne.common.vo.MailVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;
/**
* 發送郵件工具類
* @author Wayne
* @date 2019/6/19
*/
@Component
public class MailUtils {
/**
* 發送郵件
* @param isSingle 是否單發: true-單發 false-群發
* @param mailVo 郵件內容
* @param sendTime 發送時間, 如果為null,表示立即發送
* @param mailConfig 發件人信息及授權
*/
public void sendMail(Boolean isSingle, MailVo mailVo, Date sendTime, CmsMailConfig mailConfig) throws MessagingException {
Session session = this.authenticationMail();
MimeMessage message = getMimeMessage(isSingle, session, mailConfig.getMailAccount(), mailVo.getRecipients());
message = getContent(message, mailVo.getMailTiTle(), mailVo.getMailContent(), sendTime);
Transport transport = session.getTransport();
transport.connect(mailConfig.getMailAccount(), mailConfig.getMailLicense());
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
/**
* 校驗發送的郵件內容
*/
private MimeMessage getContent(MimeMessage message, String messageTitle, String messageContent, Date sendTime) throws MessagingException {
if (null == messageTitle) {
throw new MessagingException("郵件標題不能為空");
}
if (null == messageContent) {
throw new MessagingException("郵件內容不能為空");
}
sendTime = sendTime == null ? new Date() : sendTime;
message.setSubject(messageTitle, "UTF-8");
message.setContent(messageContent, "text/html;charset=UTF-8");
message.setSentDate(sendTime);
return message;
}
/**
* 驗證認證信息
*/
private Session authenticationMail() throws MessagingException {
Session session;
try {
Properties props = new Properties();
//設置用戶的認證方式
props.setProperty("mail.smtp.auth", "true");
//設置傳輸協議
props.setProperty("mail.transport.protocol", "smtp");
//設置發件人的SMTP服務器地址
props.setProperty("mail.smtp.host", "smtp.163.com");
session = Session.getInstance(props);
session.setDebug(true);
} catch (Exception e) {
e.printStackTrace();
throw new MessagingException("認證失敗");
}
return session;
}
/**
* @param isSingle 是否單發
* <P>true-向指定的一個收件人發送郵件,比如:找回密碼、登錄驗證
* <P>false-向多個收件人群發郵件,比如:優惠活動推送
* <P>群發時多個收件人之間用英文逗號','分割
* @param senderAddress 發件人地址
* @param recipientAddress 收件人地址
*/
private MimeMessage getMimeMessage(Boolean isSingle, Session session, String senderAddress, String recipientAddress) throws MessagingException {
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(senderAddress));
} catch (MessagingException e) {
throw new MessagingException("發件人地址錯誤");
}
/*
設置收件人地址
MimeMessage.RecipientType.TO:發送
MimeMessage.RecipientType.CC:抄送
MimeMessage.RecipientType.BCC:密送
*/
if (isSingle) {
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(recipientAddress));
} else {
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientAddress));
}
return message;
}
}
郵件內容對象-MailVo
package com.wayne.common.vo;
import lombok.Data;
/**
* @author Wayne
* @date 2019/6/24
*/
@Data
public class MailVo {
/**
* 郵件標題
*/
private String mailTiTle;
/**
* 郵件內容
*/
private String mailContent;
/**
* 收件人(們)
*/
private String recipients;
}
發件人信息及授權
注: 此處我假定有多個發件人,且不確定,可以動態添加、選擇由哪個發件人發送,因此我將發件人信息存儲在數據庫中。假如你的應用中發件人是固定的,則此處可寫在項目中或配在配置文件!
我們正常發送郵件時需要輸入密碼,登錄我們的郵箱賬戶。而通過程序發送郵件不需要密碼登錄,而是使用授權碼,網易郵箱授權碼獲得方式如下
啟用授權
獲得授權碼
package com.wayne.common.entity;
import lombok.Data;
import javax.persistence.*;
@Data
@Table(name = "cms_mail_config")
public class CmsMailConfig {
/**
* 主鍵
*/
@Id
@Column(name = "MAIL_ID")
private Integer mailId;
/**
* 郵箱賬號
*/
@Column(name = "MAIL_ACCOUNT")
private String mailAccount;
/**
* 授權碼
*/
@Column(name = "MAIL_LICENSE")
private String mailLicense;
/**
* 狀態,0:使用,1:未使用
*/
@Column(name = "IS_USE")
private String isUse;
/**
* 是否刪除,0:否,1:是
*/
@Column(name = "IS_DELETE")
private String isDelete;
/**
* 創建者ID
*/
@Column(name = "CREATE_ADMIN_ID")
private Integer createAdminId;
@Column(name = "EXTEND1")
private String extend1;
@Column(name = "EXTEND2")
private String extend2;
@Column(name = "EXTEND3")
private String extend3;
@Column(name = "EXTEND4")
private String extend4;
@Column(name = "EXTEND5")
private String extend5;
@Column(name = "EXTEND6")
private String extend6;
}
Service
@Override
public ResponseBean sendMails(MailVo mailVo) {
if (null == mailVo) {
return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常");
}
// 獲取當前正在使用的發件人配置
List<CmsMailConfig> mailConfigList = mailConfigMapper.selectCurrUseMailConfig();
if (null == mailConfigList || mailConfigList.size() != 1) {
return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常");
}
try {
// 發送郵件
mailUtils.sendMail(Boolean.FALSE, mailVo, null, mailConfigList.get(0));
return ResponseBean.createInstance();
} catch (Exception e) {
e.printStackTrace();
}
return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常");
}
Controller
@PostMapping("/mail/sendMails")
public ResponseBean sendMails(MailVo mailVo) {
return mailService.sendMails(mailVo);
}
效果
此處發送為手動發送,主要體驗代碼功能。具體應用場景可根據實際生產環境,隨機應變。比如:通過結合定時器任務,每天定時發送報表;檢測用戶登錄地址不是常用地址時,自動發郵件通知用戶;普通用戶登錄時,觸發發送郵件向管理員等
結束語
本人已開通公眾號,歡迎大家前來灌水
總結
以上是生活随笔為你收集整理的Java实现发邮件功能---网易邮箱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中几个常用的方法
- 下一篇: 卷积神经网络中一维卷积的计算过程