[toc]
### 一、前言
想必发送邮件在日常开发中是十分常见的需求吧,鉴于官方网站一些不友好的例子,自己简化了下邮件发送的工具类。
废话不多说,这次的分享是Java发送邮件,进行发送邮件的邮箱是网易163邮箱,其中分为群发和单发邮件两个功能。先说下有什么步骤吧。
(若想直接借鉴的可以跳转到具体代码那一块,有完整的代码)
### 二、事先准备步骤
1. 未注册邮箱的先注册邮箱,网易163邮箱的注册地址:<https://mail.163.com/register/index.htm?from=163mail>
2. 已经有网易邮箱的,输入网址:https://mail.163.com, 登录进入网易邮箱中,点击设置下拉框中的POP3/SMTP/IMAP。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200406003259120.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI2NDIwNw==,size_16,color_FFFFFF,t_70)
3. 开启IMAP和POP3服务,这样才能通过Java代码进行发送邮件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200406003154116.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI2NDIwNw==,size_16,color_FFFFFF,t_70)
3.1 开启服务需要发送短信到指定号码。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200406003223480.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI2NDIwNw==,size_16,color_FFFFFF,t_70)
3.2 开通IMAP服务之后,会出现一个显示着授权密码的窗口,请立马保存这个授权密码(如果忘记了,可以重新关闭IMAP服务,再次开启获得新的授权密码)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200406003351608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI2NDIwNw==,size_16,color_FFFFFF,t_70)
3.3 接着开通POP3服务,一样的套路。开通成功之后。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200406003410995.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI2NDIwNw==,size_16,color_FFFFFF,t_70)
### 三、Java具体代码实现
#### 1. 类有哪几个?
src文件夹下(哪个文件夹都可以)
-MailConst.java 负责存放一些配置
-MailSenderUtil.java 主要功能的实现
-TestMail.java 测试java邮箱是否生效
#### 2.jar包配置
2.1 pom项目下,在dependencies节点下增加两个子节点,内容如下(发送邮件的jar包)
```xml
<!-- javaMail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.4.4</version>
</dependency>
</dependencies>
```
2.2 若为普通Javaee项目,则引入以上两个jar包。
#### 3.关键代码功能简介
(MailSenderUtil.java)
![功能函数介绍](https://img-blog.csdnimg.cn/20200406003436659.png)
sendMailToSingle()方法 是选择单发邮件的
sendMailToUserArray() 方法是选择群发邮件的
<hr/>
#### 4.具体代码
##### 4.1 MailConst.java 负责存放一些配置
```java
package com.lzh;
/**
* @Description 邮件常量
* @Author 林泽鸿
* @Date 2020/4/3 21:13
*/
public class MailConst {
//你的进行发送邮件的邮箱
public static final String USER_NAME = "xxxxxxxxxx@163.com";
//授权密码
public static final String PWD_CODE = "xxxxxxxxxx这里是刚才保存的授权密码";
public static final String MAIL_HOST = "smtp.163.com";
public static final String MAIL_SMTP_AUTH = "true";
//邮件主题
public static final String NOTIFICATION_MAIL_TITLE = "xxxxxxxxx邮件主题";
//邮件内容
public static final String NOTIFICATION_MAIL_CONTENT = "xxxxxxxxx你有一个新的通知,请前往xxxx进行查看!";
}
```
##### 4.2 MailSenderUtil.java 主要功能的实现
```java
package com.lzh;
import com.lzh.MailConst;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.ArrayList;
import java.util.Properties;
/**
* @Description 邮件
* @Author 林泽鸿
* @Date 2020/4/3 21:03
*/
public class MailSenderUtil {
//建立服务器的邮件连接,从而可以进行发送邮件
public static Session getMailSession(){
//0.1 确定连接位置
Properties properties = new Properties();
//获取163邮箱smtp服务器的地址,
properties.setProperty("mail.host", MailConst.MAIL_HOST);
//是否进行权限验证。
properties.setProperty("mail.smtp.auth", MailConst.MAIL_SMTP_AUTH);
//0.2确定权限(账号和密码)
Authenticator authenticator = new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
//填写自己的163邮箱的登录帐号和授权密码(不是登录密码)。
return new PasswordAuthentication(MailConst.USER_NAME,MailConst.PWD_CODE);
}
};
//1 获得连接
/**
* properties:包含配置信息的对象,Properties类型
* 配置邮箱服务器地址、配置是否进行权限验证(帐号密码验证)等
*
* authenticator:确定权限(帐号和密码)
*
* 所以就要在上面构建这两个对象。
*/
Session session = Session.getDefaultInstance(properties, authenticator);
return session;
}
/**
* 指定一个人发送邮件,单个发送
* @Param toEmailAddress 单个接受邮件的邮箱地址
* @Param title 主题
* @Param content 内容
* @Author 林泽鸿
* @Date 2020/4/3 22:00
**/
public static void sendMailTOSingleUser(String toEmailAddress,String title, String content){
//获得邮箱服务器的连接
Session session = getMailSession();
//2 创建消息
Message message = new MimeMessage(session);
// 2.1 发件人 我们自己的邮箱地址,就是名称
try {
message.setFrom(new InternetAddress(MailConst.USER_NAME));
/**
* 2.2 收件人
* 第一个参数:
* RecipientType.TO 代表收件人
* RecipientType.CC 抄送
* RecipientType.BCC 暗送
* 比如A要给B发邮件,但是A觉得有必要给要让C也看看其内容,就在给B发邮件时,
* 将邮件内容抄送给C,那么C也能看到其内容了,但是B也能知道A给C抄送过该封邮件
* 而如果是暗送(密送)给C的话,那么B就不知道A给C发送过该封邮件。
* 第二个参数
* 收件人的地址,或者是一个Address[],用来装抄送或者暗送人的名单。或者用来群发。可以是相同邮箱服务器的,也可以是不同的
* 这里我们发送给我们的qq邮箱
*/
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(toEmailAddress));
//设置抄送人,这里设置自己的是抄送人,免得被网易邮箱列为垃圾邮件
message.setRecipient(Message.RecipientType.CC, new InternetAddress( MailConst.USER_NAME ));
// 2.3 主题(标题)
message.setSubject(title);
//设置编码,防止发送的内容中文乱码。
message.setContent(content, "text/html;charset=UTF-8");
//3发送消息
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 群发邮件,也可以只发一个人。可设置主题和邮件内容,无附件
* @Param toEmailAddressArray 接受邮件的所有邮箱地址
* @Param title 主题
* @Param content 内容
* @Author 林泽鸿
* @Date 2020/4/3 21:59
**/
public static void sendMailToUserArray(ArrayList<String> toEmailAddressArrayList , String title, String content) {
String[] toEmailAddressArray = (String[]) toEmailAddressArrayList.toArray(new String[0]);
//获得邮箱服务器的连接
Session session = getMailSession();
//2 创建消息
Message message = new MimeMessage(session);
// 2.1 发件人 我们自己的邮箱地址,就是名称
try {
message.setFrom(new InternetAddress(MailConst.USER_NAME));
if (toEmailAddressArray != null) {
// 为每个邮件接收者创建一个地址
Address[] toEmailRecipients = null;
toEmailRecipients = new InternetAddress[toEmailAddressArray.length];
for (int i = 0; i < toEmailAddressArray.length; i++) {
toEmailRecipients[i] = new InternetAddress(toEmailAddressArray[i]);
}
message.setRecipients(MimeMessage.RecipientType.TO, toEmailRecipients);
}
//设置抄送人,这里设置自己的是抄送人,免得被网易邮箱列为垃圾邮件
message.setRecipient(Message.RecipientType.CC, new InternetAddress( MailConst.USER_NAME ));
// 2.3 主题(标题)
message.setSubject(title);
//设置编码,防止发送的内容中文乱码。
message.setContent(content, "text/html;charset=UTF-8");
//3发送消息
Transport.send(message);
} catch (MessagingException ex) {
ex.printStackTrace();
}
}
}
```
##### 4.3 TestMail.java 测试java邮箱是否生效
```java
package com.lzh;
import java.util.ArrayList;
/**
* @Description 测试发送邮件
* @Author 林泽鸿
* @Date 2020/4/3 20:55
*/
public class TestMail {
public static void main(String[] args) {
ArrayList<String> emailArray = new ArrayList<>();
//测试,收取邮件的邮箱,可以填写自己的发送邮件的邮箱
emailArray.add("xxxxxxxxx@163.com");
MailSenderUtil.sendMailToUserArray(emailArray,MailConst.NOTIFICATION_MAIL_TITLE,MailConst.NOTIFICATION_MAIL_CONTENT);
}
}
```
### 四、感悟
1. 学东西还是得实践比较有效率。
2. 邮箱要是没有抄送人的话,多次尝试可能会被网易列为垃圾邮件,所以我这里弄了个抄送人,并将其设置为我发送邮件的邮箱。