2020-04-06

[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. 邮箱要是没有抄送人的话,多次尝试可能会被网易列为垃圾邮件,所以我这里弄了个抄送人,并将其设置为我发送邮件的邮箱。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方...
    通行禁止831阅读 109评论 0 0
  • js面试题 1 vara=”2015”,请对变量a进行操作生成倒序排列的 va...
    中伟_3bef阅读 249评论 0 1
  • 什么是HTML HTML其实是HyperText Markup Language的缩写, 超文本标记语言 HTML...
    网络源码阅读 279评论 0 0
  • 16:00 Django 分享图片 问题:Django project中各个app如何协作?python .\ma...
    CowSword阅读 39评论 0 0
  • 你走在大街上,北风呼呼那个吹。冷气像蚂蚁一样从衣袖、裤腿爬进来,你赶紧裹紧了衣服。但是你还是感觉到寒气逼人。旁边有...
    jihua_usc阅读 286评论 0 0