邮件集成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后端-技术)