项目做异地登录提醒功能,通过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看一下是不是模板放错位置了。
这只是简单的发送简单的格式的邮件的简单代码实现。