电子邮件:
电子邮件可以让我们在网络上通过电子手段进行信息交互,那么这就要涉及到电子邮箱服务器,服务器有发送邮件(简称SMTP)的服务器和接收邮件(简称POP3)的服务器.
使用场景:
任务提醒
绩效统计
依赖java包:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
开启SMTP服务:
例子中使用的发送方是网易163邮箱,首先需要登录163邮箱,找到账号管理,如下图:
点击POP3/SMTP,开启SMTP服务,如下图:
编写代码:
在点击开启的时候会出现一串密码,用于发送邮件方的密码,不能用登录密码
package com.spd.comm.utils;
import java.io.File;
import java.util.Properties;
import javax.mail.internet.MimeMessage;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
public class EmailUtils {
private static final String MSG_STATUS_SUCCESS = "success";
private static final String MSG_STATUS_FAILURE = "failure";
private static JavaMailSender mailSender;
public static String host;
public static String username;
public static String password;
public EmailUtils(JavaMailSender mailSender) {
EmailUtils.mailSender = mailSender;
}
/**
* @param subject 标题
* @param receiver 接收人的邮箱
* @param msg 内容
* @return the string
*/
public static String sendSimpleMail(String subject, String[] receiver, String msg) {
try {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(username);
message.setTo(receiver);
message.setSubject(subject);
message.setText(msg);
mailSender.send(message);
} catch (Exception e) {
e.printStackTrace();
return MSG_STATUS_FAILURE;
}
return MSG_STATUS_SUCCESS;
}
/**
* @param subject 标题
* @param receiver 接收人的邮箱
* @param msg 内容
* @return the string
*/
public static String sendHTMLMail(String subject, String[] receiver, String msg) {
MimeMessage message = null;
try {
message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(username);
helper.setTo(receiver);
helper.setSubject(subject);
StringBuffer sb = new StringBuffer();
sb.append(msg);
helper.setText(sb.toString(), true);
mailSender.send(message);
} catch (Exception e) {
e.printStackTrace();
return MSG_STATUS_FAILURE;
}
return MSG_STATUS_SUCCESS;
}
/**
* @param subject 标题
* @param receiver 接收人的邮箱
* @param msg 内容
* @param file 文件
* @return the string
*/
public static String sendAttachmentsMail(String subject, String[] receiver, String msg, File file) {
MimeMessage message = null;
try {
message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(username);
helper.setTo(receiver);
helper.setSubject(subject);
helper.setText(msg);
// 注意项目路径问题,自动补用项目路径
FileSystemResource fileResource = new FileSystemResource(file);
// 加入邮件
helper.addAttachment("附件.pdf", fileResource);
mailSender.send(message);
} catch (Exception e) {
e.printStackTrace();
return MSG_STATUS_FAILURE;
}
return MSG_STATUS_SUCCESS;
}
/**
* @param subject 标题
* @param receiver 接收人的邮箱
* @param msg 内容
* @param file 文件
* @return the string
*/
public static String sendInlineMail(String subject, String[] receiver, String msg, File file) {
MimeMessage message = null;
try {
message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(username);
helper.setTo(receiver);
helper.setSubject(subject);
// 第二个参数指定发送的是HTML格式,同时cid:是固定的写法
helper.setText(msg, true);
FileSystemResource fileResource = new FileSystemResource(file);
helper.addInline("picture.jpg", fileResource);
mailSender.send(message);
} catch (Exception e) {
e.printStackTrace();
return MSG_STATUS_FAILURE;
}
return MSG_STATUS_SUCCESS;
}
static {
JavaMailSenderImpl impl = new JavaMailSenderImpl();
// 用户名密码配置,默认是25端口
host= "smtp.163.com";
// QQ邮箱
// host= "smtp.qq.com";
// 126邮箱
// host= "smtp.126.com";
username= 邮箱账号;
password= 刚才申请的邮箱密码(非登录密码);
impl.setHost(host);
impl.setUsername(username);
impl.setPassword(password);
//加认证机制
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.auth", "true");
javaMailProperties.put("mail.smtp.ssl.enable", "true");
javaMailProperties.put("mail.smtp.starttls.enable", "true");
javaMailProperties.put("mail.smtp.timeout", 5000);
impl.setJavaMailProperties(javaMailProperties);
mailSender = impl;
}
}
完成!
如果出现25端口禁用的情况,可以换成465端口
区别:
25端口(SMTP):25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务所开放的,是用于发送邮件。
465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
更换上边static中的代码为:
static {
JavaMailSenderImpl impl = new JavaMailSenderImpl();
// 用户名密码配置,默认是25端口
host= "smtp.163.com";
username= 邮箱账号;
password= 刚才申请的邮箱密码(非登录密码);
impl.setHost(host);
impl.setUsername(username);
impl.setPassword(password);
//加认证机制
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.smtp.auth", "true");
javaMailProperties.put("mail.smtp.port", "465");
javaMailProperties.setProperty("mail.debug", "true");//启用调试
javaMailProperties.setProperty("mail.smtp.socketFactory.fallback", "false");
javaMailProperties.setProperty("mail.smtp.socketFactory.port", "465");//设置ssl端口
javaMailProperties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
javaMailProperties.put("mail.smtp.timeout", 5000);
impl.setJavaMailProperties(javaMailProperties);
mailSender = impl;
}
完成!