一、RFC882文档简单说明RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔。 邮件头包含的内容有:1. from字段 --用于指明发件人2. to字段 --用于指明收件人3. subject字段 --用于说明邮件主题4. cc字段 --抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁5. bcc字段 --密送,将邮件发送给收件人的同时将邮件秘密发送给另一个收件人,收件人无法看到邮件密送给了谁 邮件体指的就是邮件的具体内容。二、MIME协议简单介绍 在我们的实际开发当中,一封邮件既可能包含图片,又可能包含有附件,在这样的情况下,RFC882文档规定的邮件格式就无法满足要求了。MIME协议是对RFC822文档的升级和补充,它描述了如何生产一封复杂的邮件。通常我们把MIME协议描述的邮件称之为MIME邮件。MIME协议描述的数据称之为MIME消息。 对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。三、使用JavaMail创建邮件和发送邮件JavaMail创建的邮件是基于MIME协议的。因此可以使用JavaMail创建出包含图片,包含附件的复杂邮件。3.1、JavaMail API的简单介绍 3.2、创建邮件发送测试项目最好另导入stmp包3.3、发送一封只包含文本的简单邮件
package me.gacl.main;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendEmail {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.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、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
//qq账号需要授权填写的密码为授权码,不是账号登录密码,其他如sina,163,sohu等邮箱为检测视情况而定
//QQ邮箱需要使用SSL,端口号465或587 ts.connect("smtp.qq.com",587,"QQ号","授权码");
//4、创建邮件
Message message;
try {
message = createSimpleMail(session);
//5、发送邮件
ts.sendMessage(message,message.getAllRecipients());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ts.close();
}
public static MimeMessage createSimpleMail(Sessionsession)
throws Exception {
//创建邮件对象
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("xxx@qq.com"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxx@qq.com"));
//邮件的标题
message.setSubject("只包含文本的简单邮件");
//邮件的文本内容
message.setContent("你好啊!","text/html;charset=UTF-8");
//返回创建好的邮件对象
return message;
}
}
3.4、发送包含内嵌图片的邮件
import java.io.FileOutputStream;
import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;
public class MailTool {
public static void main(String[]args)throws MessagingException, GeneralSecurityException {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.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.qq.com",587,"QQ号", "授权码");
//4、创建邮件
Message message;
try {
message = createImageMail(session);
//5、发送邮件
ts.sendMessage(message,message.getAllRecipients());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ts.close();
}
public static MimeMessage createImageMail(Sessionsession)throws Exception {
//创建邮件
MimeMessage message = new MimeMessage(session);
// 设置邮件的基本信息
//发件人
message.setFrom(new InternetAddress("xxx@qq.com"));
//收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxx@qq.com"));
//邮件标题
message.setSubject("带图片的邮件");
// 准备邮件数据
// 准备邮件正文数据
MimeBodyPart text = new MimeBodyPart();
//设置为一个简单的纯文本内容
text.setContent("这是一封邮件正文带图片<img src='cid:ty.jpg'>的邮件","text/html;charset=UTF-8");
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\ty.jpg"));
image.setDataHandler(dh);
System.out.println(dh.getName());
image.setContentID("ty.jpg");
// 描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
//multipart类型
mm.setSubType("related");
//设置MimeMessage对象的邮件体
message.setContent(mm);
//更新并保存MimeMessage对象中的数据
message.saveChanges();
//把MimeMessage对象中的数据输出到一个RFC822格式的输出流中
//将创建好的邮件写入到E盘以文件的形式进行保存
message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
//返回创建好的邮件
return message;
}
}
3.5、发送包含附件的邮件
import java.io.FileOutputStream;
import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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;
public class MailTool {
public static void main(String[]args)throws MessagingException, GeneralSecurityException {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.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.qq.com",587,"QQ号", "授权码");
//4、创建邮件
Message message;
try {
message = createImageMail(session);
//5、发送邮件
ts.sendMessage(message,message.getAllRecipients());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ts.close();
}
public static MimeMessage createImageMail(Sessionsession)throws Exception {
//创建邮件
MimeMessage message = new MimeMessage(session);
// 设置邮件的基本信息
//发件人
message.setFrom(new InternetAddress("xxx@qq.com"));
//收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxx@qq.com"));
//邮件标题
message.setSubject("带图片的邮件");
// 准备邮件数据
// 准备邮件正文数据
MimeBodyPart text = new MimeBodyPart();
//设置为一个简单的纯文本内容
text.setContent("这是一封带附件邮件","text/html;charset=UTF-8");
// 准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\ty.jpg"));
image.setDataHandler(dh);
System.out.println(dh.getName());
image.setContentID(dh.getName());
//image.setContentID("ty.jpg");
// 描述数据关系
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
//multipart类型
mm.setSubType("mixed");
//设置MimeMessage对象的邮件体
message.setContent(mm);
//更新并保存MimeMessage对象中的数据
message.saveChanges();
//把MimeMessage对象中的数据输出到一个RFC822格式的输出流中
//将创建好的邮件写入到E盘以文件的形式进行保存
message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
//返回创建好的邮件
return message;
}
}
3.6、发送包含内嵌图片和附件的复杂邮件
package com.lbf.controller;
import java.io.FileOutputStream;
import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
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;
public class MailTool {
public static void main(String[]args)throws MessagingException, GeneralSecurityException {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.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.qq.com",587,"QQ号", "授权码");
//4、创建邮件
Message message;
try {
message = createImageMail(session);
//5、发送邮件
ts.sendMessage(message,message.getAllRecipients());
} catch (Exception e) {
e.printStackTrace();
}
ts.close();
}
public static MimeMessage createImageMail(Sessionsession)throws Exception {
//创建邮件
MimeMessage message = new MimeMessage(session);
// 设置邮件的基本信息
//发件人
message.setFrom(new InternetAddress("xxx@qq.com"));
//收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxx@qq.com"));
//邮件标题
message.setSubject("带附件和带图片的的邮件");
// 准备邮件数据
// 邮件正文
MimeBodyPart text = new MimeBodyPart();
text.setContent("复杂邮件<br/><img src='cid:t.jpg'>","text/html;charset=UTF-8");
// 图片
MimeBodyPart image = new MimeBodyPart();
image.setDataHandler(new DataHandler(new FileDataSource("src\\ty.jpg")));
image.setContentID("t.jpg");
//附件1
MimeBodyPart attach = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("src\\Filter.txt"));
attach.setDataHandler(dh);
attach.setFileName(dh.getName());
//附件2
MimeBodyPart attach2 = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource("src\\上传Servlet.rar"));
attach2.setDataHandler(dh2);
attach2.setFileName(MimeUtility.encodeText(dh2.getName()));
//描述关系:正文和图片
MimeMultipart mm1 = new MimeMultipart();
mm1.addBodyPart(text);
mm1.addBodyPart(image);
mm1.setSubType("related");
//描述关系:正文和附件
MimeMultipart mm2 = new MimeMultipart();
mm2.addBodyPart(attach);
mm2.addBodyPart(attach2);
mm2.setSubType("mixed");
//代表正文的bodypart
MimeBodyPart content = new MimeBodyPart();
content.setContent(mm1);
mm2.addBodyPart(content);
mm2.setSubType("mixed");
message.setContent(mm2);
message.saveChanges();
//把MimeMessage对象中的数据输出到一个RFC822格式的输出流中
//将创建好的邮件写入到E盘以文件的形式进行保存
message.writeTo(new FileOutputStream("E:\\MAXMail.eml"));
//返回创建好的邮件
return message;
}
}