概述

1、邮件相关的标准

厂商所提供的 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) :即多用途因特网邮件扩展标准。它不是邮件传输协议。但对传输内容的消息、附件及其它的内容定义了格式。

2、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 等。

3、邮件传输过程

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

  • 创建一个 Session 对象。
  • Session 对象创建一个 Transport 对象 /Store 对象,用来发送 / 保存邮件。
  • Transport 对象 /Store 对象连接邮件服务器。
  • Transport 对象 /Store 对象创建一个 Message 对象 ( 也就是邮件内容 ) 。
  • Transport 对象发送邮件; Store 对象获取邮箱的邮件。

4、Message 结构

MimeMessage 类:代表整封邮件。

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

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

5、JavaMail 的核心类

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

6、java.util.Properties 类 ( 属性对象 )

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

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

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

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

1
2
3
4
5
Properties prop = new Properties();
prop.setProperty("mail.debug", "true");
prop.setProperty("mail.host", "[email protected]");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");

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

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

7、javax.mail.Session 类 ( 会话对象 )

Session 表示一个邮件会话。

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

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

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

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

javamail.default.providers ;

javamail.default.address.map 。

例:

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

8、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 方法用来关闭和邮件服务器的连接。

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

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

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

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

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

10、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 :如果邮件内容是纯文本,可以使用此接口设置文本内容。

10、javax.mail.Address( 地址 )

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

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

例:

Address address = new InternetAddress("[email protected]");
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
对象返回给调用程序。

例:

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

实例

发送文本邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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();
}

发送 HTML 格式的邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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();
}

发送带附件的邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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();
}

获取邮箱中的邮件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class StoreMail {
 final static String USER = "robot"; // 用户名
 final static String PASSWORD = "password520"; // 密码
 public final static String MAIL_SERVER_HOST = "mail.***.com"; // 邮箱服务器
 public final static String TYPE_HTML = "text/html;charset=UTF-8"; // 文本内容类型
 public final static String MAIL_FROM = "[email protected]"; // 发件人
 public final static String MAIL_TO = "[email protected]"; // 收件人
 public final static String MAIL_CC = "[email protected]"; // 抄送人
 public final static String MAIL_BCC = "[email protected]"; // 密送人
 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();
 }
}

转发邮件

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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....");
}

以上就是本文的全部内容,希望对大家学习javamail收发邮件的方法有所帮助。

javamail 发送、读取邮件的更多相关文章

  1. JavaMail(二):利用JavaMail发送复杂邮件

    上一篇文章我们学习了利用JavaMail发送简单邮件,这篇文章我们利用JavaMail发送稍微复杂一点的邮件(包含文本.图片.附件).这里只贴出核心代码,其余代码可参考JavaMail(一):利用Ja ...

  2. JavaMail发送简单邮件

    非常简单的发送邮件实现,网上有很多啦,但还是自己写写记录下吧. package cn.jmail.test; import java.util.Properties; import javax.mai ...

  3. 使用javaMail发送简单邮件

    参考网页:http://blog.csdn.net/xietansheng/article/details/51673073package com.bfd.ftp.utils; import java ...

  4. JavaMail(一):利用JavaMail发送简单邮件

    JavaMail,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.但它并没有包含在JDK中,要使用JavaMail首先要下载ja ...

  5. (一)JavaMail发送简单邮件

    1,导入依赖 <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail ...

  6. 【Mail】JavaMail发送带附件的邮件(二)

    上一篇讲了使用JavaMail发送普通邮件([Mail]JavaMail介绍及发送邮件(一)),本例讲发送复杂的邮件(带有附件的邮件) 生成一封复杂的邮件 新建一个JavaWeb的Maven工程,引入 ...

  7. [Java] JavaMail 发送带图片的 html 格式的邮件

    JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...

  8. 使用 EWS(Exchange Web Service)协议读取邮件、发送邮件

    问题: 公司之前可以通过POP3协议收发邮件,因而在SoapUI中用JavaMail可以读取邮件,后来配置了Office 365,POP3协议端口不再开放,邮件全部读取失败,报login timeou ...

  9. 邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

    好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进 ...

随机推荐

  1. java实现 链表反转

    输入一个链表,反转链表后,输出新链表的表头. 递归法 public class RevnNode { public static class Node { public int value; publ ...

  2. pwn入门题x2

    pwn1 这题由于事先知道源码 从main里调用get_flag函数 然后比较magic与password变量的值,不相等跳出,相等应该就能print出flag 先用objdump看一下main和ge ...

  3. 关于 iOS 性能优化方面的面试题,

    这是我前面几天碰到的面试题: 如何对定位和分析项目中影响性能的地方?以及如何进行性能优化? 我的答案: 定位方法: instruments   在iOS上进行性能分析的时候,首先考虑借助instrum ...

  4. 机器学习在入侵检测方面的应用 - 基于ADFA-LD训练集训练入侵检测判别模型

    1. ADFA-LD数据集简介 ADFA-LD数据集是澳大利亚国防学院对外发布的一套主机级入侵检测数据集合,包括Linux和Windows,是一个包含了入侵事件的系统调用syscall序列的数据集(以 ...

  5. java压缩文件或文件夹并导出

    java压缩文件或文件夹并导出 tozipUtil: package com.zhl.push.Utils; import java.io.File; import java.io.FileInput ...

  6. 12、Filter(拦截器)

    一.过滤器(Filter):又称拦截器.实现Filter接口的类我们称之为Filter(过滤器或拦截器),Filter可以对用户访问的资源进行拦截.例如:客户端发送请求是,先将请求拦截下来,判断用户是 ...

  7. 文件共享服务器share

    文件共享服务器:(类似于FTP服务器) 1.创建共享:文件夹右键属性--共享--开启共享--设置共享名--设置共享权限(建议设置为everyone完全控制,然后具体的权限需求在ntfs权限中设置即可) ...

  8. java aes CBC的填充方式发现

    如下的java代码,手动对block进行填充后,使其为16的整数倍后,加密的时候竟然强行再填充了16位,我在尝试用golang实现这段加密时,反复修改了很久,发现golang版的总是比java加密出来 ...

  9. Oracle 里 case 和decode的简单用法

    case 就相想当于C#里面switch    l 列:根据员工的职位,计算加薪后的薪水数据 如果职位是Analyst , 加薪10% 如果职位是Programmer 加薪5% 如果职位是clerk ...

  10. Python appium搭建app自动化测试环境

    appium做app自动化测试,环境搭建是比较麻烦的. 也是很多初学者在学习app自动化之时,花很多时间都难跨越的坎. 但没有成功的环境,就没有办法继续后续的使用. 在app自动化测试当中,我们主要是 ...