【Java】使用JavaMail发送qq邮件
因为需求,尝试了一下使用java向指定用户发送邮件,亲测有效,源码奉上!
准备工作:
下载JavaMail的jar包:https://mvnrepository.com/artifact/javax.mail/mail/1.4.7
开启邮件发送方IMAP/SMTP服务
开启后会获得授权码
什么是授权码?
授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。
适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
温馨提醒:为了你的帐户安全,更改QQ密码以及独立密码会触发授权码过期,需要重新获取新的授权码登录。
怎么获取授权码?
先进入设置-》帐户页面找到入口,按照以下流程操作。
(1)点击“开启”
(2)验证密保
(3)获取授权码
代码测试:
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import com.sun.mail.util.MailSSLSocketFactory;
public class MailTest {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "smtp.qq.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
// 根据propertise创建会话
Session session = Session.getInstance(props);
// 根据会话创建邮件信息
Message msg = new MimeMessage(session);
// 邮件主题
msg.setSubject("JavaMail Test");
//创建图片节点
MimeBodyPart image = new MimeBodyPart();
//读取本地文件
DataHandler dataHandler = new DataHandler(new FileDataSource("src/lib/love.jpg"));
//将图片添加至结点
image.setDataHandler(dataHandler);
//为"节点"设置一个唯一编号
image.setContentID("pic");
// 创建文本"节点"
MimeBodyPart text = new MimeBodyPart();
// 这里添加图片的方式是将整个图片包含到邮件内容中
text.setContent("<br/><h2>我爱你<h2>"
+ "<a href='https://me.csdn.net/weixin_41978722'>网址链接测试</a>"
+ "<img src='cid:pic'/>", "text/html;charset=UTF-8");
// 创建附件结点(源代码)
MimeBodyPart attachment = new MimeBodyPart();
// 读取本地文件
DataHandler dataHandler1 = new DataHandler(new FileDataSource("src/com/funyoo/mail/test/MailTest.java"));
// 将文件添加至结点
attachment.setDataHandler(dataHandler1);
// 设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dataHandler1.getName()));
// 创建附件结点(mail.jar包)
MimeBodyPart jar = new MimeBodyPart();
// 读取本地文件
DataHandler dataHandler2 = new DataHandler(new FileDataSource("src/lib/mail-1.4.7.jar"));
// 将文件添加至结点
jar.setDataHandler(dataHandler2);
// 设置附件的文件名(需要编码)
jar.setFileName(MimeUtility.encodeText(dataHandler2.getName()));
// 创建混合节点 将图片节点 文件结点 附件结点 加入
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(image);
multipart.addBodyPart(text);
multipart.addBodyPart(attachment);
multipart.addBodyPart(jar);
// 将混合节点加入邮件中
msg.setContent(multipart);
// 设置邮件发送方
msg.setFrom(new InternetAddress("发送方邮箱地址"));
// 开始会话传输
Transport transport = session.getTransport();
// 连接邮箱 加入自己(发送方)授权码
transport.connect("smtp.qq.com", "发送方邮箱地址", "授权码");
// 给目标邮箱发送邮件
transport.sendMessage(msg, new Address[] { new InternetAddress("收件方邮箱") });
transport.close();
}
}
结果: