JavaMail可以使用POP3协议接受邮件,可用来实现邮件发布文章功能。
那么具体该怎么做呢?这就必须先要明白带附件的邮件的格式。
当收到邮件后进行解析,我们可以看到如下的邮件代码(注意为了便于阅读,已经将分隔符替换为比较容易阅读的格式):
Received: from 127.0.0.1 by FMS4711; Fri, 25 Jul 2008 13:02:36 +0800
Date: Fri, 25 Jul 2008 13:02:36 +0800
From: "beansoft"
To: "hp"
Subject: =?gb2312?B?wb249ri9vP4=?=
Message-ID:
<200807251302355150265@earth.org>
X-mailer: Foxmail 6, 13, 102, 15
[cn]
Mime-Version: 1.0
Content-Type: multipart/mixed;
boundary="===========分割一============"
This is a multi-part message in MIME format.
--===========分割一============
Content-Type: multipart/alternative;
boundary="===========分割2================="
--===========分割2=================
Content-Type: text/plain;
charset="gb2312"
Content-Transfer-Encoding: 7bit
Body
--===========分割2=================
Content-Type: text/html;
charset="gb2312"
Content-Transfer-Encoding: 7bit
href="BLOCKQUOTE{margin-Top: 0px; margin-Bottom: 0px;
margin-Left: 2em}"
rel=stylesheet>
Body
face=Verdana size=2>
--===========分割2=================--
--===========分割一============
Content-Type: application/octet-stream;
name="String2Java.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="String2Java.jpg"
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
oAKKKKACiiigAooooA//2Q==
--===========分割一============
Content-Type: application/octet-stream;
name="FoxmailUpdate.log"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="FoxmailUpdate.log"
OAAAAPgb7GHGsCG8a8W48hC9ihdb8CcIlHlKXcYwNP+8dPRB30zrsI2K4TPJP0gYLB3Cua0JRtBL
g/z8XA5PJneuwd9Uiu0nEH4Iobo+12oK9hsKK7xFXYhw++a50FHQuCDXX5kpF2d6
--===========分割一============--
|
它对应JavaMail的Message对象,一个Message对象又会有多个子对象如MultiPart对象,更特殊的是整个邮件内容为一个大的MultiPart,然而邮件的正文则在嵌套的一个子MultiPart中,如果不了解这种组织结构,就可能无法正确获得邮件的正文。此结构如下图所示:
邮件
Message
头部
(
主题
,
发件人信息等
)
|
MultiPart
邮件全部内容
,
包含正文和附件
正文
MultiPart
文本正文
text/plain
Content-Type:
text/plain;charset="gb2312"
|
HTML
网页格式
text/html
Content-Type:
text/html;charset="gb2312"
|
|
附件
1
Content-Type:
application/octet-stream;
name="String2Java.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="String2Java.jpg"
|
附件
2
Content-Type:
application/octet-stream;
name="FoxmailUpdate.log"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="FoxmailUpdate.log"
|
|
|
有了这些资料,我们就可以来解析邮件了,代码如下:
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMultipart;
/**
* 邮件接受测试
*
*/
public class POP3MailReceiverTest {
public POP3MailReceiverTest() {
try {
// 1. 设置连接信息, 生成一个 Session
Properties props = new Properties();
props.put("mail.transport.protocol", "pop3");// POP3 收信协议
props.put("mail.pop.port", "110");
// props.put("mail.debug", "true");// 调试
Session session = Session.getInstance(props);
// 2. 获取 Store 并连接到服务器
Store store = session.getStore("pop3");
store.connect("localhost", "hp@earth.org", "1234");
// 3. 通过 Store 打开默认目录 Folder
Folder folder = store.getDefaultFolder();// 默认父目录
if (folder == null) {
System.out.println("服务器不可用");
return;
// System.exit(1);
}
// System.out.println("默认信箱名:" + folder.getName());
//
// Folder[] folders = folder.list();// 默认目录列表
//
// System.out.println("默认目录下的子目录数: " + folders.length);
Folder popFolder = folder.getFolder("INBOX");// 获取收件箱
popFolder.open(Folder.READ_WRITE);// 可读邮件,可以删邮件的模式打开目录
// 4. 列出来收件箱 下所有邮件
Message[] messages = popFolder.getMessages();
// 取出来邮件数
int msgCount = popFolder.getMessageCount();
System.out.println("共有邮件: " + msgCount + "封");
// FetchProfile fProfile = new FetchProfile();// 选择邮件的下载模式,
// 根据网速选择不同的模式
// fProfile.add(FetchProfile.Item.ENVELOPE);
// folder.fetch(messages, fProfile);// 选择性的下载邮件
// 5. 循环处理每个邮件并实现邮件转为新闻的功能
for (int i = 0; i < msgCount; i++) {
Message msg = messages[i];// 单个邮件
// 发件人信息
Address[] froms = msg.getFrom();
if(froms != null) {
System.out.println("发件人信息:" + froms[0]);
InternetAddress addr = (InternetAddress)froms[0];
System.out.println("发件人地址:" + addr.getAddress());
System.out.println("发件人显示名:" + addr.getPersonal());
}
News news = new News();// 生成新闻对象
System.out.println("邮件主题:" + msg.getSubject());
news.setTitle(msg.getSubject());
// getContent() 是获取包裹内容, Part 相当于外包装
Multipart multipart = (Multipart) msg.getContent();// 获取邮件的内容, 就一个大包裹,
// MultiPart
// 包含所有邮件内容(正文+附件)
System.out.println("邮件共有" + multipart.getCount() + "部分组成");
// 依次处理各个部分
for (int j = 0, n = multipart.getCount(); j < n; j++) {
System.out.println("处理第" + j + "部分");
Part part = multipart.getBodyPart(j);//解包, 取出 MultiPart的各个部分, 每部分可能是邮件内容,
// 也可能是另一个小包裹(MultipPart)
// 判断此包裹内容是不是一个小包裹, 一般这一部分是 正文 Content-Type: multipart/alternative
if (part.getContent() instanceof Multipart) {
Multipart p = (Multipart) part.getContent();// 转成小包裹
System.out.println("小包裹中有" + p.getCount() + "部分");
// 列出小包裹中所有内容
for (int k = 0; k < p.getCount(); k++) {
System.out.println("小包裹内容:" + p.getBodyPart(k).getContent());
System.out.println("内容类型:"
+ p.getBodyPart(k).getContentType());
if(p.getBodyPart(k).getContentType().startsWith("text/plain")) {
// 处理文本正文
news.setBody(p.getBodyPart(k).getContent() + "");
} else {
// 处理 HTML 正文
news.setBody(p.getBodyPart(k).getContent() + "");
}
}
}
// Content-Disposition: attachment; filename="String2Java.jpg"
String disposition = part.getDisposition();// 处理是否为附件信息
if (disposition != null) {
System.out.println("发现附件: " + part.getFileName());
System.out.println("内容类型: " + part.getContentType());
System.out.println("附件内容:" + part.getContent());
java.io.InputStream in = part.getInputStream();// 打开附件的输入流
// 读取附件字节并存储到文件中
java.io.FileOutputStream out = new FileOutputStream(part.getFileName());
int data;
while((data = in.read()) != -1) {
out.write(data);
}
in.close();
out.close();
}
}
// }
// TODO newsDAO.save(news); // 将邮件所携带的信息作为新闻存储起来
// 6. 删除单个邮件, 标记一下邮件需要删除, 不会真正执行删除操作
// msg.setFlag(Flags.Flag.DELETED, true);
}
// 7. 关闭 Folder 会真正删除邮件, false 不删除
popFolder.close(true);
// 8. 关闭 store, 断开网络连接
store.close();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
new POP3MailReceiverTest();
}
}
转自:http://blog.csdn.net/lenolong/archive/2009/03/08/3967446.aspx
分享到:
相关推荐
在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 首先,我们需要知道发送邮件通常使用 SMTP(简单邮件传输协议),而接收邮件则涉及...
JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...
下面我们将详细探讨如何使用JavaMail API实现邮件的收取,特别是如何通过POP3和IMAP协议获取邮件信息。 首先,确保你的项目中已经引入了JavaMail相关的依赖,如果你使用的是Maven,可以在pom.xml文件中添加以下依赖...
### JavaMail收发Gmail邮件知识点详解 #### 一、JavaMail简介 JavaMail API是Java平台中的一个标准扩展库,用于发送、接收以及管理电子邮件。它提供了丰富的接口来实现邮件的各种操作,如构建复杂的MIME消息、处理...
根据提供的文件信息,我们可以深入探讨如何使用JavaMail API来发送和接收邮件,特别是通过QQ邮箱服务来进行操作。本文将详细解析文件中提到的关键步骤,并补充更多实用的信息。 ### JavaMail API简介 JavaMail API...
javamail所需要的两个jar包。mail.jar,activation.jar 博文链接:https://javeye.iteye.com/blog/153827
### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将...
(1) 收取并显示POP3邮件服务器上指定邮箱的邮件; (2) 使用SMTP邮件服务器发送邮件; (3) 邮件附件的发送与接受; (4) 删除邮件; 具体操作步骤如下: 1、打开javamailsystem文件夹,找到javamail.jar可执行文件,...
在本文中,我们将深入探讨如何在SpringBoot应用中整合JavaMail服务,以便实现电子邮件的发送功能。SpringBoot作为一款轻量级的框架,提供了一种简单的方法来集成各种功能,包括邮件服务。JavaMail是Java平台上的标准...
JavaMail 是一个开源的 Java API,它允许开发者在 Java 应用程序中添加电子邮件功能,包括发送、接收邮件以及管理邮箱。在这个主题中,我们将深入探讨如何使用 JavaMail 实现邮件的加密和解密,以及如何进行邮件的...
基于Javamail的邮件收发系统是一款简单、方便、快捷的邮件系统。它能实现邮件的接收与...(1) 收取并显示POP3邮件服务器上指定邮箱的邮件; (2) 使用SMTP邮件服务器发送邮件; (3) 邮件附件的发送与接受; (4) 删除邮件
3. **POP3(Post Office Protocol version 3)** 和 **IMAP4(Internet Message Access Protocol version 4)**:JavaMail支持这两种常见的邮件接收协议,用户可以根据需求选择合适的协议来收取邮件。 4. **SMTP...
- 收取邮件:JavaMail同样支持收取邮件,通过Store对象连接到邮件服务器,然后打开Folder,读取Message。 4. **注意点**: - 安全性:使用JavaMail发送邮件时,确保传输过程是加密的,如使用SMTPS协议而非不安全...
(1) 收取并显示POP3邮件服务器上指定邮箱的邮件; (2) 使用SMTP邮件服务器发送邮件; (3) 邮件附件的发送与接受; (4) 删除邮件; 邮件客户端的功能界面如下图4-1所示: 图4-1 系统界面 4.1环境配置与界面搭建 在...
(1) 收取并显示POP3邮件服务器上指定邮箱的邮件; (2) 使用SMTP邮件服务器发送邮件; (3) 邮件附件的发送与接受; (4) 删除邮件; 具体操作步骤如下: 1、 打开javamailsystem文件夹,找到javamail.jar可执行文件,...
javaMail 发送验证码模板,下载积分可以为0不?可以发送已测试
(1) 收取并显示POP3邮件服务器上指定邮箱的邮件; (2) 使用SMTP邮件服务器发送邮件; (3) 邮件附件的发送与接受; (4) 删除邮件; 具体操作步骤如下: 1、 打开javamailsystem文件夹,找到javamail.jar可执行文件,...
- 收取邮件:连接 Store,打开 Folder,然后遍历 Message 对象。 4. **API 文档**: - JavaMail 1.4.3 的 API 文档详尽地列出了所有接口、类和方法,是开发过程中查找和理解功能的重要参考。 - 它提供了方法签名...
JavaMail API 使用SMTP服务器进行邮件发送,通过建立TCP连接,发送邮件数据到指定的SMTP服务器,进而将邮件传递到目标邮箱。 3. **POP3/IMAP 协议**:POP3和IMAP是两种常见的邮件接收协议。POP3允许用户下载服务器...
- **JavaMail收取邮件属性配置**:展示了不同邮件服务提供商(如Gmail、Hotmail等)的配置属性。 - **JavaMail发送邮件**:一个名为`MailSender.java`的示例程序,用于发送邮件。 - **JavaMail收取邮件POP3**:演示...