欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

java velocity 邮件_邮件集成java mail + 读取邮件模板

发布时间:2025/3/12 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java velocity 邮件_邮件集成java mail + 读取邮件模板 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

项目做异地登录提醒功能,通过java mail发送邮件。读取邮件模板sendMail.vm文件。

1.邮件发送

import java.io.StringWriter;

import java.util.Properties;

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMessage.RecipientType;

import org.apache.velocity.Template;

import org.apache.velocity.VelocityContext;

import org.apache.velocity.app.Velocity;

import org.apache.velocity.app.VelocityEngine;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.scheduling.annotation.Async;

public class SendMailSenderServiceImpl implements IMailSenderService {

private static final Logger LOG = LoggerFactory.getLogger(SendMailSenderServiceImpl.class);

private String mailTitle;

private String mailContent;

private String smptHost;

private String mailServicePwd;

private String mailServiceUser;

private String sendMail;

private String transProtocol;

private String port;

private String auth;

@Async

public void sendMail(String address, String username, String date, String place) {

if(address.isEmpty()) {

LOG.debug("{} not bind email.",username);

return;

}

Properties props = new Properties();

props.setProperty("mail.smtp.host", smptHost);

props.setProperty("mail.transport.protocol", transProtocol);

props.setProperty("mail.smtp.auth", auth);

props.setProperty("mail.smtp.port", port);

Session session = Session.getInstance(props);

Message message = new MimeMessage(session);

try {

message.setFrom(new InternetAddress(sendMail));

message.setRecipient(RecipientType.TO, new InternetAddress(address));

message.setSubject(mailTitle);

message.setContent(getMailContent(mailContent, username, date, place), "text/html;charset=utf-8");

Transport transport = session.getTransport();

transport.connect(smptHost, mailServiceUser, mailServicePwd);

transport.sendMessage(message, message.getAllRecipients());

} catch (Exception e) {

LOG.error("Send mail failed.{}", e);

}

}

使用@Async做异步的调用,避免调用发送邮件的功能时阻塞服务的运行。

mail.smtp.host授权的邮件平台:smtp.163.com

mail.transport.protocol 邮件传输协议:smtp

mail.smtp.auth 当前值默认为false,为false时可以不使用发件邮箱和密码,设置为null。设置为true则必须校验用户名和密码。

mail.smtp.port 邮件服务端口

mailtitle和mailcontent模板通过xml注入到bean中,记得写set方法,直接使用的properties中的内容。

这里因为引用的sendMail.vm文件的模板内容,所以需要去将模板内容读取出来。

模板内容很简单,需要使用html语法来操作换行和样式:

尊敬的用户:

${name},您好!

您的用户帐号${name}于${date},在${place}进行登录,存在异地登录行为。请确保是本人操作。

系统邮件自动发送,请勿回复!

读取模板内容通过调用方法:

public String getMailContent(String mailContent, String name, String date, String place) {

StringWriter stringWriter = new StringWriter(); // velocity引擎

VelocityEngine velocityEngine = new VelocityEngine(); // 设置文件路径属性

Properties properties = new Properties();

String dir = SendMailSenderServiceImpl.class.getResource("/").getPath();

properties.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, dir); // 引擎初始化属性配置

try {

velocityEngine.init(properties); // 加载指定模版

Template template = velocityEngine.getTemplate(mailContent, "utf-8"); // 填充模板内容

VelocityContext velocityContext = new VelocityContext();

velocityContext.put("name", name);

velocityContext.put("date", date);

velocityContext.put("place", place);

template.merge(velocityContext, stringWriter);

return stringWriter.toString();

} catch (Exception e) {

LOG.error("Get Mail Content failed.{}", e);

return "fail";

}

}

这里需要注意的就是文件路径。代码中的mailContent就是模板文件名sendMail.vm。再就是模板存放的位置,我的存放在classes下面。如果读取不到,就要debug看一下是不是模板放错位置了。

这只是简单的发送简单的格式的邮件的简单代码实现。

总结

以上是生活随笔为你收集整理的java velocity 邮件_邮件集成java mail + 读取邮件模板的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。