1.JavaMail介绍
JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。
2.JavaMail API
JavaMail API按照功能分为三类:
1.创建和解析邮件的API
2.发送邮件的API
3.接收邮件的API
JavaMail API的四个核心类:
1.Message类:创建和解析邮件的核心API,通常使用它的子类MiMeMessage类。
2.Transport类:发送邮件的核心API
3.Store类:接收邮件的核心API
4.Session类:用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息
3.发送纯文本文件
package com.hzp.util;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;
/**
* @ClassName SendMail
* @Description
* @Author xxx
* @Date 2020/7/28 20:08
* @Version 1.0
*/
public class SendMail {
//发件人地址
public static String senderAddress="xxx@qq.com";
//收件人地址
public static String recipientAddress="xxx@qq.com";//可以给自己发,也就是发件人和收件人地址一样
//发件人的密码
public static String senderPassword="xxx";//我用的是qq邮箱的授权码,没有的参考下图获取
public static void main(String[] args) throws Exception{
//1.连接邮件服务器的参数配置
Properties properties=new Properties();
//设置用户的认证方式
properties.setProperty("mail.smtp.auth", "true");
//设置传输协议
properties.setProperty("mail.transport.protocol", "smtp");
//设置发件人的SMTP邮件服务器地址
properties.setProperty("mail.smtp.host", "smtp.qq.com");
//2.创建定义整个应用程序所需环境信息的Session对象
Session session=Session.getInstance(properties);
//设置调试信息在控制台打印
session.setDebug(true);
//3.创建邮件的实例对象
Message message=getMimeMessage(session);
//4.根据session对象获取邮件传输对象transport
Transport transport=session.getTransport();
//设置发件人的账户和密码
transport.connect(senderAddress, senderPassword);
//发送邮件
transport.sendMessage(message, message.getAllRecipients());
//5.关闭邮件连接
transport.close();
}
/**
*@Author huang
*@Description 获得一封邮件的实例对象
*@Date 2020/7/28 20:21
*@Param [session]
*@Return javax.mail.Message
*/
public static Message getMimeMessage(Session session) throws Exception{
//创建一封邮件的实例对象
MimeMessage msg=new MimeMessage(session);
//设置发件人的地址
msg.setFrom(new InternetAddress(senderAddress));
//设置收件人的地址
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(recipientAddress));
//设置邮件的主题
msg.setSubject("邮件主题", "UTF-8");
//设置邮件的正文
msg.setContent("这是一封纯文本文件", "text/html;charset=utf-8");
//设置邮件的发送时间,默认立即发送
msg.setSentDate(new Date());
return msg;
}
}
4.获取授权码步骤
5.接收邮件
package com.hzp.util;
import javax.mail.*;
import java.util.Properties;
/**
* @ClassName ReceiveMail
* @Description
* @Author xxx
* @Date 2020/7/28 20:44
* @Version 1.0
*/
public class ReceiveMail {
//收件人的地址
public static String recipientAddress="xxx@qq.com";
//收件人的密码
public static String recipientPassword="xxx";
public static void main(String[] args) throws Exception {
//1.连接邮件服务器的参数配置
Properties props=new Properties();
//设置传输协议
props.setProperty("mail.store.protocol", "pop3");
//设置收件人的pop3服务器
props.setProperty("mail.pop3.host", "pop.qq.com");//切勿出现空格,不然没用
//2.创建定义整个应用程序所需的环境信息的Session对象
Session session=Session.getInstance(props);
//设置调试信息在控制台打印
session.setDebug(true);
//3.通过session获取接收邮件的实例对象
Store store=session.getStore("pop3");
//连接收件人的pop3服务器
store.connect("pop.qq.com",recipientAddress, recipientPassword);
//获得用户的邮件账户,注意通过pop3协议获取某个邮件夹的名称只能为inbox
Folder folder = store.getFolder("inbox");
//设置对邮件的访问权限
folder.open(Folder.READ_WRITE);
//4.得到邮件账户的所有邮件信息
Message[] msgs=folder.getMessages();
//遍历获得每封邮件的信息
for (int i=0;i<msgs.length;i++){
//获取邮件主题
String subject = msgs[i].getSubject();
//获取发件人
Address[] from = msgs[i].getFrom();
//获取邮件内容(包含邮件内容的html代码)
Object content = msgs[i].getContent();
//打印邮件内容
System.out.println(content);
}
//5.关闭邮件文件夹对象和连接对象
folder.close(true);
store.close();
}
}
6.JavaMail发送带图片、附件的邮件
package com.hzp.util;
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.*;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
/**
* @ClassName SendMail
* @Description
* @Author xxx
* @Date 2020/7/28 20:08
* @Version 1.0
*/
public class SendMail {
//发件人地址
public static String senderAddress="xxx@qq.com";
//收件人地址
public static String recipientAddress="xxx@qq.com";
//发件人的密码
public static String senderPassword="xxx";
public static void main(String[] args) throws UnsupportedEncodingException, MessagingException {
//1.连接邮件服务器的参数配置
Properties properties=new Properties();
//设置用户的认证方式
properties.setProperty("mail.smtp.auth", "true");
//设置传输协议
properties.setProperty("mail.transport.protocol", "smtp");
//设置发件人的SMTP邮件服务器地址
properties.setProperty("mail.smtp.host", "smtp.qq.com");
//2.创建定义整个应用程序所需环境信息的Session对象
Session session=Session.getInstance(properties);
//设置调试信息在控制台打印
session.setDebug(true);
//3.创建邮件的实例对象
Message message=getMimeMessage(session);
//4.根据session对象获取邮件传输对象transport
Transport transport=session.getTransport();
//设置发件人的账户和密码
transport.connect(senderAddress, senderPassword);
//发送邮件
transport.sendMessage(message, message.getAllRecipients());
//5.关闭邮件连接
transport.close();
}
/**
*@Author huang
*@Description 获得一封邮件的实例对象
*@Date 2020/7/28 20:21
*@Param [session]
*@Return javax.mail.Message
*/
public static Message getMimeMessage(Session session) throws MessagingException, UnsupportedEncodingException {
//创建一封邮件的实例对象
MimeMessage msg=new MimeMessage(session);
//设置发件人的地址
msg.setFrom(new InternetAddress(senderAddress));
//设置收件人的地址
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(recipientAddress));
//设置邮件的主题
msg.setSubject("邮件主题", "UTF-8");
//设置邮件的正文
// msg.setContent("这是一封纯文本文件", "text/html;charset=utf-8");
//创建图片节点
MimeBodyPart image=new MimeBodyPart();
//读取本地文件
DataHandler dh=new DataHandler(new FileDataSource("D:\\img\\3.jpg"));
//将图片数据添加到图片节点
image.setDataHandler(dh);
//为节点设置一个唯一编号(将在文本节点中引用)
image.setContentID("mailphoto");
//创建文本节点
MimeBodyPart text=new MimeBodyPart();
//将图片包含在邮件内容上
text.setContent("<img src='cid:mailphoto'/>", "text/html;charset=utf-8");
//将文本节点和图片节点合成一个混合节点
MimeMultipart mm_img_text=new MimeMultipart();
mm_img_text.addBodyPart(image);
mm_img_text.addBodyPart(text);
mm_img_text.setSubType("related");//关联关系
//将文本和图片的混合节点封装成一个普通节点
MimeBodyPart img_text=new MimeBodyPart();
img_text.setContent(mm_img_text);
//创建附件节点
MimeBodyPart attach=new MimeBodyPart();
//读取本地文件
DataHandler dh2=new DataHandler(new FileDataSource("D:\\img\\11.docx"));
//将数据添加到节点
attach.setDataHandler(dh2);
//设置附件的文件名
attach.setFileName(MimeUtility.encodeText(dh2.getName()));
//将(文本+图片)节点和附件节点合成一个大的混合节点
MimeMultipart mm=new MimeMultipart();
mm.addBodyPart(img_text);
mm.addBodyPart(attach);
mm.setSubType("mixed");//混合关系
//将最终的混合节点mm作为邮件内容
msg.setContent(mm);
//设置邮件的发送时间,默认立即发送
msg.setSentDate(new Date());
return msg;
}
}
7.小结
1.不管是收件、发件对象,还是邮件对象,都依赖于session对象,而session对象又依赖于Properties配置对象。
2.如果要在邮件中加入图片或附件,最终需要将所有节点合成一个混合节点,并将它作为邮件内容添加到message。