短信服务以及邮件推送服务使用的都是阿里云的产品,短信服务是收费的,所以需要选择短信服务的套餐并预充值才能使用。邮件推送服务是有200条的免费额度。
一:短信服务
1、申请短信签名、短信模板
到阿里云的短信服务 控制台,国内消息:签名管理中申请短信签名,模板管理中申请短信模板。
2、申请accessKeyId和accessKeySecret:
①:到RAM访问控制,人员管理,用户,新建用户
2、在新建用户里,填入登录名称以及显示名称,并勾选编程访问,至此短信服务的准备工作就完了。
附:还需要加入短信API使用的权限
3、在spring boot的pom.xml中加入阿里云短信服务的依赖,并加入JSON的依赖
<!-- 阿里云服务依赖 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
<!-- 阿里云短信服务依赖 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
<!-- 阿里云JSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
4、将申请好的短信服务的短信签名、短信模板、accessKeyId、accessKeySecret等放到配置文件中,最好使用.properties格式的,yml格式的我使用配置类没有读取成功:
#短信服务 accessKeyId
msn.accessKeyId=accessKeyId
#短信服务 accessKeySecret
msn.accessKeySecret=accessKeySecret
#短信服务 产品名称:云通信短信API产品,开发者无需替换
msn.product=Dysmsapi
#短信服务 发送短信的域名
msn.domain=dysmsapi.aliyuncs.com
#短信服务 区域Id
msn.regionId=cn-hangzhou
#短信服务 签名
msn.signName=阿里云短信签名(最好将短信签名写进代码里,否则会出现程序读取短信签名时乱码,导致读取失败,从而无法发送短信)
#短信服务 模板
msn.templateCode=阿里云短信模板
#短信服务 模板参数
msn.templateParam=code
#短信服务 发送日期 支持30天内记录查询,格式yyyyMMdd
msn.dateFormat=yyyyMMdd
#短信服务 服务节点
msn.endpointName=cn-hangzhou
5、使用配置类读取配置文件中的短信配置:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:msn.properties")
@ConfigurationProperties(prefix = "msn")
@Data
public class MsnConfig {
/**
* accessKeyId
*/
private String accessKeyId;
/**
* accessKeySecret
*/
private String accessKeySecret;
/**
*产品名称:云通信短信API产品,开发者无需替换
*/
private String product;
/**
*发送短信的域名
*/
private String domain;
/**
*区域Id
*/
private String regionId;
/**
*签名
*/
private String signName;
/**
*模板
*/
private String templateCode;
/**
*模板参数
*/
private String templateParam;
/**
*发送日期 支持30天内记录查询,格式yyyyMMdd
*/
private String dateFormat;
/**
*服务节点
*/
private String endpointName;
}
6、短信服务核心代码:
@GetMapping("/msn")
public String sendMsn() {
//短信发送结果
String result = "";
String regionId = msnConfig.getRegionId();
String accessKeyId = msnConfig.getAccessKeyId();
String accessSecret = msnConfig.getAccessKeySecret();
String signName = msnConfig.getSignName();
System.out.println("显示signName:"+signName);
String templateCode = msnConfig.getTemplateCode();
String templateParam = msnConfig.getTemplateParam();
Map<String,String> map = new HashMap<>();
//随机生成六位验证码
String verifyCode = String.valueOf((Math.random()*9+1)*100000).substring(0,6);
map.put(templateParam,verifyCode);
String code = JSON.toJSONString(map);
DefaultProfile profile = DefaultProfile.getProfile(regionId,accessKeyId,accessSecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("RegionId", regionId);
request.putQueryParameter("PhoneNumbers", "手机号码");
request.putQueryParameter("SignName", "短信签名");
request.putQueryParameter("TemplateCode", templateCode);
request.putQueryParameter("TemplateParam",code);
try {
CommonResponse response = client.getCommonResponse(request);
result = response.getData();
System.out.println();
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return result;
}
读取配置类中的短信签名时会出现乱码:
7、测试:
此结果表示短信发送成功,短信服务开发完成。
二、邮件推送服务:
开发邮件服务需要有持有域名才行,由于本文讲的是邮件推送服务,对于如何购买域名等问题请自行解决。
1、在邮件服务-邮件设置-发信域名:新建发信域名(此为示例):
2、发信配置:
3、到域名提供商处添加相应的配置。
4、发信地址设置:
5、设置邮件标签
6、到RAM访问控制台新建邮件发送的用户,步骤与开发短信服务时的操作一致,故不再赘述。,但也需要加邮件推送API使用的权限,至此邮件推送的准备工作已完毕。
7、在pom.xml中加入阿里云邮件推送使用的依赖
<!-- 阿里云服务依赖 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
<!-- 阿里云邮箱服务依赖 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dm</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 阿里云JSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
8、将邮件推送服务使用的配置写入到配置文件中:
#邮件服务 accessKeyId
mail.accessKeyId=
#邮件服务 accessKeySecret
mail.accessKeySecret=
#邮件服务 发信地址
mail.accountName=
#邮件服务 区域Id
mail.regionId=cn-hangzhou
#邮件服务 发信人昵称
#mail.sendPersonName=(程序无法正常读取中文,若是中文应写到程序中)
#邮件服务 取值范围 0~1: 0 为随机账号;1 为发信地址
mail.addressType=1
#邮件服务 控制台创建的标签
mail.tagName=
#邮件服务 回信地址
mail.replyToAddress=true
#邮件服务 目标地址
mail.toAddress=邮件接收人的邮箱
9、配置类读取邮件推送配置
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("classpath:mail.properties")
@ConfigurationProperties(prefix = "mail")
@Data
public class MailConfig {
/**
* accessKeyId
*/
private String accessKeyId;
/**
* accessKeySecret
*/
private String accessKeySecret;
/**
* 发信地址
*/
private String accountName;
/**
*区域Id
*/
private String regionId;
/**
*发信人昵称
*/
private String sendPersonName;
/**
*发信地址代码 1
*/
private Integer addressType;
/**
*控制台创建的标签
*/
private String tagName;
/**
*回信地址
*/
private boolean replyToAddress;
/**
*目标地址
*/
private String toAddress;
}
10、邮件推送核心代码(此为示例):
@GetMapping("/mail")
public String sample() {
//邮件发送结果
String result = "";
// 如果是除杭州region外的其它region(如新加坡、澳洲Region),需要将下面的"cn-hangzhou"替换为"ap-southeast-1"、或"ap-southeast-2"。
IClientProfile profile = DefaultProfile.getProfile(mailConfig.getRegionId(), mailConfig.getAccessKeyId(), mailConfig.getAccessKeySecret());
// 如果是除杭州region外的其它region(如新加坡region), 需要做如下处理
//try {
//DefaultProfile.addEndpoint("dm.ap-southeast-1.aliyuncs.com", "ap-southeast-1", "Dm", "dm.ap-southeast-1.aliyuncs.com");
//} catch (ClientException e) {
//e.printStackTrace();
//}
IAcsClient client = new DefaultAcsClient(profile);
SingleSendMailRequest request = new SingleSendMailRequest();
try {
//request.setVersion("2017-06-22");// 如果是除杭州region外的其它region(如新加坡region),必须指定为2017-06-22
request.setAccountName(mailConfig.getAccountName());
request.setFromAlias("发信人昵称");
request.setAddressType(mailConfig.getAddressType());
request.setTagName(mailConfig.getTagName());
request.setReplyToAddress(true);
request.setToAddress(mailConfig.getToAddress());
//可以给多个收件人发送邮件,收件人之间用逗号分开,批量发信建议使用BatchSendMailRequest方式
//request.setToAddress("邮箱1,邮箱2");
request.setSubject("尊敬的用户您好:");
//随机生成六位验证码
String verifyCode = String.valueOf((Math.random()*9+1)*100000).substring(0,6);
request.setHtmlBody("此邮件为开发邮件功能的测试邮件,验证码为:"+verifyCode);
//开启需要备案,0关闭,1开启
//request.setClickTrace("0");
//如果调用成功,正常返回httpResponse;如果调用失败则抛出异常,需要在异常中捕获错误异常码;错误异常码请参考对应的API文档;
SingleSendMailResponse httpResponse = client.getAcsResponse(request);
result = httpResponse.getEnvId() + " "+httpResponse.getRequestId();
} catch (ServerException e) {
//捕获错误异常码
System.out.println("ErrCode : " + e.getErrCode());
e.printStackTrace();
}
catch (ClientException e) {
//捕获错误异常码
System.out.println("ErrCode : " + e.getErrCode());
e.printStackTrace();
}
return result;
}
11、发送邮件:返回结果若出现此结果,则表示发送成功,可查看邮件。
三、总结:
使用阿里云的短信服务、邮件推送服务开发短信通知及邮件通知功能,过程并不复杂,可把发送的验证码存储到数据库或缓存中,用来进行注册或登陆验证。