由于项目需要使用邮件发送,所以最近学习了一下利用spring机制来发送邮件。这里大致记录一下其实现。
首先,需要在项目中导入两个包,一个是mailapi-XX.jar,一个是smtp-xx.jar。其中xx代表版本号。倘若使用maven更简单了,直接添加:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.4</version>
</dependency>
然后就是我们的邮件发送的方法了。倘若要把这个做成工具类,完全可以将其改成静态方法。
private static EmailDetails emailDetails;
public static void resetEmailDetails(){
emailDetails = null;
logger.info("EmailService:重置emailDetails=null");
}
public void sendMail(String toEmail, String subject, String htmlContent) {
if(emailDetails == null){
emailDetails = iSysConfigService.getEmailDetails();
logger.info("EmailService:重置emailDetails={}", JSONArray.fromObject(emailDetails));
}
if(StringUtil.isEmpty(toEmail)||StringUtil.isEmpty(subject)||StringUtil.isEmpty(htmlContent)){
throw new BusinessException("需要发送的信息(目标邮箱、主题、内容)不完整");
}
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
// 发送邮箱的邮件服务器
senderImpl.setHost(emailDetails.getHost());
// 建立邮件消息,发送简单邮件和html邮件的区别
MimeMessage mailMessage = senderImpl.createMimeMessage();
// 为防止乱码,添加编码集设置
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, "UTF-8");
// System.out.println("发件人地址1:"+SystemConfig.getGuestUsername());
try {
// 接收方邮箱
messageHelper.setTo(toEmail);
} catch (MessagingException e) {
throw new RuntimeException("收件人邮箱地址出错!");
}
try {
// 发送方邮箱
messageHelper.setFrom(emailDetails.getFrom());
} catch (MessagingException e) {
throw new RuntimeException("发件人邮箱地址出错!");
}
try {
messageHelper.setSubject(subject);
} catch (MessagingException e) {
throw new RuntimeException("邮件主题出错!");
}
try {
// true 表示启动HTML格式的邮件
messageHelper.setText(htmlContent, true);
} catch (MessagingException e) {
throw new RuntimeException("邮件内容出错!");
}
Properties prop = new Properties();
// 将这个参数设为true,让服务器进行认证,认证用户名和密码是否正确
prop.put("mail.smtp.auth", "true");
// 超时时间
prop.put("mail.smtp.timeout", "25000");
// 添加验证
// MyAuthenticator auth = new MyAuthenticator(SystemConfig.getEmailUsername(),
// SystemConfig.getEmailPassword());
MyAuthenticator auth = new MyAuthenticator(emailDetails.getUsername(),
emailDetails.getPassword());
Session session = Session.getDefaultInstance(prop, auth);
senderImpl.setSession(session);
// senderImpl.setJavaMailProperties(prop);
// 发送邮件
try {
senderImpl.send(mailMessage);
logger.info("发送邮件成功,收件人:{},主题:{}",toEmail,subject);
} catch (Exception e){
throw new BusinessException("发送邮件失败!");
}
}
这里我们还需要一个验证的类,用来验证你提供的发送方的信息是否正确(其实是163获取qq等服务器验证你提供的信息,验证不通过人家不给你发送。)这个类你可以放在上面方法的并列位置作为一个邮件发送工具类的内部类。
//验证发送方的用户名和密码,验证成功后,邮箱服务器才允许发送邮件
class MyAuthenticator extends Authenticator{
private String username;
private String password;
public MyAuthenticator(String username,String password){
super();
this.username=username;
this.password=password;
}
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(username, password);
}
}
当然有了这些群发自然变成很简单的事情了(重载即可):
//群发
public void sendMail(List<String> toEmailList, String subject, String htmlContent){
for(String toEmail:toEmailList){
sendMail(toEmail,subject,htmlContent);
}
}
这样就可以实现邮件的发送了。
这里说明一下参数:发送方参数:from:发送方邮箱;host:发送服务器(如果你发送方是163邮箱,则为smtp.163.com这种);username:发送方邮箱的用户名;password:发送方邮箱密码。我这里因为是在数据库中以json形式存储,所以用一个类来管理的,就是emailDetails,可以自己配置。
发送数据:toEmail:收件邮箱;subject:主题;htmlContent:html形式的内容。
测试截图: