参考文档:

如何在 DNS 服务器上配置域名:https://help.aliyun.com/knowledge_detail/39397.html?spm=5176.2020520150.102.d6.12837528Fc1Cy5

开通邮件服务:https://www.aliyun.com/product/directmail?spm=a2c4g.11186623.2.13.62122b31hNdHdL

API:https://help.aliyun.com/document_detail/29435.html

1. 首先得有个域名

2. 开通 邮件服务后,进入管理台,新增 发件域名,在弹出框中输入 域名,例如我的是  memory-back.club,然后点击配置

3. 拷贝配置到 域名解析配置处:

具体操作步骤:

(1)在解析设置页面添加 4条记录

第一条: 类型为 MX 的:

对应 收信配置中的 MX验证,类型、记录值一定要对应

第二条:类型为 TXT 的:

对应 发件设置中的 所有权验证,类型、主机记录、记录值一定要对应

第三条:类型为 TXT的:

对应 发信配置 中的 spf验证,类型、记录值 一定要对应

第四条:类型为 CNAME 的:

对应 跟踪配置中 的CNAME验证

4. 返回,点击 验证,点击确定

除了 spf验证 要慢点,其他的几乎秒级验证

当看到 状态 不为 待验证 时,即可使用

5. 添加 发件地址:

同时添加一下回信地址(就是用户 回复邮件了,发到哪个地址,如果不配置,用户回复了就无法收到),添加完后,点击验证回信地址,即确保回信邮箱是正常的

然后去回信邮箱点击 验证链接 即可验证成功

6. 服务端开发:

如果其他模块已经引入

aliyun-java-sdk-core 
的其他版本,建议 邮件服务放入单独的模块,因为 该依赖版本较低,如果放一起,会造成依赖冲突

(1)引入依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>amazingcenter</artifactId>
<groupId>com.team.amazingcenter</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>amazingcenter-email</artifactId>
<packaging>jar</packaging>

<name>amazingcenter-email</name>
<url>http://maven.apache.org</url>

<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dm</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
<dependency>
<groupId>com.team.amazingcenter</groupId>
<artifactId>amazingcenter-common</artifactId>
</dependency>
</dependencies>
</project>

  

(2)实体类

package com.team.amazingcenter.email.vo;

import lombok.Data;

import java.util.Date;

/**
* @version DataEmailVO.java v2.0
* @description:
* @author: wenze
* @create: 2020/9/10 17:47
**/
@Data
public class DataEmailVO { private String toAddress; private String subject; private String textBody; private String attachUrl; private Byte emailBusinessType; private Byte sended; private Date sendTime; private String ip; private String regionId; private Integer addressType; private Byte replyToAddress; private String htmlBody;
}

(3)EmailUtils:

package com.team.amazingcenter.email.utils;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dm.model.v20151123.BatchSendMailRequest;
import com.aliyuncs.dm.model.v20151123.BatchSendMailResponse;
import com.aliyuncs.dm.model.v20151123.SingleSendMailRequest;
import com.aliyuncs.dm.model.v20151123.SingleSendMailResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.team.amazingcenter.common.enumerate.AcceptLanguageEnum;
import com.team.amazingcenter.common.enumerate.locale.LocaleEnum;
import com.team.amazingcenter.common.utils.PropertiesUtil;
import com.team.amazingcenter.email.vo.DataEmailVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.ObjectUtils; import java.util.Objects; /**
* @version EmailUtils.java v2.0
* @description: 邮箱服务
* @author: wenze
* @create: 2020/9/9 21:44
* doc: https://help.aliyun.com/document_detail/29435.html
**/
@Slf4j
public class EmailUtils { /**
* key
*/
private static final String ACCESS_KEY_ID = PropertiesUtil.getProperty("api_access_key_id");
/**
* secret
*/
private static final String ACCESS_SECRET = PropertiesUtil.getProperty("api_access_key_secret");
/**
* 管理控制台中配置的发信地址 - 单个
*/
private static final String ACCOUNT_NAME_SINGLE = PropertiesUtil.getProperty("email_account_name_single");
/**
* 管理控制台中配置的发信地址 - 批量
*/
private static final String ACCOUNT_NAME_BATCH = PropertiesUtil.getProperty("email_account_name_batch");
/**
* 区域id - 国内
*/
private static final String EMAIL_REGION_ID_CN = PropertiesUtil.getProperty("email_region_id_cn", "");
/**
* 区域id - 新加坡
*/
private static final String EMAIL_REGION_ID_1 = PropertiesUtil.getProperty("email_region_id_1");
/**
* 区域id - 澳大利亚
*/
private static final String EMAIL_REGION_ID_2 = PropertiesUtil.getProperty("email_region_id_2");
/**
* 地址类型。取值:0:为随机账号 1:为发信地址
*/
private static final Integer ADDRESS_TYPE = 1; /**
* 发送邮件
*/
public static DataEmailVO singleSendMail(SingleSendMailRequest request, String key) { DataEmailVO emailVO = new DataEmailVO(); String regionId = EMAIL_REGION_ID_CN;
if (StringUtils.isNotBlank(key) && StringUtils.equals(key, AcceptLanguageEnum.LANGUAGE_EN_US.getLanguage())) {
regionId = EMAIL_REGION_ID_1;
} DefaultProfile profile = DefaultProfile.getProfile(regionId, ACCESS_KEY_ID, ACCESS_SECRET);
IAcsClient client = new DefaultAcsClient(profile); request.setAccountName(ACCOUNT_NAME_SINGLE);
request.setAddressType(ADDRESS_TYPE);
request.setRegionId(regionId); BeanUtils.copyProperties(request, emailVO);
emailVO.setReplyToAddress(request.getReplyToAddress() ? (byte) 1 : (byte) 0); emailVO.setSended((byte) 2);
try {
SingleSendMailResponse response = client.getAcsResponse(request);
if (Objects.isNull(response) || ObjectUtils.isEmpty(response)) {
emailVO.setSended((byte) 1);
}
} catch (ServerException e) {
log.info("ServerException,ErrCode:{},ErrMsg:{},RequestId:{}", e.getErrCode(), e.getErrMsg(), e.getRequestId());
return new DataEmailVO();
} catch (ClientException e) {
log.info("ClientException,ErrCode:{},ErrMsg:{},RequestId:{}", e.getErrCode(), e.getErrMsg(), e.getRequestId());
return new DataEmailVO();
} catch (Exception e) {
log.info("OtherException,ErrCode:{},ErrMsg:{},RequestId:{}", e);
return new DataEmailVO();
}
return emailVO;
} /**
* 批量发送邮件
*/
public void batchSendMail(BatchSendMailRequest request, String key) {
String regionId = EMAIL_REGION_ID_CN;
if (StringUtils.isNotBlank(key) && StringUtils.equals(key, LocaleEnum.ENG.getKey())) {
regionId = EMAIL_REGION_ID_1;
} DefaultProfile profile = DefaultProfile.getProfile(regionId, ACCESS_KEY_ID, ACCESS_SECRET);
IAcsClient client = new DefaultAcsClient(profile); request.setRegionId(regionId); try {
BatchSendMailResponse response = client.getAcsResponse(request);
System.out.println(JSON.toJSONString(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
} }
}

(4)PropertiesUtil

package com.team.amazingcenter.common.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; /**
* 读取公共配置文件
*
* @author juluo
*
*/
public class PropertiesUtil { /** 默认的properties */
private static final Properties DEFAULT_PROPERTIES;
static {
DEFAULT_PROPERTIES = getPropertiesByFileName("common.properties");
} /**
* 获取属性对应的值
*
* @param property
* 属性
* @param defaultValue
* 没找到值返回的默认值
* @return property 对应的值
*/
public static String getProperty(String property, String defaultValue) {
return DEFAULT_PROPERTIES.getProperty(property, defaultValue);
} /**
* 获取属性对应的值
*
* @param property
* 属性
* @return property 对应的值 ,or {@code null}
*/
public static String getProperty(String property) {
return DEFAULT_PROPERTIES.getProperty(property);
} /**
* 通过文件路径载入数据
*
* @param fileName
* 文件路径
* @return {@link Properties}
*/
public static Properties getPropertiesByFileName(String fileName) {
InputStream inputStream = PropertiesUtil.class.getClassLoader().getResourceAsStream(fileName);
Properties p = new Properties();
if (inputStream == null) {
return p;
}
try {
p.load(inputStream);
} catch (IOException ex) {
throw new RuntimeException(ex);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return p;
} /**
* 通过属性获取指定文件的值
*
* @param fileName
* 文件名
* @param propertie
* 属性
* @param defaultValue
* 默认值
* @return 属性对应的值
*/
public static String getProperty(String fileName, String propertie, String defaultValue) {
Properties p = getPropertiesByFileName(fileName);
return p.getProperty(propertie, defaultValue);
} public static void main(String[] args) {
System.out.println(PropertiesUtil.getProperty("file_oss_storage_path", ""));
} }

  其他模块需要使用时,直接通过 依赖引入的方式即可使用 邮箱服务

 <dependency>
<groupId>com.team.amazingcenter</groupId>
<artifactId>amazingcenter-email</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

(5)业务层:

    SingleSendMailRequest request = new SingleSendMailRequest();
request.setToAddress(email);
request.setSubject(I18nMessageUtil.getMessage(acceptLanguage, VerCodeTypeEnum.getDescByDesc(type), ""));
request.setTextBody(I18nMessageUtil.getMessage(acceptLanguage, I18nCodeEnum.PIN.getMsg(), "").replace("code", code));
request.setReplyToAddress(true); DataEmailVO vo = EmailUtils.singleSendMail(request, acceptLanguage);

  

java-阿里邮件推送服务开发 -- 发送邮箱验证码的更多相关文章

  1. Laravel 下结合阿里云邮件推送服务

    最近在学习laravel做项目开发,遇到注册用户推送邮件的问题,之前用java做的时候是自己代码写的,也就是用ECS推送邮件,但是现在转php的laravel了就打算用php的邮件发送功能来推送邮件, ...

  2. 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题

    在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单.. ...

  3. wordpress使用阿里云邮件推送服务实现发送邮件

    之前用腾迅云时,配置了wordpress是可以使用邮件服务的,然而到了阿里云,却无法使用了,有人说是因为阿里云关了25端口,但腾迅好像也关了. 百度看看有没有其他方法,最终让我找到个方法,可惜不是很完 ...

  4. Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  5. Netty_Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  6. 【netty】Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  7. Netty系列之Netty百万级推送服务设计要点(转)

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  8. Netty学习总结(3)——Netty百万级推送服务

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  9. MQTT协议及推送服务(二)

    MQTT简介 MQTT全称叫做Message Queuing Telemetry Transport,意为消息队列遥测传输,是IBM开发的一个即时通讯协议.由于其维护一个长连接以轻量级低消耗著称,所以 ...

随机推荐

  1. 一款吊炸天的AI图片增强工具!

    背景 如果你工作中需要制作文档,PPT,或者给文章配图,或者需要制作视频.一定会有在网上寻找图片素材的经历. 但网上的图质量参差不一,有时候找到了喜欢的图,但是质量不行,分辨率太低. 有的人就忍了,但 ...

  2. stop services in init

    echo 'manual' | sudo tee /etc/init/mysql.override # command from root shellecho manual >> /etc ...

  3. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  4. 站长管理服务器必读:Ftp、Ftps与Sftp三兄弟的不同与区别以及部署全指引

    文章标题: 站长管理服务器必读:Ftp.Ftps与Sftp三兄弟的不同与区别以及部署全指引 关键字 : ftp,sftp,freesshd,ftps 文章分类: 教程 创建时间: 2020年3月23日 ...

  5. Rabbitmq的死信

    一.概述 死信有死信队列.死信交换器和死信消息组成.死信消息则有如下三种情况生成: 1.消费者使用basic.reject或 basic.nack并将requeue参数设置为false来拒绝该消息 2 ...

  6. Water 2.4 发布,一站式服务治理平台

    Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...

  7. [hiho1952]运算数

    可以发现如果将根的结果写成多项式,可以发现只需要预处理出f[i][j]表示以i为根的子树j次项有多少个,g[i]表示从n个数中选取i个数相乘的和,就可以通过\sum_{i=1}^{n}f[1][i]\ ...

  8. 一文理解Java-class字节码文件

    前言 java语言在其刚诞生之际喊出的口号--"Write Once,Run Anywhere",正是基于字节码(byte code)而存在的,java能够做到平台无关性,得力于这 ...

  9. jvm的垃圾回收

    首先类加载的过程:加载验证准备解析初始化 类加载器: jvm内存模型图: 空着,等以后补上 jvm垃圾收集器 目前只知道,parnew,cms,g1 parnew新生代垃圾回收器,复制算法 cms复制 ...

  10. nginx安装与配置1-nginx安装

    反向代理: 客户端不需要配置就可以访问,将请求发送到反向代理服务器, 由反向代理服务器选择目标服务器获取数据,再返回客户端,对外暴露代理服务器地址,隐藏真实ip 负载均衡: 客户端请求nginx等服务 ...