zoukankan      html  css  js  c++  java
  • java-阿里邮件推送服务开发 -- 发送邮箱验证码

    参考文档:

    如何在 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);
    

      

  • 相关阅读:
    [USACO18OPEN]Talent Show
    Linux关机、重启命令
    [SHOI2014]概率充电器
    mount新磁盘
    [JLOI2012]时间流逝
    创建、删除swap分区
    牛客网NOIP赛前集训营-普及组(第二场)
    从show slave status 中1062错误提示信息找到binlog的SQL
    [USACO18OPEN]Out of Sorts P 冒泡排序理解之二
    ORA-28040: No matching authentication protocol
  • 原文地址:https://www.cnblogs.com/wtx106/p/13641225.html
Copyright © 2011-2022 走看看