欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-10 19:00:28
项目做异地登录提醒功能,通过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;......

项目做异地登录提醒功能,通过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语法来操作换行和样式:

<html>
<body>
尊敬的用户:<br/> 

  ${name},您好! <br/>

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

系统邮件自动发送,请勿回复! 
</body>
</html>

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

	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看一下是不是模板放错位置了。

 

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

 

 

本文地址:https://blog.csdn.net/qq_28600087/article/details/85783792

相关标签: java