在呼叫過mq后,或者事件辦完后,經常有郵件通知提醒的需求,而springboot也提供了start,只需要按照要求呼叫方法即可,但是網路上大多事如何呼叫外網郵箱的博文,本文將分別實作如何呼叫內外網郵件,
1.業務代碼
1.pom檔案
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.3.7.RELEASE</version>
</dependency>
2.物體類
存放介面的發送資訊,
public class MailVO {
/**
* 郵件Id
*/
@ApiModelProperty(value = "郵件Id", name = "郵件Id")
private String id;
/**
* 郵件發送人
*/
@ApiModelProperty(value = "郵件發送人", name = "郵件發送人")
private String emailSender;
/**
* 郵件接收人(多個郵箱則用逗號","隔開)
*/
@ApiModelProperty(value = "郵件接收人", name = "郵件接收人")
private String emailReciever;
/**
* 郵件主題
*/
@ApiModelProperty(value = "郵件主題", name = "郵件主題")
private String emailSubject;
/**
* 郵件內容
*/
@ApiModelProperty(value = "郵件內容", name = "郵件內容")
private String emailText;
/**
* 發送時間
*/
@ApiModelProperty(value = "發送時間", name = "發送時間")
private Long sentDate;
/**
* 抄送(多個郵箱則用逗號","隔開)
*/
@ApiModelProperty(value = "抄送(多個郵箱則用逗號","隔開)", name = "抄送(多個郵箱則用逗號","隔開)")
private String carbonCopy;
/**
* 密送(多個郵箱則用逗號","隔開)
*/
@ApiModelProperty(value = "密送(多個郵箱則用逗號","隔開)", name = "密送(多個郵箱則用逗號","隔開)")
private String blindCarbonCopy;
/**
* 狀態
*/
@ApiModelProperty(value = "狀態", name = "狀態")
private String status;
/**
* 報錯資訊
*/
@ApiModelProperty(value = "報錯資訊", name = "報錯資訊")
private String error;
/**
* 郵件附件
*/
@JsonIgnore
@ApiModelProperty(value = "郵件附件", name = "郵件附件")
private MultipartFile[] multipartFiles;
}
3.controller
@RestController
@RequestMapping("/mail")
public class MailController {
@Autowired
private MailService mailService;
/**
* 功能描述: 發送郵件
*
* @param mailVO
* @return MailVO
*/
@PostMapping("/send")
@ApiOperation(value = "發送郵件")
public MailVO sendMail(@RequestBody MailVO mailVO) {
//發送郵件和附件
return mailService.sendMail(mailVO);
}
}
3.service
public interface MailService {
/**
* 功能描述:發送郵件
*
* @param mailVO
* @return MailVO
*/
MailVO sendMail(MailVO mailVO);
/**
* 功能描述:檢測郵件資訊類
*
* @param mailVo
* @return
*/
void checkMail(MailVO mailVo);
/**
* 功能描述:構建復雜的郵件
*
* @param mailVo
* @return
*/
void sendMimeMail(MailVO mailVo);
/**
* 功能描述:保存郵件
*
* @param mailVo
* @return mailVo
*/
MailVO saveMail(MailVO mailVo);
}
5.serviceImpl
發送郵件的邏輯功能,
@Service("mailService")
public class MailServiceImpl implements MailService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private JavaMailSenderImpl mailSender;
@Override
public MailVO sendMail(MailVO mailVO) {
try {
//1.檢測郵件
checkMail(mailVO);
//2.發送郵件
sendMimeMail(mailVO);
//3.保存郵件
return saveMail(mailVO);
} catch (Exception e) {
//列印錯誤資訊
logger.error("發送郵件失敗:", e);
mailVO.setStatus("fail");
mailVO.setError(e.getMessage());
return mailVO;
}
}
@Override
public void checkMail(MailVO mailVo) {
if (StringUtils.isEmpty(mailVo.getEmailReciever())) {
throw new RuntimeException("郵件收信人不能為空");
}
if (StringUtils.isEmpty(mailVo.getEmailSubject())) {
throw new RuntimeException("郵件主題不能為空");
}
if (StringUtils.isEmpty(mailVo.getEmailText())) {
throw new RuntimeException("郵件內容不能為空");
}
}
@Override
public void sendMimeMail(MailVO mailVo) {
try {
//true表示支持復雜型別
MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
//郵件發信人從配置項讀取
mailVo.setEmailSender(mailVo.getEmailSender());
//郵件發信人
messageHelper.setFrom(mailVo.getEmailSender());
//郵件收信人
messageHelper.setTo(mailVo.getEmailReciever().split(","));
//郵件主題
messageHelper.setSubject(mailVo.getEmailSubject());
//郵件主題
messageHelper.setText(mailVo.getEmailText());
//抄送
if (!StringUtils.isEmpty(mailVo.getCarbonCopy())) {
messageHelper.setCc(mailVo.getCarbonCopy().split(","));
}
//密送
if (!StringUtils.isEmpty(mailVo.getBlindCarbonCopy())) {
messageHelper.setCc(mailVo.getBlindCarbonCopy().split(","));
}
//添加郵件附件
if (mailVo.getMultipartFiles() != null) {
for (MultipartFile multipartFile : mailVo.getMultipartFiles()) {
messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
}
}
//發送時間
if (!StringUtils.isEmpty(mailVo.getSentDate().toString())) {
messageHelper.setSentDate(new Date());
}
//正式發送郵件
mailSender.send(messageHelper.getMimeMessage());
mailVo.setStatus("ok");
logger.info("發送郵件成功:{}->{}", mailVo.getEmailSender(), mailVo.getEmailReciever());
} catch (Exception e) {
//發送失敗
throw new RuntimeException(e);
}
}
@Override
public MailVO saveMail(MailVO mailVo) {
return mailVo;
}
}
2.組態檔
上文代碼在其他博文中很多,大多相同,而重點就是組態檔,
1.使用外網(qq郵箱)
修改application.xml,
spring:
mail:
host: smtp.qq.com #SMTP服務器地址
username: xxxx@qq.com #登陸賬號
password: 1 #授權碼 不是密碼
default-encoding: utf-8 #utf-8格式
properties:
mail:
smtp:
ssl:
enable: true #一定要開啟ssl,不然會503 驗證失敗
servlet:
multipart:
max-file-size: 10MB #限制單個檔案大小
max-request-size: 50MB #限制請求總量
注意:不要填寫密碼,而是授權碼,
1.獲取授權碼
訪問qq郵箱,訪問左上角幫助中心,





回傳的就是授權碼,復制到上文即可,
2.內網郵箱
spring:
mail:
host: mail.xxx.com #SMTP服務器地址
port: 25 #內網需要指定埠需要指定
username: xxx@xx.com #登陸賬號
password: xxxx #登陸密碼
default-encoding: utf-8
properties:
mail:
smtp:
ssl:
enable: false #根據自己內網是否啟動配置
servlet:
multipart:
max-file-size: 10MB #限制單個檔案大小
max-request-size: 50MB #限制請求總量
然后就可以發送郵件了,
要注意:此處是郵箱的登錄密碼而不是授權碼!同時跟郵件創建者確定好郵箱開放的型別與埠號,否者會照成失敗的情況,
3.介面呼叫入參
{
"emailSender":"xxxx@xxx.com",
"emailReciever":"xxx@xxx.com",
"emailSubject":"測驗郵件",
"emailText":"6月7日上午,2021年高考首場幼ò訃試結束,澎湃新聞從教育部考試中心獲悉,今年全國高考語文共有8套試卷,教育部考試中心命制4套,分別為全國甲卷、全國乙卷、新高考Ⅰ卷、新高考Ⅱ卷,北京、天津、上海、浙江,",
"sentDate": 20210607
}
介面呼叫成功后,即可訪問郵件查看是否發送成功,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303347.html
標籤:其他
下一篇:Java--??深入jdk和hotspot原始碼??研究Thread底層執行run()、start()方法的程序?
