Java使用mail.jar发送邮件

Java使用mail.jar发送邮件

首先需要下载一个mail.jar包
(Oracle官网、百度搜索mail.jar、官网下载)
https://www.oracle.com/technetwork/java/index-138643.html
对我们用户而言,发送邮件需要3步:

  1. 登录
  2. 写邮件
  3. 发邮件

然而对于程序来说,它不需要登录的。登录就要自己控制网页,就像selenium那种自动化测试工具一样,模拟用户的一系列点击操作。那就把程序搞复杂了。

在代码执行层面考虑,当然是越简单越高效最好。

程序想要发送邮件,不需要登录,就可以发送邮件。

不登录,怎么知道我是哪个邮箱,就算有了发送端邮箱,我又怎么会有权限操作这个邮箱并发送邮件呢?

其实啊,每种邮箱都为我们程序提供了调用它的一些服务,我们只要在自己的邮箱开启该服务,就可以让程序调用并发送邮件了。

我们以QQ邮箱为例,开启它的SMTP服务:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述通过一些验证后,服务即可开启成功。
开启后会有一个授权码,这个授权码保存好,它是程序调用时要用到的。

注意:授权码不是密码,而是代替密码的一组独立密码,可以理解为第二把开启邮箱的钥匙。

源码的整体逻辑并不复杂,相信大家看看注释就能大致了解:

package mail;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class SendEmail {
    //存放邮件内容
    private static String messageContent;

    //属性  集合  存储一些需要发送的邮件正文内容
    private ArrayList<String> msgBox = new ArrayList<String>();
    {
        msgBox.add("我喜欢你,穷极所思,可赴万里!");
        msgBox.add("你是寒流,我是暖流,于深海中相遇,在朦胧薄雾下轻吻。");
        msgBox.add("那次车窗起雾写的还是你名字");
        msgBox.add("遇你惊鸿面 万物皆降尘。");
        msgBox.add("实不相瞒,还是想你,问题挺大,尽量克服");
        msgBox.add("醉后不知天在水,满船清梦压星河。 礼物已备好希望可以接受。");
        msgBox.add("可你才是那最美丽的风景,所有美好都像你。");
        msgBox.add("你来了,我的心就满了。");
    }
    //设计一个方法  做点坏事儿   垃圾短信
    //  每隔一段时间  发送一些数据
    public void test() throws ParseException {
        System.out.println("预备 开始~");
        Timer timer = new Timer();//启动一个小线程  做记录  每隔时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //设置开始发送邮件的时间(其实相当于定时发送)
        Date firstTime = sdf.parse("2020-07-24 17:16:00");//把这种时间格式转换为格林威治时间,例如Tue May 05 05:20:00 CST 2020
        timer.schedule(new TimerTask(){
            public void run() {
                try {
                    int index = (int)(Math.random()*msgBox.size());
                    SendEmail.SendEmail(msgBox.get(index));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        },firstTime,1000);//每隔1秒发送一波,当然受程序调用和网络延迟影响,不止1秒
    }


    public static void SendEmail(String messageContent) throws Exception {
        SendEmail.messageContent = messageContent;
/*        1.下载一个mail.jar包
              Oracle官网    百度搜索mail.jar   官网下载
              https://www.oracle.com/technetwork/java/index-138643.html
        2.导包*/

        //3.配置信息
        Properties props = new Properties();
        //设置发送邮件的协议
        props.put("mail.transport.protocol","smtp");//必须
        //设置发送邮件主机的主机名
        props.put("mail.smtp.host","smtp.qq.com");//必须
        /*以下配置不是必须的,具体看实际需求*/
/*        //设置发送邮件使用的端口号      默认通过TCP端口25,110,143建立连接
        props.put("mail.smtp.port",465);
        //设置发送邮件时是否需要进行身份验证
        props.put("mail.smtp.auth","true");
        //设置是否使用ssl安全连接(通常都使用)
        props.put("mail.smtp.ssl.enable","true");*/
        //设置是否显示debug信息 true 会在控制台显示相关信息
        //props.put("mail.debug","true");

        //4.创建session(可以理解为socket)
        //  但需要很多配置信息 所以在他之前需要配置 详见上面的4
        Session session = Session.getInstance(props);
        //5.通过session得到transport对象(可以理解为输出流)
        Transport ts = session.getTransport();
        //6.连上邮件服务器(想要通过邮箱输出/发送邮件 必须得到认证) 开启SMTP服务
        ts.connect("发送者@qq.com","你的SMTP服务密码");
        //7.创建邮件
        //  这个过程比较麻烦 单独在下面写一个方法
        //  调用下面静态方法 通过session创建一个Message对象
        //  这个message可以理解为file或class或frame)
        Message message = SendEmail.createMessage(session);
        //8.发送邮件(需要message对象 和 message设置的所有收件人)
        ts.sendMessage(message,message.getAllRecipients());
        //9.关闭通道
        ts.close();
        //10.发送完成
        System.out.println("新写的邮件发送成功啦");
    }


    private static MimeMessage createMessage(Session session) throws Exception {
        // 创建邮件
        MimeMessage message = new MimeMessage(session);
        // 设置邮件的基本信息
        //邮件发送人
        message.setFrom(new InternetAddress("发送人qq.com"));
        //邮件接收人   recipient容器 收纳
        //TO是发送人  CC是抄送人  BCC是暗送人  NEWSGROUPS新闻组
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("接收人@qq.com"));
        //设置发送时间
        message.setSentDate(new Date());
        //设置邮件标题
        message.setSubject("我喜欢你,很久了");
        //如果是纯文本 这个方法就可以啦
        //正文
        message.setText(messageContent);
        message.saveChanges();
        System.out.println("邮件生成完毕!");
        // 返回创建好的的邮件
        return message;
    }
}

测试代码:

public class Test {
    public static void main(String[] args) {
        SendEmail sendEmail = new SendEmail();
        try {
            sendEmail.test();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

当然也可以直接调用静态方法SendEmail(String msg)

执行起来速度可能会很慢,效果大致如下:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值