码迷,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加密传输的协议,分别是SMTPS,POP3S和IMAPS。

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

 

JavaMail简介

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

mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服务提供程序;

activation.jar:此JAR文件包含JAF API和Sun的实现。

JavaMail包中用于处理电子邮件的核心类是:Properties、Session、Message、Address、Authenticator、Transport、Store等。

 

邮件传输过程

技术分享

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

(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对象创建其他重要类的实例。

JavaMail在Jar包的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),传输对应邮件的发送,而存储对应邮件的接收。

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

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

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

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

 

javax.mail.Store类(邮件存储)

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

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

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

close:Store类的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
迷上了代码!