SpringBoot?集成短信和郵件的配置示例詳解
準(zhǔn)備工作
1、集成郵件
以QQ郵箱為例
在發(fā)送郵件之前,要開啟POP3和SMTP協(xié)議,需要獲得郵件服務(wù)器的授權(quán)碼,獲取授權(quán)碼:
1、設(shè)置>賬戶
在賬戶的下面有一個開啟SMTP協(xié)議的開關(guān)并進(jìn)行密碼驗證:

2、獲取成功的授權(quán)碼

2、集成短信
以阿里云短信服務(wù)為例
1、登陸阿里云—>進(jìn)入控制臺—>開通短信服務(wù)
進(jìn)入后根據(jù)提示開通短信服務(wù)即可。
2、充值
后期發(fā)短信測試需要,暫時可以跳過此步驟。
3、獲取AccessKey和AccessSercet
文檔使用指引: https://help.aliyun.com/document_detail/59210.html?spm=a2c6h.13066369.0.0.4b3516b4kN0052
4、API
OpenAPI地址: https://next.api.aliyun.com/document/Dysmsapi/2017-05-25/overview
依賴
1、郵件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、短信
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>2.0.4</version>
</dependency>
配置
1、配置郵箱基本信息
spring:
mail:
# 配置 SMTP 服務(wù)器地址
host: smtp.qq.com
# 發(fā)送者郵箱
username: 742354529@qq.com
# 配置密碼,注意不是真正的密碼,而是申請的授權(quán)碼
password: vjstfghblprwbdbd
# 端口號465或587
port: 587
# 默認(rèn)的郵件編碼為UTF-8
default-encoding: UTF-8
# 配置SSL 加密工廠
properties:
mail:
smtp:
socketFactoryClass: javax.net.ssl.SSLSocketFactory
# 表示開啟DEBUG模式,郵件發(fā)送過程的日志會在控制臺打印出來
debug: trueSMTP 服務(wù)器地址
- 126郵箱SMTP服務(wù)器地址:smtp.126.com,端口號:465或者994
- 2163郵箱SMTP服務(wù)器地址:smtp.163.com,端口號:465或者994
- yeah郵箱SMTP服務(wù)器地址:smtp.yeah.net,端口號:465或者994
- qq郵箱SMTP服務(wù)器地址:smtp.qq.com,端口號465或587*
2、短信配置
# 阿里云短信配置 sms: access-id: LTAI5tDP3SDQC9yvCguiiFDr access-key: EGSDQsLxCVS5dwjS8DCxmYQ124XySV sign-name: endpoint: dysmsapi.aliyuncs.com
編碼
1、郵件
1.1、MailService.java
package com.tanersci.service;
import com.tanersci.dto.MailMessageDto;
import com.tanersci.vo.MessageVo;
/**
* @ClassName: MailService.java
* @ClassPath: com.tanersci.service.MailService.java
* @Description: 郵件
* @Author: tanyp
* @Date: 2021/6/7 9:18
**/
public interface MailService {
/**
* @MonthName: sendSimple
* @Description: 普通郵件發(fā)送
* @Author: tanyp
* @Date: 2021/6/7 9:30
* @Param: [dto]
* @return: void
**/
MessageVo sendSimple(MailMessageDto dto);
* @MonthName: sendAttachFile
* @Description: 帶附件的郵件
MessageVo sendAttachFile(MailMessageDto dto);
* @MonthName: sendImgRes
* @Description: 帶圖片資源的郵件
MessageVo sendImgRes(MailMessageDto dto);
}1.2、MailServiceImpl.java
package com.tanersci.service.impl;
import com.alibaba.fastjson.JSON;
import com.tanersci.dto.MailMessageDto;
import com.tanersci.vo.MessageVo;
import com.tanersci.constant.Constants;
import com.tanersci.service.MailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Objects;
/**
* @ClassName: MailServiceImpl.java
* @ClassPath: com.tanersci.service.impl.MailServiceImpl.java
* @Description: 郵件
* @Author: tanyp
* @Date: 2021/6/7 9:18
**/
@Slf4j
@Service
public class MailServiceImpl implements MailService {
@Value("${spring.mail.username}")
private String sender;
@Autowired
private JavaMailSender javaMailSender;
/**
* @MonthName: sendSimple
* @Description: 普通郵件發(fā)送
* @Author: tanyp
* @Date: 2021/6/7 9:30
* @Param: [dto]
* @return: void
**/
@Override
public MessageVo sendSimple(MailMessageDto dto) {
try {
log.info("=======普通郵件發(fā)送開始,請求參數(shù):{}", JSON.toJSON(dto));
// 構(gòu)建一個郵件對象
SimpleMailMessage message = new SimpleMailMessage();
// 設(shè)置郵件主題
message.setSubject(dto.getSubject());
// 設(shè)置郵件發(fā)送者,這個跟application.yml中設(shè)置的要一致
message.setFrom(sender);
// 設(shè)置郵件接收者,可以有多個接收者,中間用逗號隔開,以下類似
// message.setTo("10*****16@qq.com","12****32*qq.com");
message.setTo(dto.getRecipient());
// 設(shè)置郵件抄送人,可以有多個抄送人
if (Objects.nonNull(dto.getCc())) {
message.setCc(dto.getCc());
}
// 設(shè)置隱秘抄送人,可以有多個
if (Objects.nonNull(dto.getBcc())) {
message.setBcc(dto.getBcc());
// 設(shè)置郵件發(fā)送日期
message.setSentDate(new Date());
// 設(shè)置郵件的正文
message.setText(dto.getText());
// 發(fā)送郵件
javaMailSender.send(message);
log.info("=======普通郵件發(fā)送結(jié)束");
return MessageVo.builder().code(Constants.NEWS_SUCCESS_CODE).message(Constants.NEWS_SUCCESS_MESSAGE).build();
} catch (MailException e) {
log.error("====郵件====sendSimple=====異常:{}", e);
return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
}
}
* @MonthName: sendAttachFile
* @Description: 帶附件的郵件
public MessageVo sendAttachFile(MailMessageDto dto) {
log.info("=======帶附件的郵件開始,請求參數(shù):{}", JSON.toJSON(dto));
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// true表示構(gòu)建一個可以帶附件的郵件對象
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
// 第一個參數(shù)是自定義的名稱,后綴需要加上,第二個參數(shù)是文件的位置
dto.getAttachments().forEach(file -> {
try {
message.addAttachment(file.getName(), file);
} catch (MessagingException e) {
log.error("=========郵件附件解析異常:{}", e);
}
});
javaMailSender.send(mimeMessage);
log.info("=======帶附件的郵件結(jié)束");
} catch (MessagingException e) {
log.error("==========郵件====sendAttachFile=====異常:{}", e);
* @MonthName: sendImgRes
* @Description: 帶圖片資源的郵件
public MessageVo sendImgRes(MailMessageDto dto) {
log.info("=======帶圖片資源的郵件開始,請求參數(shù):{}", JSON.toJSON(dto));
// 第一個參數(shù)指的是html中占位符的名字,第二個參數(shù)就是文件的位置
message.addInline(file.getName(), new FileSystemResource(file));
log.error("=========郵件圖片解析異常:{}", e);
log.info("=======帶圖片資源的郵件結(jié)束");
log.error("====郵件====sendImgRes=====異常:{}", e);
}1.3、VO、DTO及常量類
MailMessageDto.java
package com.tanersci.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.File;
import java.io.Serializable;
import java.util.List;
/**
* @ClassName: MailMessageDto.java
* @ClassPath: com.tanersci.dto.MailMessageDto.java
* @Description: 郵件消息
* @Author: tanyp
* @Date: 2021/6/7 9:20
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "郵件消息")
public class MailMessageDto implements Serializable {
private static final long serialVersionUID = 5483400172436286831L;
@ApiModelProperty(value = "郵件主題")
private String subject;
@ApiModelProperty(value = "接收者:可以有多個接收者,中間用逗號隔開")
private String recipient;
@ApiModelProperty(value = "抄送人:可以有多個抄送人,中間用逗號隔開")
private String cc;
@ApiModelProperty(value = "隱秘抄送人:可以有多個抄送人,中間用逗號隔開")
private String bcc;
@ApiModelProperty(value = "正文")
private String text;
@ApiModelProperty(value = "模板編碼")
private String code;
@ApiModelProperty(value = "附件、圖片")
private List<File> attachments;
}MessageVo.java
package com.tanersci.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @ClassName: MessageVo.java
* @ClassPath: com.tanersci.vo.MessageVo.java
* @Description: 短信、郵件消息返回值
* @Author: tanyp
* @Date: 2021/6/7 11:35
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "短信、郵件消息返回值")
public class MessageVo implements Serializable {
private static final long serialVersionUID = 5287525465339500144L;
@ApiModelProperty(value = "狀態(tài)碼")
private String code;
@ApiModelProperty(value = "狀態(tài)碼的描述")
private String message;
@ApiModelProperty(value = "請求ID")
private String requestId;
@ApiModelProperty(value = "發(fā)送回執(zhí)ID")
private String bizId;
@ApiModelProperty(value = "模板編碼")
private String templateCode;
}Constants.java
package com.tanersci.constant;
/**
* @ClassName: Constants.java
* @ClassPath: com.tanersci.constant.Constants.java
* @Description: 常量
* @Author: tanyp
* @Date: 2021/5/22 15:54
**/
public class Constants {
/**
* 消息發(fā)送狀態(tài)碼
*/
public final static String NEWS_SUCCESS_CODE = "OK";
public final static String NEWS_SUCCESS_MESSAGE = "發(fā)送成功";
public final static String NEWS_FAIL_CODE = "FAIL";
public final static String NEWS_FAIL_MESSAGE = "發(fā)送失敗";
}2、短信
2.1、SmsService.java
package com.tanersci.service;
import com.tanersci.dto.SmsMessageDto;
import com.tanersci.dto.SmsTemplateDto;
import com.tanersci.vo.MessageVo;
/**
* @ClassName: SmsService.java
* @ClassPath: com.tanersci.service.SmsService.java
* @Description: 短信
* @Author: tanyp
* @Date: 2021/6/7 10:56
**/
public interface SmsService {
/**
* @MonthName: send
* @Description: 發(fā)短信
* @Author: tanyp
* @Date: 2021/6/7 14:50
* @Param: [dto]
* @return: com.tanersci.vo.MessageVo
**/
MessageVo send(SmsMessageDto dto);
* @MonthName: addSmsTemplate
* @Description: 申請短信模板
* @Param: [template]
MessageVo addSmsTemplate(SmsTemplateDto template);
* @MonthName: deleteSmsTemplate
* @Description: 刪除短信模板
MessageVo deleteSmsTemplate(SmsTemplateDto template);
* @MonthName: modifySmsTemplate
* @Description: 修改未通過審核的短信模板
MessageVo modifySmsTemplate(SmsTemplateDto template);
* @MonthName: querySmsTemplate
* @Description: 查詢短信模板的審核狀態(tài)
MessageVo querySmsTemplate(SmsTemplateDto template);
}2.2、SmsServiceImpl.java
package com.tanersci.service.impl;
import com.alibaba.fastjson.JSON;
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.tanersci.dto.SmsMessageDto;
import com.tanersci.dto.SmsTemplateDto;
import com.tanersci.vo.MessageVo;
import com.tanersci.config.SmsConfig;
import com.tanersci.constant.Constants;
import com.tanersci.service.SmsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.UUID;
/**
* @ClassName: SmsServiceImpl.java
* @ClassPath: com.tanersci.service.impl.SmsServiceImpl.java
* @Description: 短信
* @Author: tanyp
* @Date: 2021/6/7 10:57
**/
@Slf4j
@Service
public class SmsServiceImpl implements SmsService {
@Autowired
private SmsConfig smsConfig;
/**
* @MonthName: createClient
* @Description: SK初始化賬號Client
* @Author: tanyp
* @Date: 2021/6/7 15:44
* @Param: [accessId, accessKey, endpoint]
* @return: com.aliyun.teaopenapi.Client
**/
public Client createClient() throws Exception {
Config config = new Config();
config.accessKeyId = smsConfig.getAccessId();
config.accessKeySecret = smsConfig.getAccessKey();
config.endpoint = smsConfig.getEndpoint();
return new Client(config);
}
* @MonthName: send
* @Description: 發(fā)短信
* @Date: 2021/6/7 14:50
* @Param: [dto]
* @return: com.tanersci.vo.MessageVo
@Override
public MessageVo send(SmsMessageDto dto) {
try {
log.info("======發(fā)送短信開始,請求參數(shù):{}", JSON.toJSON(dto));
Client client = createClient();
// 組裝請求對象
SendSmsRequest request = new SendSmsRequest();
// 外部流水?dāng)U展字段
String outId = UUID.randomUUID().toString();
request.setOutId(outId);
// 支持對多個手機號碼發(fā)送短信,手機號碼之間以英文逗號(,)分隔。上限為1000個手機號碼。批量調(diào)用相對于單條調(diào)用及時性稍有延遲。
request.setPhoneNumbers(dto.getPhone());
// 短信簽名名稱
request.setSignName(smsConfig.getSignName());
// 短信模板ID
request.setTemplateCode(dto.getTemplateCode());
// 短信模板變量對應(yīng)的實際值,JSON格式。如果JSON中需要帶換行符,請參照標(biāo)準(zhǔn)的JSON協(xié)議處理。
request.setTemplateParam(JSON.toJSONString(dto.getParam()));
// 發(fā)送短信
SendSmsResponse res = client.sendSms(request);
MessageVo message = MessageVo.builder().build();
if (Objects.equals(Constants.NEWS_SUCCESS_CODE, res.body.getCode())) {
log.info("======發(fā)送短信成功,返回值:{}", JSON.toJSON(res.body));
message.setCode(Constants.NEWS_SUCCESS_CODE);
message.setMessage(Constants.NEWS_SUCCESS_MESSAGE);
} else {
log.info("======發(fā)送短信失敗,返回值:{}", JSON.toJSON(res.body));
message.setCode(Constants.NEWS_FAIL_CODE);
message.setMessage(Constants.NEWS_FAIL_MESSAGE);
}
return message;
} catch (Exception e) {
log.error("======發(fā)送短信異常:{}", e.getMessage());
e.printStackTrace();
return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
}
* @MonthName: addSmsTemplate
* @Description: 申請短信模板
* @Param: [template]
public MessageVo addSmsTemplate(SmsTemplateDto template) {
log.info("======申請短信模板,請求參數(shù):{}", JSON.toJSON(template));
AddSmsTemplateRequest request = new AddSmsTemplateRequest();
request.setTemplateType(template.getTemplateType());
request.setTemplateName(template.getTemplateName());
request.setTemplateContent(template.getTemplateContent());
request.setRemark(template.getRemark());
AddSmsTemplateResponse res = client.addSmsTemplate(request);
if (Objects.equals(TeamConstants.NEWS_SUCCESS_CODE, res.body.getCode())) {
log.info("======申請短信模板,返回值:{}", JSON.toJSON(res.body));
return MessageVo.builder()
.code(Constants.NEWS_SUCCESS_CODE)
.message(Constants.NEWS_SUCCESS_MESSAGE)
.templateCode(res.getBody().templateCode)
.build();
return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
log.error("======申請短信模板,異常:{}", e.getMessage());
* @MonthName: deleteSmsTemplate
* @Description: 刪除短信模板
public MessageVo deleteSmsTemplate(SmsTemplateDto template) {
log.info("======刪除短信模板,請求參數(shù):{}", JSON.toJSON(template));
DeleteSmsTemplateRequest request = new DeleteSmsTemplateRequest();
request.setTemplateCode(template.getTemplateCode());
DeleteSmsTemplateResponse res = client.deleteSmsTemplate(request);
log.info("======刪除短信模板,返回值:{}", JSON.toJSON(res.body));
return MessageVo.builder().code(Constants.NEWS_SUCCESS_CODE).message(Constants.NEWS_SUCCESS_MESSAGE).build();
log.error("======刪除短信模板,異常:{}", e);
* @MonthName: modifySmsTemplate
* @Description: 修改未通過審核的短信模板
public MessageVo modifySmsTemplate(SmsTemplateDto template) {
log.info("======修改未通過審核的短信模板,請求參數(shù):{}", JSON.toJSON(template));
ModifySmsTemplateRequest request = new ModifySmsTemplateRequest();
ModifySmsTemplateResponse res = client.modifySmsTemplate(request);
log.info("======修改未通過審核的短信模板,返回值:{}", JSON.toJSON(res.body));
log.error("======修改未通過審核的短信模板,異常:{}", e.getMessage());
* @MonthName: querySmsTemplate
* @Description: 查詢短信模板的審核狀態(tài)
public MessageVo querySmsTemplate(SmsTemplateDto template) {
log.info("======查詢短信模板的審核狀態(tài),請求參數(shù):{}", JSON.toJSON(template));
QuerySmsTemplateRequest request = new QuerySmsTemplateRequest();
QuerySmsTemplateResponse res = client.querySmsTemplate(request);
log.info("======查詢短信模板的審核狀態(tài),返回值:{}", JSON.toJSON(res.body));
log.error("======查詢短信模板的審核狀態(tài),異常:{}", e.getMessage());
}2.3、SmsConfig.java
package com.tanersci.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* @ClassName: SmsConfig.java
* @ClassPath: com.tanersci.config.SmsConfig.java
* @Description: 短信配置
* @Author: tanyp
* @Date: 2021/6/7 16:41
**/
@Data
@Component
public class SmsConfig {
@Value("${sms.access-id}")
private String accessId;
@Value("${sms.access-key}")
private String accessKey;
@Value("${sms.sign-name}")
private String signName;
@Value("${sms.endpoint}")
private String endpoint;
}2.4、VO、DTO類
MessageVo 同用郵件的
MailMessageDto.java
package com.tanersci.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @ClassName: MailMessageDto.java
* @ClassPath: com.tanersci.dto.SmsMessageDto.java
* @Description: 短信
* @Author: tanyp
* @Date: 2021/6/7 9:20
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "短信消息")
public class SmsMessageDto implements Serializable {
private static final long serialVersionUID = 3427970548460798908L;
@ApiModelProperty(value = "手機號,多個以逗號隔開")
private String phone;
@ApiModelProperty(value = "模板編碼")
private String templateCode;
@ApiModelProperty(value = "模板參數(shù)")
private TemplateParamDto param;
private String code;
}SmsTemplate.java
package com.tanersci.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @ClassName: SmsTemplate.java
* @ClassPath: com.tanersci.dto.SmsTemplateDto.java
* @Description: 短信模板
* @Author: tanyp
* @Date: 2021/6/7 15:02
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SmsTemplateDto implements Serializable {
private static final long serialVersionUID = -8909531614461840038L;
/**
* 模板類型:0:驗證碼,1:短信通知,2:推廣短信,3:國際/港澳臺消息。
*/
private Integer templateType;
* 模板名稱,長度為1~30個字符
private String templateName;
* 模板內(nèi)容,長度為1~500個字符
private String templateContent;
* 短信模板CODE
private String templateCode;
* 短信模板申請說明。請在申請說明中描述您的業(yè)務(wù)使用場景,長度為1~100個字符
private String remark;
}注意
項目中使用lombok插件和swagger依賴,無相關(guān)依賴的請自行修改。
到此這篇關(guān)于SpringBoot 集成短信和郵件的文章就介紹到這了,更多相關(guān)SpringBoot 集成短信和郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用SpringBoot發(fā)送郵件的方法詳解
- SpringBoot整合郵件發(fā)送的四種方法
- SpringBoot實現(xiàn)定時發(fā)送郵件的三種方法案例詳解
- Springboot發(fā)送郵件功能的實現(xiàn)詳解
- SpringBoot實現(xiàn)發(fā)送QQ郵件的示例代碼
- SpringBoot?Mail郵件任務(wù)詳情
- SpringBoot實現(xiàn)郵件發(fā)送的示例代碼
- SpringBoot實現(xiàn)發(fā)送郵件、發(fā)送微信公眾號推送功能
- Spring?Boot整合郵箱發(fā)送郵件實例
- SpringBoot實現(xiàn)發(fā)送電子郵件
- SpringBoot整合JavaMail實現(xiàn)發(fā)郵件的項目實踐
相關(guān)文章
在SpringBoot下讀取自定義properties配置文件的方法
這篇文章主要介紹了在SpringBoot下讀取自定義properties配置文件的方法,文中涉及到了Spring-boot中讀取config配置文件的兩種方式,需要的朋友可以參考下2017-12-12
springboot加載一個properties文件轉(zhuǎn)換為map方式
這篇文章主要介紹了springboot加載一個properties文件轉(zhuǎn)換為map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
SpringBoot獲取Request和Response方法代碼解析
這篇文章主要介紹了SpringBoot獲取Request和Response方法代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Java程序中使用JavaMail發(fā)送帶圖片和附件的郵件
這篇文章主要介紹了Java程序中使用JavaMail發(fā)送帶圖片和附件的郵件,JavaMail是專門用來處理郵件的Java API,需要的朋友可以參考下2015-11-11

