2021-09-18


前言

前段时间接触了阿里的邮件推送,也是自己去摸索了一下,这个东西不是很难,就是一个发邮件,只是前面的配置有点蒙,刚好做了一个功能,写了一个demo,记录一下,有什么写的不好的地方请大家多多指正。

提示:以下是本篇文章正文内容,下面案例可供参考

一、阿里邮件推送是什么?

邮件推送顾名思义: (DirectMail) 是一款简单高效的电子邮件发送服务,它构建在可靠稳定的阿里云基础之上,帮助您快速、精准地实现事务邮件、通知邮件和批量邮件的发送。
这里大家可以看下阿里的文档(文档链接放在下面),上面写的比较详细,我就不在啰嗦了,主要介绍前面准备工作,域名解析,和发送域名的配置。

https://help.aliyun.com/document_detail/29414.html

二、阿里邮件配置

1.阿里云邮件配置步骤

流程如下(示例):

在这里插入图片描述

2.创建发送域名

这里输入你的域名(如果作为邮件使用可以不备案)
在这里插入图片描述
创建好之后点开配置(开始查看域名配置)
在这里插入图片描述

在这里插入图片描述
找到域名的供应商,开始解析域名,我用的是腾讯云的,特意去买了一个域名,一块钱,只为测试使用
在这里插入图片描述

打开腾讯云域名解析(https://console.cloud.tencent.com/cns)
在这里插入图片描述
然后开始解析域名,这里对应我们之前创建阿里云发送域名那里的配置,这里有个坑,如果没有主机记录,就直接默认就好,腾讯云是@,配置好之后等待验证,一般几分钟就验证好,验证好之后它有四个状态,只要不是待验证就可以使用了。
在这里插入图片描述

3.创建发送地址(重要)

这里新建发送地址,域名就选择之前验证通过的,其它的按照它的描述填写就好
在这里插入图片描述
填好之后,然后设置SMTP密码(重要,这里相当于发邮箱的账号和密码)
在这里插入图片描述
全部填好之后就可以使用的,由于我们使用的是Java代码发送邮件,后面那些标签、模板配置可不配,我们直接在代码里面解析模板就可。

三、发送邮件

代码如下(示例):

package com.it.demo;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.StringWriter;
import java.util.Date;
import java.util.Properties;

public class EmailUtil {

    private static Logger logger = LoggerFactory.getLogger(EmailUtil.class);

    private static final String ENCODING = "UTF-8";
    /**
     * 配置的邮箱账号
     */
    private static final String emailAccount="";

    /**
     * 配置的邮箱密码
     */
    private static final String emailPassword="";
    // 邮箱smtp协议 这里是使用阿里云的
    public static final String myEmailSMTPHost = "smtpdm.aliyun.com";
    /**
     * Velocity模板文件路径分隔符
     */
    public static final String SLASH = "/";

    private static VelocityEngine velocityEngine;

    /**
     *
     * @param content 邮件内容
     * @param title 邮件标题
     * @param to 收件人邮箱 多个","隔开
     * @param emailName 发件人姓名
     * @return
     */
    public static boolean sendEmail(String content, String title, String to, String emailName) {
        try {
            // 1. 创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();          // 参数配置
            props.setProperty("mail.transport.protocol", "smtp");  // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", myEmailSMTPHost);  // 发件人的邮箱的 SMTP 服务器地址
            props.setProperty("mail.smtp.auth", "true");      // 需要请求认证
            // 2. 根据配置创建会话对象, 用于和邮件服务器交互
            Session session = Session.getInstance(props);
            session.setDebug(true);
            // 3. 创建一封邮件
            MimeMessage message = new MimeMessage(session);

            // 4. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
            message.setFrom(new InternetAddress(emailAccount, emailName, ENCODING));

            // 5. To: 收件人(可以增加多个收件人、抄送、密送)
/*            message.setRecipient(MimeMessage.RecipientType.TO,
                    new InternetAddress(to, cc, ENCODING));*/

            // 设置多个收件人地址
            InternetAddress[] internetAddressTo = new InternetAddress().parse(to);
            message.setRecipients(Message.RecipientType.TO, internetAddressTo);


            // 6. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
            message.setSubject(title, "UTF-8");

            // 7. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
            message.setContent(content, "text/html;charset=UTF-8");

            // 8. 设置发件时间
            message.setSentDate(new Date());

            // 9. 保存设置
            message.saveChanges();
            // 10. 根据 Session 获取邮件传输对象
            Transport transport = session.getTransport();

            // 11. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
            transport.connect(emailAccount, emailPassword);

            // 12. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());

            // 13. 关闭连接
            transport.close();
            logger.info("send success!");
            return true;
        } catch (Exception e) {
            logger.error("发送邮件失败", e);
            return false;
        }
    }

    /**
     * 解析Velocity模板文件,产生email模板
     * @param templateName  模板文件名称
     * @param context,存放解析时用到的变量
     * @return Ext代码
     */
    public static String evaluate(String templateName, VelocityContext context) {
        String resourceName = "vm" + SLASH + templateName;
        try {
            Template template = getVelocityEngine().getTemplate(resourceName, ENCODING);
            StringWriter writer = new StringWriter();
            template.merge(context, writer);
            return writer.getBuffer().toString();
        } catch (ResourceNotFoundException e) {
            throw new RuntimeException(e);
        } catch (ParseErrorException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static synchronized VelocityEngine getVelocityEngine() {
        if (velocityEngine == null) {
            velocityEngine = new VelocityEngine();
            Properties p = new Properties();
            p.setProperty("resource.loader", "class");
            p.setProperty("class.resource.loader.class",
                    "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            p.setProperty("input.encoding", ENCODING);
            p.setProperty("output.encoding", ENCODING);
            p.setProperty("class.resource.loader.cache", "true");
            try {
                velocityEngine.init(p);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return velocityEngine;
    }
}

模板html(示例):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>测试</title>
</head>
<body>
<table cellpadding="0" cellspacing="0" style="width:700px; margin:0px; padding:0px;font-size:14px; line-height:22px; color:#333; margin:0 auto ">
    <tbody>
    <tr>
        <td align="center" style="font-size:18px; font-weight:bold; color:#444;width:700px; padding:18px 0px 5px 0px;">测试</td>
    </tr>
    <tr>
        <td style="padding-bottom:12px;">亲爱的${email}:</td>
    </tr>
    <tr>
        <td style="padding-bottom:12px;">您好!验证码为:${code}</td>
    </tr>
    <tr>
        <td style="padding-bottom:12px;">本验证码超过10分钟,将会失效,需重新获取。</td>
    </tr>
    </tbody>
</table>
</body>
</html>

模板解析用的是这个类VelocityContext,大家可以去百度一下这个类,看下源码,拿过来用比较简单

import com.it.demo.EmailUtil;
import org.apache.velocity.VelocityContext;
import org.junit.jupiter.api.Test;

public class EmailUtilTest {

    @Test
    public void Test() {
        //解析模板 获取模板内容
        VelocityContext context=new VelocityContext();
        //这里对于模板里面的email,code
        context.put("email","王先生");
        context.put("code","1234");
        String content = EmailUtil.evaluate("emailCode.html", context);
        //注意输入收件人邮箱
        EmailUtil.sendEmail(content,"测试","","傅斯年");
    }
}

maven包。

 <dependencies>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
                   <artifactId>velocity</artifactId>
                    <version>1.7</version>
                </dependency>
                 <dependency>
                    <groupId>org.apache.velocity</groupId>
                    <artifactId>velocity-tools</artifactId>
                   <version>2.0</version>
                </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>
    </dependencies>

代码结构;
在这里插入图片描述

测试。
在这里插入图片描述


总结

明天就放中秋假了,现在这里祝福大家诸事顺心,样样圆满, demo码云地址(https://gitee.com/DataOut/email-test.git) 我是葡语不定时更新工作上学到的知识。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值