前言
前段时间接触了阿里的邮件推送,也是自己去摸索了一下,这个东西不是很难,就是一个发邮件,只是前面的配置有点蒙,刚好做了一个功能,写了一个demo,记录一下,有什么写的不好的地方请大家多多指正。提示:以下是本篇文章正文内容,下面案例可供参考
一、阿里邮件推送是什么?
邮件推送顾名思义: (DirectMail) 是一款简单高效的电子邮件发送服务,它构建在可靠稳定的阿里云基础之上,帮助您快速、精准地实现事务邮件、通知邮件和批量邮件的发送。
这里大家可以看下阿里的文档(文档链接放在下面),上面写的比较详细,我就不在啰嗦了,主要介绍前面准备工作,域名解析,和发送域名的配置。
二、阿里邮件配置
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>
代码结构;
测试。