码迷,mamicode.com
首页 > 编程语言 > 详细

使用JavaMail收发邮件

时间:2016-02-27 17:53:49      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

概述

邮件相关的标准

厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:

SMTP(Simple Mail Transfer Protocol):即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

POP3(Post Office Protocol - Version 3):即邮局协议版本3,用于接收电子邮件的标准协议。

IMAP(Internet Mail Access Protocol):即Internet邮件访问协议。是POP3的替代协议。

这三种协议都有对应SSL加密传输的协议,分别是SMTPSPOP3SIMAPS

MIME(Multipurpose Internet Mail Extensions):即多用途因特网邮件扩展标准。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。

 

JavaMail简介

JavaMail是由Sun发布的用来处理emailAPI。它并没有包含在Java SE中,而是作为Java EE的一部分。

mail.jar:此JAR文件包含JavaMail APISun提供的SMTPIMAPPOP3服务提供程序;

activation.jar:此JAR文件包含JAF APISun的实现。

JavaMail包中用于处理电子邮件的核心类是:PropertiesSessionMessageAddressAuthenticatorTransportStore等。

 

邮件传输过程

技术分享

如上图,电子邮件的处理步骤如下:

(1)创建一个Session对象。

(2)Session对象创建一个Transport对象/Store对象,用来发送/保存邮件。

(3)Transport对象/Store对象连接邮件服务器。

(4)Transport对象/Store对象创建一个Message对象(也就是邮件内容)

(5)Transport对象发送邮件;Store对象获取邮箱的邮件。

 

Message结构

MimeMessage类:代表整封邮件。

MimeBodyPart类:代表邮件的一个MIME信息。

MimeMultipart类:代表一个由多个MIME信息组合成的组合MIME信息。

技术分享

 

JavaMail的核心类

JavaMail对收发邮件进行了高级的抽象,形成了一些关键的的接口和类,它们构成了程序的基础,下面我们分别来了解一下这些最常见的对象。

java.util.Properties(属性对象)

java.util.Properties类代表一组属性集合。

它的每一个键和值都是String类型。

由于JavaMail需要和邮件服务器进行通信,这就要求程序提供许多诸如服务器地址、端口、用户名、密码等信息,JavaMail通过Properties对象封装这些属性信息。

例:如下面的代码封装了几个属性信息:

Properties prop = new Properties();
prop.setProperty("mail.debug", "true");
prop.setProperty("mail.host", "xxx@163.com");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");

针对不同的的邮件协议,JavaMail规定了服务提供者必须支持一系列属性,

下表是一些常见属性(属性值都以String类型进行设置,属性类型栏仅表示属性是如何被解析的):

关键词

类型

描述

mail.debug

boolean

debug开关。

mail.host

String

指定发送、接收邮件的默认邮箱服务器。

mail.store.protocol

String

指定接收邮件的协议。

mail.transport.protocol

String

指定发送邮件的协议。

mail.debug.auth

boolean

debug输出中是否包含认证命令。默认是false

详情请参考官方API文档:

https://javamail.java.net/nonav/docs/api/

 

javax.mail.Session(会话对象)

Session表示一个邮件会话。

Session的主要作用包括两个方面:

l接收各种配置属性信息:通过Properties对象设置的属性信息;

l初始化JavaMail环境:根据JavaMail的配置文件,初始化JavaMail环境,以便通过Session对象创建其他重要类的实例。

JavaMailJar包的META-INF目录下,通过以下文件提供了基本配置信息,以便session能够根据这个配置文件加载提供者的实现类:

javamail.default.providers

javamail.default.address.map

技术分享

例:

Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props);


javax.mail.Transport (邮件传输)

邮件操作只有发送或接收两种处理方式。

JavaMail将这两种不同操作描述为传输(javax.mail.Transport)和存储(javax.mail.Store),传输对应邮件的发送,而存储对应邮件的接收。

getTransportSession类中的getTransport()有多个重载方法,可以用来创建Transport对象。

connect如果设置了认证命令——mail.smtp.auth,那么使用Transport类的connect方法连接服务器时,则必须加上用户名和密码。

sendMessageTransport类的sendMessage方法用来发送邮件消息。

closeTransport类的close方法用来关闭和邮件服务器的连接。

 

javax.mail.Store(邮件存储)

getStoreSession类中的getStore()有多个重载方法,可以用来创建Store对象。

connect如果设置了认证命令——mail.smtp.auth,那么使用Store类的connect方法连接服务器时,则必须加上用户名和密码。

getFolder: Store类的getFolder方法可以获取邮箱内的邮件夹Folder对象

closeStore类的close方法用来关闭和邮件服务器的连接。

 

javax.mail.Message(消息对象)

javax.mail.Message是个抽象类,只能用子类去实例化,多数情况下为javax.mail.internet.MimeMessage

MimeMessage 代表MIME 类型的电子邮件消息。

要创建一个 Message,需要将 Session 对象传递给 MimeMessage 构造器:

MimeMessage message = new MimeMessage(session);

注意:还存在其它构造器,如用按 RFC822 格式的输入流来创建消息。

setFrom:设置邮件的发件人

setRecipient:设置邮件的发送人、抄送人、密送人

三种预定义的地址类型是:

Message.RecipientType.TO:收件人

Message.RecipientType.CC:抄送人

Message.RecipientType.BCC:密送人

setSubject:设置邮件的主题

setContent:设置邮件内容

setText:如果邮件内容是纯文本,可以使用此接口设置文本内容。

 

javax.mail.Address(地址)

一旦您创建了 Session Message,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是 javax.mail.internet.InternetAddress 类。

若创建的地址只包含电子邮件地址,只要传递电子邮件地址到构造器就行了。

例:

Address address = new InternetAddress("xxx@163.com");

Authenticator:认证者

java.net 类一样,JavaMail API 也可以利用 Authenticator 通过用户名和密码访问受保护的资源。对于JavaMail API 来说,这些资源就是邮件服务器。JavaMail Authenticator javax.mail 包中,而且它和 java.net 中同名的类 Authenticator 不同。两者并不共享同一个 Authenticator,因为JavaMail API 用于 Java 1.1,它没有 java.net 类别。

要使用 Authenticator,先创建一个抽象类的子类,并从 getPasswordAuthentication() 方法中返回 PasswordAuthentication 实例。创建完成后,您必需向 session 注册 Authenticator。然后,在需要认证的时候,就会通知 Authenticator。您可以弹出窗口,也可以从配置文件中(虽然没有加密是不安全的)读取用户名和密码,将它们作为 PasswordAuthentication 对象返回给调用程序。

例: 

Properties props = new Properties();
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);


实例

发送文本邮件

技术分享
public static void main(String[] args) throws Exception {
   Properties prop = new Properties();
   prop.setProperty("mail.debug", "true");
   prop.setProperty("mail.host", MAIL_SERVER_HOST);
   prop.setProperty("mail.transport.protocol", "smtp");
   prop.setProperty("mail.smtp.auth", "true");
 
   // 1、创建session
   Session session = Session.getInstance(prop);
   Transport ts = null;
 
   // 2、通过session得到transport对象
   ts = session.getTransport();
 
   // 3、连上邮件服务器
   ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 
   // 4、创建邮件
   MimeMessage message = new MimeMessage(session);
 
   // 邮件消息头
   message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
   message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
   message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
   message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
   message.setSubject("测试文本邮件"); // 邮件的标题
 
   
// 邮件消息体
   message.setText("天下无双。");
 
   // 5、发送邮件
   ts.sendMessage(message, message.getAllRecipients());
   ts.close();
}
View Code

发送HTML格式的邮件

技术分享
public static void main(String[] args) throws Exception {
    Properties prop = new Properties();
    prop.setProperty("mail.debug", "true");
    prop.setProperty("mail.host", MAIL_SERVER_HOST);
    prop.setProperty("mail.transport.protocol", "smtp");
    prop.setProperty("mail.smtp.auth", "true");
 
    // 1、创建session
    Session session = Session.getInstance(prop);
    Transport ts = null;
 
    // 2、通过session得到transport对象
    ts = session.getTransport();
 
    // 3、连上邮件服务器
    ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 
    // 4、创建邮件
    MimeMessage message = new MimeMessage(session);
 
    // 邮件消息头
    message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
    message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
    message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
    message.setSubject("测试HTML邮件"); // 邮件的标题
 
    String htmlContent = "<h1>Hello</h1>" + "<p>显示图片<img src=‘cid:abc.jpg‘>1.jpg</p>";
    MimeBodyPart text = new MimeBodyPart();
    text.setContent(htmlContent, "text/html;charset=UTF-8");
    MimeBodyPart image = new MimeBodyPart();
    DataHandler dh = new DataHandler(new FileDataSource("D:\\[04]Temp\\img\\1.jpg"));
    image.setDataHandler(dh);
    image.setContentID("abc.jpg");
   
    // 描述数据关系
    MimeMultipart mm = new MimeMultipart();
    mm.addBodyPart(text);
    mm.addBodyPart(image);
    mm.setSubType("related");
 
    message.setContent(mm);
    message.saveChanges();
   
    // 5、发送邮件
    ts.sendMessage(message, message.getAllRecipients());
    ts.close();
}
View Code

发送带附件的邮件

技术分享
public static void main(String[] args) throws Exception {
    Properties prop = new Properties();
    prop.setProperty("mail.debug", "true");
    prop.setProperty("mail.host", MAIL_SERVER_HOST);
    prop.setProperty("mail.transport.protocol", "smtp");
    prop.setProperty("mail.smtp.auth", "true");
 
    // 1、创建session
    Session session = Session.getInstance(prop);
    Transport ts = null;
 
    // 2、通过session得到transport对象
    ts = session.getTransport();
 
    // 3、连上邮件服务器
    ts.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 
    // 4、创建邮件
    MimeMessage message = new MimeMessage(session);
 
    // 邮件消息头
    message.setFrom(new InternetAddress(MAIL_FROM)); // 邮件的发件人
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO)); // 邮件的收件人
    message.setRecipient(Message.RecipientType.CC, new InternetAddress(MAIL_CC)); // 邮件的抄送人
    message.setRecipient(Message.RecipientType.BCC, new InternetAddress(MAIL_BCC)); // 邮件的密送人
    message.setSubject("测试带附件邮件"); // 邮件的标题
 
    MimeBodyPart text = new MimeBodyPart();
    text.setContent("邮件中有两个附件。", "text/html;charset=UTF-8");
 
    // 描述数据关系
    MimeMultipart mm = new MimeMultipart();
    mm.setSubType("related");
    mm.addBodyPart(text);
 
    String[] files = {
            "D:\\[04]Temp\\img\\1.jpg", "D:\\[04]Temp\\img\\2.jpg"
    };
 
    // 添加邮件附件
    for (String filename : files) {
        MimeBodyPart attachPart = new MimeBodyPart();
        attachPart.attachFile(filename);
        mm.addBodyPart(attachPart);
    }
 
    message.setContent(mm);
    message.saveChanges();
 
    // 5、发送邮件
    ts.sendMessage(message, message.getAllRecipients());
    ts.close();
}
View Code


获取邮箱中的邮件 

技术分享
public class StoreMail {
    final static String USER = "robot"; // 用户名
 
    final static String PASSWORD = "tuniu520"; // 密码
 
    public final static String MAIL_SERVER_HOST = "mail.tuniu.com"; // 邮箱服务器
 
    public final static String TYPE_HTML = "text/html;charset=UTF-8"; // 文本内容类型
 
    public final static String MAIL_FROM = "robot@tuniu.com"; // 发件人
 
    public final static String MAIL_TO = "zhangpeng4@tuniu.com"; // 收件人
 
    public final static String MAIL_CC = "zhangpeng4@tuniu.com"; // 抄送人
 
    public final static String MAIL_BCC = "zhangpeng4@tuniu.com"; // 密送人
 
    public static void main(String[] args) throws Exception {
        // 创建一个有具体连接信息的Properties对象
        Properties prop = new Properties();
        prop.setProperty("mail.debug", "true");
        prop.setProperty("mail.store.protocol", "pop3");
        prop.setProperty("mail.pop3.host", MAIL_SERVER_HOST);
 
        // 1、创建session
        Session session = Session.getInstance(prop);
 
        // 2、通过session得到Store对象
        Store store = session.getStore();
 
        // 3、连上邮件服务器
        store.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 
        // 4、获得邮箱内的邮件夹
        Folder folder = store.getFolder("inbox");
        folder.open(Folder.READ_ONLY);
 
        // 获得邮件夹Folder内的所有邮件Message对象
        Message[] messages = folder.getMessages();
        for (int i = 0; i < messages.length; i++) {
 
            String subject = messages[i].getSubject();
            String from = (messages[i].getFrom()[0]).toString();
 
            System.out.println("第 " + (i + 1) + "封邮件的主题:" + subject);
            System.out.println("第 " + (i + 1) + "封邮件的发件人地址:" + from);
        }
 
        // 5、关闭
        folder.close(false);
        store.close();
    }
}
View Code


转发邮件 

例:获取指定邮件夹下的第一封邮件并转发

技术分享
public static void main(String[] args) throws Exception {
    Properties prop = new Properties();
    prop.put("mail.store.protocol", "pop3");
    prop.put("mail.pop3.host", MAIL_SERVER_HOST);
    prop.put("mail.pop3.starttls.enable", "true");
    prop.put("mail.smtp.auth", "true");
    prop.put("mail.smtp.host", MAIL_SERVER_HOST);
 
    // 1、创建session
    Session session = Session.getDefaultInstance(prop);
 
    // 2、读取邮件夹
    Store store = session.getStore("pop3");
    store.connect(MAIL_SERVER_HOST, USER, PASSWORD);
 
    Folder folder = store.getFolder("inbox");
    folder.open(Folder.READ_ONLY);
 
    // 获取邮件夹中第1封邮件信息
    Message[] messages = folder.getMessages();
    if (messages.length <= 0) {
        return;
    }
    Message message = messages[0];
 
    // 打印邮件关键信息
    String from = InternetAddress.toString(message.getFrom());
    if (from != null) {
        System.out.println("From: " + from);
    }
    String replyTo = InternetAddress.toString(message.getReplyTo());
    if (replyTo != null) {
        System.out.println("Reply-to: " + replyTo);
    }
    String to = InternetAddress.toString(message.getRecipients(Message.RecipientType.TO));
    if (to != null) {
        System.out.println("To: " + to);
    }
    String subject = message.getSubject();
    if (subject != null) {
        System.out.println("Subject: " + subject);
    }
    Date sent = message.getSentDate();
    if (sent != null) {
        System.out.println("Sent: " + sent);
    }
 
    // 设置转发邮件信息头
    Message forward = new MimeMessage(session);
    forward.setFrom(new InternetAddress(MAIL_FROM));
    forward.setRecipient(Message.RecipientType.TO, new InternetAddress(MAIL_TO));
    forward.setSubject("Fwd: " + message.getSubject());
 
    // 设置转发邮件内容
    MimeBodyPart bodyPart = new MimeBodyPart();
    bodyPart.setContent(message, "message/rfc822");
 
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(bodyPart);
    forward.setContent(multipart);
    forward.saveChanges();
 
    Transport ts = session.getTransport("smtp");
    ts.connect(USER, PASSWORD);
    ts.sendMessage(forward, forward.getAllRecipients());
 
    folder.close(false);
    store.close();
    ts.close();
    System.out.println("message forwarded successfully....");
}
View Code

使用JavaMail收发邮件

标签:

原文地址:http://www.cnblogs.com/jingmoxukong/p/5223168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!