import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
/**
* @Auther: eros
* @Date: 2019/4/1 15:20
* @Description:
* 1.刚开始使用RFC882文档
* 只能发送纯文本文件,包含邮件头和邮件体两个部分,使用空行分隔
* 邮件头:
* form —— 指定发件人
* to —— 指定收件人
* subject —— 指定邮件主题
* cc —— 抄送,同时发送给另一个收件人,收件人可以看到邮件抄送给谁
* bcc —— 密送,同时发送给另一个收件人,收件人无法看到邮件抄送给谁
* 邮件体:
* 邮件具体文本内容
*
* 2.MIMI协议
* 在RFC882文档的升级和补充,通常将MIME协议描述的邮件称为MIME邮件,MIME协议描述的数据称为MIME消息。
* 可包含图片和附件
*
* 3.介绍JAVAMail(基于MIME协议)
* 3.1 使用JavaMail API 收发邮件 主要包含哪些api
* 》创建和解析邮件内容的API —— Message类是核心,实例对象代表一封电子邮件
* 》发送邮件API —— Transport类是发送邮件核心,实例对象代表某个邮件发送协议的邮件发送对象,例如SMTP协议
* 》接收邮件API —— Store类是接收邮件的核心,实例对象代表某个邮件接收协议的收件接收对象,例如POP3协议
*
*
* 3.2 邮件组织结构相关的API
* MimeMessage —— 代表整封邮件
* MimeMultipart —— 代表一个有多个Mime消息组合成的Mime消息
* MimeBodyPart —— 代表邮件中一个Mime消息
*
* 3.3 邮件发送程序 流程
* a.创建包含邮件服务器的网络连接信息的Session对象
* b.创建代表邮件内容的Message对象
* c.创建Transport对象,连接服务器,发送Message对象,关闭连接
*
*/
public class MailUtils {
// POP3 服务器
private final static String QQ_POP_HOST = "pop.qq.com";
private final static String POP_163_HOST = "pop.163.com";
// POP3 端口
private final static String QQ_POP_PORT = "995";
private final static String POP_163_PORT = "995";
// SMTP 服务器
private static String smtp_host = "";
private final static String QQ_SMTP_HOST = "smtp.qq.com";
private final static String SMTP_163_HOST = "smtp.163.com";
// SMTP 端口
private static String smtp_port = "";
private final static String QQ_SMTP_PORT = "587";// 465 | 587
private final static String SMTP_163_PORT = "465";// 465 | 994
// 收件人 —— 邮箱
private static String addressee = "";
// 发件人 —— 邮箱
private static String sender = "";
// 账号
private static String sender_account = "";
// 授权码
private static String sender_password = "";
//邮件文本内容的类型
private final static String MESSAGE_CONTENT_TYPE = "text/html;charset=UTF-8";
//图片地址
private static String photoUrl = "E:\\avatar\\background.jpg";
public static void main(String[] args){
try {
learn();
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* @auther: eros
* @param 1
* @date: 2019/4/1 17:18
* @description 第一次书写,熟悉发送邮件套路
* @return: void
*/
public static void learn() throws MessagingException, UnsupportedEncodingException {
Properties props = new Properties();
props.put("mail.smtp.host",QQ_SMTP_HOST);
props.put("mail.transport.protocol","smtp");
props.put("mail.smtp.auth","true");// 表示SMTP发送邮件需要进行身份验证
props.put("mail.smtp.sll.enable","true");// 设置是否使用ssl安全连接
props.put("mail.smtp.port",QQ_SMTP_PORT);
// 使用JavaMail发送邮件的5个步骤
//1. 创建session
Session session = Session.getInstance(props);
//开启session 的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts = session.getTransport();
//3.使用邮件的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给
//smtp服务器,都通过验证后即可正常发送邮件给收件人。
ts.connect(QQ_SMTP_HOST,sender_account,sender_password);
//4.创建邮件
// Message message = createSimpleMail(session);
// Message message = createImageMail(session);
// Message message = createAttachMail(session);
Message message = createMixedMail(session);
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
ts.close();
}
private static Message createMixedMail(Session session) throws MessagingException, UnsupportedEncodingException {
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress(sender_account));
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account));
mimeMessage.setSubject("带附件和图片的邮件");
// 正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一个带附件和图片的邮件<img src='cid:abc.jpg'>",MESSAGE_CONTENT_TYPE);
// 图片
MimeBodyPart image = new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource(photoUrl)));
image.setContentID("abc.jpg");
//附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(photoUrl));
attach.setDataHandler(dh);
attach.setFileName(MimeUtility.encodeText(dh.getName()));
// 描述关系 正文和图片
MimeMultipart mp1 = new MimeMultipart();
mp1.addBodyPart(text);
mp1.addBodyPart(image);
mp1.setSubType("related");
MimeBodyPart content = new MimeBodyPart();
content.setContent(mp1);
//描述关系 正文和附件
MimeMultipart mp2 = new MimeMultipart();
mp2.addBodyPart(content);
mp2.addBodyPart(attach);
mp2.setSubType("mixed");
mimeMessage.setContent(mp2);
mimeMessage.saveChanges();
return mimeMessage;
}
/**
* @auther: eros
* @param session 1
* @date: 2019/4/1 17:48
* @description 创建一封带附件的邮件
* @return: javax.mail.Message
*/
private static Message createAttachMail(Session session) throws MessagingException {
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress(sender_account));
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account));
mimeMessage.setSubject("带附件的邮件");
// 创建邮件正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封带附件的邮件",MESSAGE_CONTENT_TYPE);
// 创建邮件附件
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(photoUrl));
attach.setDataHandler(dh);
attach.setFileName(dh.getName());
//创建容器描述数据关系
MimeMultipart mp = new MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(attach);
mp.setSubType("mixed");// ***这个是重点***
mimeMessage.setContent(mp);
mimeMessage.saveChanges();
return mimeMessage;
}
/**
* @auther: eros
* @param session 1
* @date: 2019/4/1 17:35
* @description 创建一个邮件正文带图片的邮件
* @return: javax.mail.Message
*/
private static Message createImageMail(Session session) throws MessagingException {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(sender_account));
message.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account));
message.setSubject("带图片的邮件");
// 准备邮件数据
// 准备邮件正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件",MESSAGE_CONTENT_TYPE);
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(photoUrl));
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;
}
}