前期准备:
1.登录需要发送邮件的QQ邮箱,找到设置项
2.然后在账户栏下,找到(POP3/SMTP)服务协议
3.点击开启这个服务,就会得到一个授权码,这个需要保存好,相当于在程序运行过程中登录发件人邮箱的一个动态密码。
简述POP3与SMTP是什么和其有什么区别?
POP3:(Post Office Protocol 3),邮局协议的第三版本,规定了用户从个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。特点是接收邮件的协议。
SMTP:(Simple Mail Transfer Protocol),简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式,帮助每台计算机在发送或中转信件时找到下一个目的地。特点是发送邮件的协议。
代码实现QQ邮箱发送验证码
先看一下这个图片,了解一下邮件发送的架构(本篇文章只说明发送文件)
主要使用到的类:
Properties类:作用是创建Session对象,需要封装邮件传输使用的协议(mail.transport.protocol = smtp),发件人的SMTP服务器地址(mail,smtp.host = smtp.qq.com ),传输的请求认证(mail.smtp.auth = true )
Session类:
- 创建:通过Session类的静态方法 public static Session getDefaultInstance(java.util.Properties props)(还有其他的几个方法,想了解查看JavaEE的API文档即可)
- 获取Transport对象:public Transport getTransport()
- 利用Session对象创建邮件对象:public MimeMessage(Session session)(MimeMessage的构造器)
-
public void setDebug(boolean debug) 查看debug信息
MimeMessage(Message子类):
- 创建:上面已说,利用Session对象创建
- 设置发件人:public void setFrom(Address address)
- 设置收件人:public void setRecipient(Message.RecipientType type, Address address)
- 设置邮件主题:public void setSubject(String subject, String charset)
- 设置邮件正文:public void setContent(Object o, String type)
- 设置发送时间:public void setSentDate(java.util.Date d)
- 设置保存:public void saveChanges()
(当然API里面还封装了邮件的正文容器,但本文章不详细说明了。)
InternetAddress(Address子类):
- public InternetAddress(String address) 创建对象
- public InternetAddress(String address, String personal, String charset) 创建对象
首先给大家理清一下思路。
1.导入相关的jar包,主要的jar包为mail.jar 和 activation.jar
链接:https://pan.baidu.com/s/1wfPxmAVr2_a_k6kcY7KOFA
提取码:hglr
2.代码实现如下,包含步骤:
package com.chengxi.mail;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;
public class MailUtils {
public static void sendMassage(String from, String to) {
//加载Properties配置文件
InputStream inputStream = MailUtils.class.getClassLoader().getResourceAsStream("mail.properties");
Properties properties = new Properties();
try {
//把配置文件的内容加载到内存
properties.load(inputStream);
//获取Session对象
Session session = Session.getDefaultInstance(properties);
session.setDebug(true);
//创建邮件对象
MimeMessage message = MailUtils.createMessage(session, from, to, CheckCode.getCheckCode());
//创建Transport对象
Transport transport = session.getTransport();
//获取连接到邮件服务器
transport.connect("[email protected]" , "授权码");
//发送信息
transport.sendMessage(message, message.getAllRecipients());
//关闭连接
transport.close();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 单独封装邮件对象
* @param session 利用Session对象创建邮件对象
* @param from 发件人的邮箱地址
* @param to 收件人的邮箱地址
* @param checkCode 验证码
* @return 邮件对象
*/
public static MimeMessage createMessage(Session session, String from, String to, String checkCode) {
//创建邮件对象
MimeMessage mimeMessage = new MimeMessage(session);
try {
//设置发件人
mimeMessage.setFrom(new InternetAddress(from));
//设置收件人
//这个邮件可以发给多个收件人,因此有关get收件人的方法可以在发送时调用
mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
//设置邮件主题
mimeMessage.setSubject("验证码检验", "utf-8");
//设置正文
mimeMessage.setContent(" 验证码为" + checkCode, "text/html;charset=utf-8");
//设置发送时间
mimeMessage.setSentDate(new Date());
//保存改变
mimeMessage.saveChanges();
return mimeMessage;
} catch (MessagingException e) {
e.printStackTrace();
}
return null ;
}
}
其mail.properties文件如下
#设置邮箱服务器
mail.smtp.host=smtp.qq.com
#设置传输协议
mail.transport.protocol=smtp
#设置传输请求认知
mail.smtp.auth=true
生产验证码
package com.chengxi.mail;
import java.util.Random;
public class CheckCode {
public static String getCheckCode() {
Random random = new Random();
String checkCode = "";
for (int i = 0; i < 6; i++) {
checkCode += random.nextInt(10) ;
}
return checkCode ;
}
}