通过spring emial 发送邮件
项目最近需要新增发邮件功能,在网上搜了一些资料,这里整理一下。
java本身提供了发送邮件的API,JavaMail API详细信息可以参照: 《JavaMail API详解》
我用的是spring email,spring email抽象的核心是MailSender接口。spring自带MailSender的实现——JavaMailSenderImpl使用和配置起来都更加简单。
配置maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
发送代码
package com.*.*.util;
/**
* 邮件发送工具类
*
* @author
* @create
*/
@Component
public class EmailUtil {
static Logger logger = LoggerFactory.getLogger(EmailUtil.class);
/**
* 发送邮件
*
* @param mailSend MailSend
* @param mailConfig MailConfig
* @throws MessagingException 异常
* @throws UnsupportedEncodingException 异常
*/
public static boolean sendMail(MailSend mailSend, MailConfig mailConfig) {
System.out.println("1.send mail send param MailSend is " + mailSend.toString() + "MailConfig is " + mailConfig.toString());
//配置邮箱工具参数
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(mailConfig.getMailHost());
javaMailSender.setPort(mailConfig.getMailPort());
javaMailSender.setUsername(mailConfig.getMailUsername());
javaMailSender.setPassword(mailConfig.getMailPassword());
javaMailSender.setDefaultEncoding("Utf-8");
Properties properties = new Properties();
properties.setProperty(MailConfig.MAIL_SMTP_TIMEOUT, mailConfig.getMailTimeout());
properties.setProperty(MailConfig.MAIL_SMTP_AUTH, "false");
javaMailSender.setJavaMailProperties(properties);
//设置短信内容
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
// 设置utf-8或GBK编码,否则邮件会有乱码
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
messageHelper.setFrom(mailConfig.getMailUsername(), Utils.notEmpty(mailConfig.getMailFromName()) ? mailConfig.getMailFromName() : mailConfig.getMailUsername());
messageHelper.setTo(mailSend.getRecipient());
messageHelper.setSubject(mailSend.getSubject());
//内容是HTML形式
System.out.println("2.send mail start , content is " + mailContent);
messageHelper.setText(mailContent, true);
//多附件处理
if (Utils.notEmpty(mailSend.getAnnex())) {
FileSystemResource file = null;
for (NoMailAnnex noMailAnnex : mailSend.getAnnex()) {
file = new FileSystemResource(noMailAnnex.getAnnexPath());
messageHelper.addAttachment(noMailAnnex.getAnnextitle(), file);
}
}
javaMailSender.send(mimeMessage);
return true;
} catch (Exception e) {
System.out.println(("send mail fail!!! mial subject is " + mailSend.getSubject() + e.getMessage()));
}
return false;
}
public static void main(String[] args) {
//邮箱配置
MailConfig mailConfig = new MailConfig();
mailConfig.setMailHost("smtp.163.com");//邮箱服务器
mailConfig.setMailPort(25);//端口
mailConfig.setMailTimeout();//超时,这里我设置默认25000
mailConfig.setMailUsername("********@163.com");//用户名,
mailConfig.setMailPassword("*******");//密码
mailConfig.setMailFromName("***");//发件人,不填默认用发件邮箱
//邮件内容
MailSend mailSend = new MailSend();
mailSend.setSubject("五一出行天气");//主题
//内容
mailSend.setText("<p>22日上午,首届数字中国建设峰会在福建福州开幕。开幕式上宣读了习近平的贺信。<br/>中共中央政治局委员、中宣部部长黄坤明出席峰会开幕式并发表主旨演讲。他说,要认真学习贯彻习近平总书记网络强国战略思想和各项指示要求,落实全国网络安全和信息化工作会议精神,紧紧围绕数字中国建设,加快突破核心技术,推动基础设施优化升级,发展壮大数字经济,积极释放数据红利,让信息化发展更好造福社会、造福人民。</p>");
mailSend.setRecipient("***@qq.com");//收件人邮箱
try {
//邮件发送,如果收件人邮箱错误,邮件被退回。是不会抛异常的
EmailUtil.sendMail(mailSend, mailConfig);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
MailSend
package com.*.*.model;
/**
* 邮件发送实体类
* @author
* @create
*
*/
public class MailSend {
/**
* 收件人
*/
private String recipient;
/**
* 邮件主题
*/
private String subject;
/**
* 邮件内容
*/
private String text;
/**
* 邮件附件路径
*/
private List<NoMailAnnex> annex;
public String getRecipient() {
return recipient;
}
public void setRecipient(String recipient) {
this.recipient = recipient;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public List<NoMailAnnex> getAnnex() {
return annex;
}
public void setAnnex(List<NoMailAnnex> annex) {
this.annex = annex;
}
MailConfig
package com.*.*.model;
/**
* 邮件发送配置
* @author
* @create
*/
public class MailConfig {
public static final String MAIL_SMTP_TIMEOUT = "mail.smtp.timeout";
public static final String MAIL_SMTP_AUTH = "mail.smtp.auth";
/**
* 服务器
*/
private String mailHost;
/**
* #端口号
*/
private Integer mailPort;
/**
* #邮箱账号
*/
private String mailUsername;
/**
* #邮箱授权码
*/
private String mailPassword;
/**
* #时间延迟
*/
private String mailTimeout ;
/**
* #发送人邮箱
* --废弃字段,默认用mailUsername字段
*/
private String mailFrom;
/**
* #发送人署名
*/
private String mailFromName;
public String getMailFromName() {
return mailFromName;
}
public void setMailFromName(String mailFromName) {
this.mailFromName = mailFromName;
}
public String getMailHost() {
return mailHost;
}
public void setMailHost(String mailHost) {
this.mailHost = mailHost;
}
public Integer getMailPort() {
return mailPort;
}
public void setMailPort(Integer mailPort) {
this.mailPort = mailPort;
}
public String getMailUsername() {
return mailUsername;
}
public void setMailUsername(String mailUsername) {
this.mailUsername = mailUsername;
}
public String getMailPassword() {
return mailPassword;
}
public void setMailPassword(String mailPassword) {
this.mailPassword = mailPassword;
}
public String getMailTimeout() {
return mailTimeout;
}
public void setMailTimeout() {
this.mailTimeout = "25000";
}
public String getMailFrom() {
return mailFrom;
}
public void setMailFrom(String mailFrom) {
this.mailFrom = mailFrom;
}
}
NoMailAnnex
package com.*.*.model;
/**
* 说明: 附件
* 创建人:
* 创建时间:
* @version
*/
public class NoMailAnnex{
/**
* 标题
*/
private String annextitle;
/**
* 文件真实路径
*/
private String annexPath;
public String getAnnexPath() {
return annexPath;
}
public void setAnnexPath(String annexPath) {
this.annexPath = annexPath;
}
public String getAnnextitle() {
return annextitle;
}
public void setAnnextitle(String annextitle) {
this.annextitle = annextitle;
}
}
关于邮件中发送网络资源图片被拦截
测试时,发送到QQ邮箱的时候会发现图片找不到。这是因为QQ邮箱会默认拦截陌生邮件中的图片。
邮件中内嵌图片
/**
* 这部分的代码未测试
*/
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("[email protected]");
helper.setTo("[email protected]");
helper.setSubject("Spring Email Test");
helper.setText("<html><body><img src='cid:testLogo'>"
+ "<h4>Hello World!!!</h4>"
+ "</body></html>", true);//第二个参数表明这是一个HTML
//src='cid:testLogo'表明在消息中会有一部分是图片并以testLogo来进行标识
ClassPathResource image = new ClassPathResource("logo.jpg");
System.out.println(image.exists());
helper.addInline("testLogo", image);//添加内联图片,第一个参数表明内联图片的标识符,第二个参数是图片的资源引用
mailSender.send(message);