Java使用mail.jar发送邮件
首先需要下载一个mail.jar包
(Oracle官网、百度搜索mail.jar、官网下载)
https://www.oracle.com/technetwork/java/index-138643.html
对我们用户而言,发送邮件需要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)
执行起来速度可能会很慢,效果大致如下: