工具类 ``
public class MailUtil {
private static final String ALIDM_SMTP_HOST = "smtpdm.aliyun.com";
//private static final String ALIDM_SMTP_PORT = "25";//或"80"
public void sendEmail(String email,String content) {
// 配置发送邮件的环境属性
final Properties props = new Properties();
// 表示SMTP发送邮件,需要进行身份验证
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", ALIDM_SMTP_HOST);
//props.put("mail.smtp.port", ALIDM_SMTP_PORT);
// 如果使用ssl,则去掉使用25端口的配置,进行如下配置,
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.port", "465");
// 发件人的账号,填写控制台配置的发信地址,比如xxx@xxx.com
props.put("mail.user", "*****");
// 访问SMTP服务时需要提供的密码(在控制台选择发信地址进行设置)
props.put("mail.password", "****");
// 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
[@Override](https://my.oschina.net/u/1162528)
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
//UUID uuid = UUID.randomUUID();
//final String messageIDValue = "<" + uuid.toString() + ">";
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession){
//[@Override](https://my.oschina.net/u/1162528)
//protected void updateMessageID() throws MessagingException {
//设置自定义Message-ID值
//setHeader("Message-ID", messageIDValue);
//}
};
try {
// 设置发件人邮件地址和名称。填写控制台配置的发信地址,比如xxx@xxx.com。和上面的mail.user保持一致。名称用户可以自定义填写。
InternetAddress from = new InternetAddress("postmaster@email.u-live.com.cn", "深圳优企在线传媒");
message.setFrom(from);
//可选。设置回信地址
/* Address[] a = new Address[1];
a[0] = new InternetAddress("***");
message.setReplyTo(a);*/
// 设置收件人邮件地址,比如yyy@yyy.com
InternetAddress to = new InternetAddress(email);
message.setRecipient(MimeMessage.RecipientType.TO, to);
//如果同时发给多人,才将上面两行替换为如下(因为部分收信系统的一些限制,尽量每次投递给一个人;同时我们限制单次允许发送的人数是30人):
//InternetAddress[] adds = new InternetAddress[2];
//adds[0] = new InternetAddress("xxxxx@qq.com");
//adds[1] = new InternetAddress("xxxxx@qq.com");
//message.setRecipients(Message.RecipientType.TO, adds);
// 设置邮件标题
message.setSubject("验证邮件");
// 设置邮件的内容体
message.setContent(content, "text/html;charset=UTF-8");
//若需要开启邮件跟踪服务,请使用以下代码设置跟踪链接头。首先域名需要备案,设置且已正确解析了CNAME配置;其次发信需要打Tag,此Tag在控制台已创建并存在,Tag创建10分钟后方可使用;
//String tagName = "Test";
//HashMap<String, String> trace = new HashMap<>();
//trace.put("OpenTrace", "1");
//trace.put("TagName", tagName);
//String jsonTrace = JSON.toJSONString(trace);
//String base64Trace = new String(Base64.encodeBase64(jsonTrace.getBytes()));
//设置跟踪链接头
//message.addHeader("X-AliDM-Trace", base64Trace);
// 发送邮件
Transport.send(message);
}
catch (MessagingException e) {
String err = e.getMessage();
// 在这里处理message内容, 格式是固定的
System.out.println(err);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
} ``
控制层
``
@RequestMapping(value="send")
public Result<String> send(@RequestParam("userId")long userId,@RequestParam("email")String email,HttpServletRequest request){
Result<String> rs = new Result<String>();
//随机生成密码
int mobile_code = (int)((Math.random()*9+1)*100000);
//获取用户信息
UserDto userDto = userService.searchUser(userId);
SAXReader reader = new SAXReader();
Document document = null;
try {
//获取文档
document = reader.read(AppUpdateEmailController.class.getResource("d:emailCode.html").getPath());
String codeUrlString="emailCode.html";
document = reader.read(codeUrlString);
Element root = document.getRootElement();
//分别获取id为name、message、time的节点。
Element name = getNodes(root,"id","name");
Element emailCode = getNodes(root,"id","emailCode");
Element time = getNodes(root, "id", "time");
//设置收件人姓名,通知信息、当前时间
Calendar calendar = Calendar.getInstance();
time.setText(calendar.get(Calendar.YEAR)+"年"+(calendar.get(Calendar.MONTH)+1)+
"月"+calendar.get(Calendar.DATE)+"日 "+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND));
name.setText(""+userDto.getCompanyName());
emailCode.setText(""+mobile_code);
//保存到临时文件
FileWriter fwriter = new FileWriter("d:emailCode.html");
XMLWriter writer = new XMLWriter(fwriter);
writer.write(document);
writer.flush();
//读取临时文件,并把html数据写入到字符串str中,通过邮箱工具发送
FileReader in = new FileReader("d:emailCode.html");
char[] buff = new char[1024*10];
in.read(buff);
String str = new String(buff);
System.out.println(str.toString());
new MailUtil().sendEmail(email, str);
// new MailSenderUtil.Builder(str.toString(),email).send();
} catch (Exception e) {
e.printStackTrace();
}
rs.setCode(0);
String code = String.valueOf(mobile_code);
request.getSession().setAttribute("code", code);
rs.setData(code);
rs.setMsg("验证码发送成功");
return rs;
}
/**
* 方法描述:递归遍历子节点,根据属性名和属性值,找到对应属性名和属性值的那个子孙节点。
* @param node 要进行子节点遍历的节点
* @param attrName 属性名
* @param attrValue 属性值
* @return 返回对应的节点或null
*/
public Element getNodes(Element node, String attrName, String attrValue) {
final List<Attribute> listAttr = node.attributes();// 当前节点的所有属性
for (final Attribute attr : listAttr) {// 遍历当前节点的所有属性
final String name = attr.getName();// 属性名称
final String value = attr.getValue();// 属性的值
System.out.println("属性名称:" + name + "---->属性值:" + value);
if(attrName.equals(name) && attrValue.equals(value)){
return node;
}
}
// 递归遍历当前节点所有的子节点
final List<Element> listElement = node.elements();// 所有一级子节点的list
for (Element e : listElement) {// 遍历所有一级子节点
Element temp = getNodes(e,attrName,attrValue);
// 递归
if(temp != null){
return temp;
};
}
return null;
}
``
html网页
``
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html><html>
<head>
<meta charset="utf-8"/>
<title>通知邮件</title>
<style type="text/css">
body{
font-size: 10pt;
}
.header,.content,.footer{
width: 600px;
height: 180px;
}
.footer{
text-align: right;
}
#name{
color: grey;
}
#message{
color: grey;
}
</style>
</head>
<body>
<div class="content">
你好,<span id="name">铭铭</span>:<br/><br/>
<div id="message">
<span> </span><span>你的验证码是:</span><span id="emailCode">538282</span>。
</div>
<div class="footer">
(<span id="time">2018-12-1 17:40:29</span>)
</div>
</div>
</body>
</html>
``