版权声明:本文为setlilei原创文章 转载请注明来源 https://blog.csdn.net/setlilei/article/details/85021729
不发送二进制文件 使用RFC882文档规定的邮件格式即可
jar包地址(二选一)
https://javaee.github.io/javamail/
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
下载 javax.mail.jar
package com.java;
import java.util.Date;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/*
* @author 李磊
* JavaMail Version 1.6.2 JDK Version 必须1.7以上
*/
public class JavaMailUtil {
//发件人的邮箱全称和密码(设授权码的必须使用授权码)
public static String emailAccount = "[email protected]";
public static String emailPassword = "ysyowsrfbutkbcba";
//发件人邮箱的 SMTP 服务器地址 smtp.xxx.com
public static String emailSMTPHost = "smtp.qq.com";
//收件人邮箱 真实存在邮箱
public static String receiveMailAccount = "[email protected]";
public static void main(String[] args) throws Exception {
//1.创建参数配置 用于连接邮件服务器的参数配置
Properties props = new Properties();//参数配置
props.setProperty("mail.transport.protocol", "smtp");//使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", emailSMTPHost);//发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true");//需要请求认证
/*
* PS:某些邮箱服务器要求 SMTP 连接需要使用 SSL安全认证 (为了提高安全性 邮箱支持SSL连接 也可以自己开启)
*
* 如无法连接邮件服务器 查看控制台打印的 log 如有类似 "连接失败 要求 SSL安全连接" 等错误
* 打开下面 注释的五行代码 开启 SSL安全连接
*/
/*
* SMTP服务器的端口(非 SSL连接的端口一般默认为 25 可以不添加 如果开启了 SSL 连接 //需要改为对应邮箱的 SMTP
* 服务器的端口 具体可查看对应邮箱服务的帮助 //QQ邮箱的SMTP(SLL)端口为465或587 其他邮箱自行去查看)
* final String smtpPort = "465";
* props.setProperty("mail.smtp.port", smtpPort);
* props.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
* props.setProperty("mail.smtp.socketFactory.fallback", "false");
* props.setProperty("mail.smtp.socketFactory.port", smtpPort);
*/
//2.根据配置创建会话对象 用于和邮件服务器交互
Session session = Session.getInstance(props);
session.setDebug(true);//设置为debug模式 可以查看详细的发送 log
//3.创建一封邮件 用发件人邮箱给收件人邮箱发一封邮件
MimeMessage message = createMimeMessage(session, emailAccount, receiveMailAccount);
//4.根据Session获取邮件传输对象
Transport transport = session.getTransport();
/*
* 5.使用邮箱账号和密码连接邮件服务器 此处认证的邮箱必须与 message中的发件人邮箱一致 否则报错
* PS:成败的判断关键在此 如连接服务器失败 程序会在控制台输出相应失败原因的log日志 仔细查看错误
* 有些邮箱服务器会返回错误码或查看错误类型的链接 根据给出的错误类型 到对应邮件服务器的帮助网站上查看具体失败原因
*
* PS:通常连接失败的原因:
* 邮箱没有开启 SMTP服务
* 邮箱密码错误 例如某些邮箱开启了独立密码(设置授权码就必须用授权码作为密码使用)
* 邮箱服务器要求必须要使用 SSL安全连接
* 请求过于频繁或其他原因 被邮件服务器拒绝服务网易邮箱严格 换个邮箱开始SMTP使用 或者去邮箱官网查看帮助
*/
transport.connect(emailAccount, emailPassword);
//6.发送邮件 发到所有的收件地址 message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人 抄送人
//密送人
transport.sendMessage(message, message.getAllRecipients());
//7.关闭连接
transport.close();
}
/*
* 创建一封只包含文本的简单邮件
*
* @param session 和服务器交互的会话
* @param sendMail 发件人邮箱
* @param receiveMail 收件人邮箱
* @return
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
//1.创建一封邮件
MimeMessage message = new MimeMessage(session);
/*
* from字段 --用于指明发件人
* to字段 --用于指明收件人
* subject字段 --用于说明邮件主题
* cc字段 -- 抄送 将邮件发送给收件人的同时抄送给另一个收件人 收件人可以看到邮件抄送给了谁
* bcc字段 -- 密送 将邮件发送给收件人的同时将邮件秘密发送给另一个收件人 收件人无法看到邮件密送给了谁
*/
//2.From:发件人的昵称
message.setFrom(new InternetAddress(sendMail, "李磊", "UTF-8"));
//3.To:收件人的昵称(可以增加多个收件人 抄送 密送)
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "VIP-User", "UTF-8"));
//4.Subject:邮件主题
message.setSubject("主题就是内容", "UTF-8");
//5.Content:邮件正文(可以使用html标签 浏览器会解析)
message.setContent(
"<h1>You are our outstanding user. We hope you will be happy every day and have no worries.</h1>"
, "text/html;charset=UTF-8");
//6.设置发件时间
message.setSentDate(new Date());
//7.保存设置
message.saveChanges();
return message;
}
}
发送二进制文件或者携带附件 必须使用MIME协议
JavaMail创建的邮件是基于MIME协议的 因此可以使用JavaMail创建出包含图片 包含附件的复杂邮件 但要在之前的基础上多导入一个jar activation.jar
http://java.sun.com/javase/technologies/desktop/javabeans/jaf/index.jsp
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
MIME协议是对RFC822文档的升级和补充 它描述了如何生产一封复杂的邮件
通常把MIME协议描述的邮件称之为MIME邮件 MIME协议描述的数据称之为MIME消息
对于一封复杂邮件 如果包含了多个不同的数据 MIME协议规定了要使用分隔线对多段数据进行分隔
并使用Content-Type头字段对数据的类型 以及多个数据之间的关系进行描述
package com.java;
import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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;
/*
* @Description:发送Email
* @author:李磊
*
*/
public class JavaMailUtil {
/*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.sohu.com");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
//使用JavaMail发送邮件的5个步骤
//1 .创建session
Session session = Session.getInstance(prop);
//开启Session的debug模式 这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2 .通过session得到transport对象
Transport ts = session.getTransport();
//3 .连上邮件服务器 需要发件人提供邮箱的用户名和密码进行验证
ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
//4 .创建邮件
Message message = createImageMail(session);
//5 .发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
/*
* @Method:createImageMail
* @Description:生成一封邮件正文带图片的邮件
* @Anthor:李磊
* @param session
* @return
* @throws Exception
*/
public static MimeMessage createImageMail(Session session) throws Exception {
//创建邮件
MimeMessage message = new MimeMessage(session);
//设置邮件的基本信息
//发件人
message.setFrom(new InternetAddress("[email protected]"));
//收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
//邮件标题
message.setSubject("带图片的邮件");
//准备邮件数据
//准备邮件正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件", "text/html;charset=UTF-8");
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\1.jpg"));
image.setDataHandler(dh);
image.setContentID("xxx.jpg");
//描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
message.setContent(mm);
message.saveChanges();
//将创建好的邮件写入到E盘以文件的形式进行保存
message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
//返回创建好的邮件
return message;
}
}
package com.java;
import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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;
/*
* @Description:发送Email
* @author:李磊
*/
public class JavaMailUtil {
/*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.sohu.com");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
//使用JavaMail发送邮件的5个步骤
//1.创建session
Session session = Session.getInstance(prop);
//开启Session的debug模式 这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.连上邮件服务器
ts.connect("smtp.sohu.com", "gacl", "邮箱密码");
//4.创建邮件
Message message = createAttachMail(session);
//5.发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}
/*
* @Method:createAttachMail
* @Description:创建一封带附件的邮件
* @Anthor:李磊
* @param session
* @return
* @throws Exception
*/
public static MimeMessage createAttachMail(Session session) throws Exception{
MimeMessage message = new MimeMessage(session);
//设置邮件的基本信息
//发件人
message.setFrom(new InternetAddress("[email protected]"));
//收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
//邮件标题
message.setSubject("JavaMail邮件发送测试");
//创建邮件正文 为了避免邮件正文中文乱码问题 需要使用charset=UTF-8指明字符编码
MimeBodyPart text = new MimeBodyPart();
text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");
//创建邮件附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\2.jpg"));
attach.setDataHandler(dh);
attach.setFileName(dh.getName()); //
//创建容器描述数据关系
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(attach);
mp.setSubType("mixed");
message.setContent(mp);
message.saveChanges();
//将创建的Email写入到E盘存储
message.writeTo(new FileOutputStream("E:\\attachMail.eml"));
//返回生成的邮件
return message;
}
}