【JAVA】基于SMTP发送邮件遇到的问题
前言
公司要做一个授权提醒的小程序,记录哪些运维系统的授权将要到期,提醒对应的人员进行授权的更新。
代码
package com.ruoyi.project.system.LicenseContent.task;
import java.util.Properties;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import com.ruoyi.common.utils.CacheUtils;
import com.ruoyi.common.utils.text.Convert;
import com.ruoyi.framework.web.service.ConfigService;
@Component
public class MailHelper {
@Autowired
private ConfigService configService;
private JavaMailSenderImpl mailSender;
public MailSender sendMailToNotifyUser() {
String license_mail_host = Convert.toStr(configService.getKey("license.mail.host"));
String license_mail_port = Convert.toStr(configService.getKey("license.mail.port"));
String license_mail_user = Convert.toStr(configService.getKey("license.mail.user"));
String license_mail_pwd = Convert.toStr(configService.getKey("license.mail.pwd"));
System.setProperty("java.net.preferIPv4Stack", "true");
mailSender = new JavaMailSenderImpl();
mailSender.setHost(license_mail_host);// 指定用来发送Email的邮件服务器主机名
// mailSender.setPort(465);//默认端口,标准的SMTP端口
mailSender.setUsername(license_mail_user);// 用户名
mailSender.setPassword(license_mail_pwd);// 密码
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", "true");// 开启认证
properties.setProperty("mail.debug", "true");// 启用调试
properties.setProperty("mail.smtp.timeout", "1000");// 设置链接超时
properties.setProperty("mail.smtp.port", license_mail_port);// 设置端口
properties.setProperty("mail.smtp.socketFactory.port", license_mail_port);// 设置ssl端口
properties.setProperty("mail.smtp.socketFactory.fallback", "false");
// properties.setProperty("mail.smtp.socketFactory.class",
// "javax.net.ssl.SSLSocketFactory");
mailSender.setJavaMailProperties(properties);
return mailSender;
}
public static void main(String[] args) {
// sendSimpleEmail();
}
public void sendSimpleEmail(String from, String to, String subject, String text, String cc) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper;
try {
mimeMessageHelper = new MimeMessageHelper(message, true);
// 邮件发送人
mimeMessageHelper.setFrom(from);
// 邮件接收人
mimeMessageHelper.setTo(to);
// 邮件主题
mimeMessageHelper.setSubject(subject);
// 邮件内容,HTML格式
//mimeMessageHelper.setText(text);
//mimeMessageHelper.setText(text);
//mimeMessageHelper.setText(text,true);
message.setContent(text,"text/html ;charset=utf-8");
if(cc!=null && cc.split(";").length>0) {
mimeMessageHelper.setCc(cc.split(";"));
}
mailSender.send(message);
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("邮件发送完毕");
}
}
package com.ruoyi.project.system.LicenseContent.task;
import java.io.StringWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.DateUtilsOfWeek;
import com.ruoyi.common.utils.text.Convert;
import com.ruoyi.framework.web.service.ConfigService;
import com.ruoyi.project.system.LicenseContent.domain.LicenseContent;
import com.ruoyi.project.system.LicenseContent.service.ILicenseContentService;
import com.ruoyi.project.system.LicenseContent.service.impl.LicenseContentServiceImpl;
import com.ruoyi.project.tool.gen.util.VelocityInitializer;
@Component("autoJob")
@EnableScheduling
public class AutoJob {
@Autowired
private ILicenseContentService licenseContentService;
@Autowired
private ConfigService configService;
@Autowired
private MailHelper mailHelper;
//每天1点执行
@Scheduled(cron = "0,30 * * * * ?")
public void sendMailToNotifyUser() {
System.out.println("sendMailToNotifyUser");
LicenseContent licenseContent=new LicenseContent();
HashMap<String, Object> params=new HashMap<String, Object>();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String lastTwoMonths = df.format(DateUtilsOfWeek.getLastTwoMonthsDate());
params.put("beginLicenseExpirDate", lastTwoMonths);
params.put("endLicenseExpirDate", df.format(new Date()));
licenseContent.setParams(params);
List<LicenseContent> list=licenseContentService.selectLicenseContentList(licenseContent);
if(list==null || list.size()==0) {
return ;
}
mailHelper.sendMailToNotifyUser();
list.forEach(w->{
mailHelper.sendSimpleEmail(Convert.toStr(configService.getKey("license.mail.user")),w.getLicenseContactEmail(), w.getLicenseName(), getMsgContent(w),w.getLicenseContactEmailCc());
System.out.println(w.getLicenseName());
});
}
private String getMsgContent(LicenseContent lc) {
VelocityInitializer.initVelocity();
Template tpl = Velocity.getTemplate("vm/html/mail.html.vm", Constants.UTF8);
// 渲染模板
StringWriter sw = new StringWriter();
VelocityContext context=new VelocityContext();
context.put("licenseContent", lc);
tpl.merge(context, sw);
String retSw=sw.toString();
return retSw;
}
}
问题
1. 发送邮件后,显示SSL报错
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "mail.xxx.com", port 465, isSSL false
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: mail.xxx.com, port: 465;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: mail.xxx.com, port: 465;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?; message exception details (1) are:
Failed message 1:
是因为代码中包含了properties.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
,而邮箱服务器没有正确的SSL证书导致,先屏蔽了
2. html格式的数据,显示为纯文本
设置文本的时候,指定为超文本即可。
// 邮件内容,HTML格式
//mimeMessageHelper.setText(text);
mimeMessageHelper.setText(text,true);
3. 收件人收到的内容为问号(?)
由于编码问题导致,调整代码如下:
//mimeMessageHelper.setText(text);
//mimeMessageHelper.setText(text,true);
message.setContent(text,"text/html ;charset=utf-8");
本文来自:【JAVA】基于SMTP发送邮件遇到的问题-小码农,转载请保留本条链接,感谢!
温馨提示:
本文最后更新于 2023年03月05日,已超过 657 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
正文到此结束
- 本文标签: java mail
- 本文链接: https://djc8.cn/archives/java-problems-encountered-in-sending-mail-based-on-smtp.html
- 版权声明: 本文由小码农原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权