- 浏览: 19401 次
- 性别:
- 来自: 成都
文章分类
最新评论
最近上课时,用到了JavaMail。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" <beansoft@earth.org>
To: "hp" <hp@earth.org>
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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=GB2312">
<META content="MSHTML 6.00.5730.13" name=GENERATOR><LINK
href="BLOCKQUOTE{margin-Top: 0px; margin-Bottom: 0px; margin-Left: 2em}"
rel=stylesheet></HEAD>
<BODY style="FONT-SIZE: 10pt; MARGIN: 10px; FONT-FAMILY: verdana">
<DIV><FONT face=Verdana size=2><STRONG>Body</STRONG></FONT></DIV><FONT
face=Verdana size=2>
<DIV> </DIV></FONT></BODY></HTML>
--===========分割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();
}
}
发表评论
-
Javamail_发送邮件_带附件的邮件
2012-06-28 10:39 986今天学习了一下JavaMail,javamail发送邮件确实是 ... -
JavaMail_发送邮件_使用MIME协议创建内含图片的复杂邮件(转)
2012-06-15 13:48 1143像上一篇文章那样,我们只能创建一封封只包含纯文本或者HTM ... -
javamail_接收邮件_附件解析较全(转)
2012-06-15 01:20 1119java 代码 import java.io.*; ... -
JavaMail:在Web应用下完整接收、解析复杂邮件(转)
2012-06-15 01:11 915其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式 ... -
javamail_接收邮件_邮件附件中文名乱码问题草解
2012-06-14 20:28 1651Android的邮件编码网上的资料很少,但大体与JavaMa ... -
javamail_接收邮件_pop3接收邮件乱码问题
2012-06-14 19:56 1926javaMail基础: Session类,它代表与邮件服 ...
相关推荐
在JavaMail中,JAF被用来解析和操作邮件中的复杂数据结构,如带有附件或嵌入图片的邮件。jaf-1_1_1.zip文件包含了JAF的1.1.1版本,可能包括了库文件、API文档和其他相关资源。 JavaMail API documentation.rar可能...
JavaMail API支持MIME(多用途互联网邮件扩展)格式,这使得我们能够处理包括文本、图片、音频、视频以及各种其他类型在内的复杂邮件内容,包括附件。 下面是一个简化的JavaMail发送邮件的过程: 1. **配置邮件...
在"javamail实用的一个程序事例"中,可能包含了使用JavaMail发送带有附件的邮件的示例代码。通常会涉及以下步骤: - 初始化 `Session`,设置服务器信息。 - 创建 `MimeMessage`,设置发件人、收件人、主题、正文...
JavaMail是一种广泛使用的Java库,用于处理电子邮件的发送和接收。在Java应用程序中实现邮件接收功能,JavaMail是必不可少的工具。本教程将详细介绍如何利用JavaMail API来接收邮件。 首先,我们需要理解JavaMail的...
JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一套API,使得开发者能够方便地处理SMTP、POP3和IMAP等邮件协议。在给定的标题和描述中,我们讨论的是如何使用JavaMail API来接收邮件...
JavaMail API 是一套用于处理电子邮件的Java库,它允许开发者编写能够读取、撰写和发送电子邮箱的应用程序,类似于Eudora、Foxmail或MS Outlook Express等邮件用户代理(MUA)。这个API的设计目标是独立于具体的邮件...
关于邮件解析,JavaMail 提供了 MimeMessage 类,可以解析MIME格式的邮件。MIME是一种标准,允许在邮件中包含不同类型的附件,如图片、文档等。通过 MimeMultipart 类,可以访问邮件中的多个部分,并对每个部分进行...
通过解析给定文件的标题、描述、标签及部分内容,我们可以深入探讨javamail发送与接收邮件的详细教程,以及如何利用JavaMail API实现邮件功能。 ### javamail发送、接收邮件 JavaMail API是由Sun Microsystems开发...
JavaMail还支持HTML格式的邮件和发送带有图片的复杂内容。 在这个压缩包中,"code_java"可能包含了一些示例代码,涵盖了上述的Base64编码、文件上传下载和JavaMail的实现。通过分析和学习这些代码,开发者可以更好...
### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将...
JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...
JavaMail不仅支持文本邮件,还支持多媒体附件和多部分消息格式。 #### 二、JavaMail的主要功能 1. **发送邮件**:通过配置SMTP服务器,可以发送纯文本邮件、HTML格式邮件以及包含附件的邮件。 2. **接收邮件**:...
这个例子展示了如何使用JavaMail发送带附件的邮件。需要注意的是,实际应用中应处理各种异常,确保邮件发送的健壮性。此外,如果你的邮件服务器需要身份验证,还需要提供一个Authenticator来处理登录信息。 总的来...
在IT行业中,邮件服务是日常通信的一个重要组成部分,...通过熟练掌握JavaMail API,开发者可以构建出强大的邮件服务功能,不仅限于接收附件,还可以实现自动过滤、分类、回复等功能,极大地提升了工作效率和沟通体验。
10. **高级特性**:除了基本的邮件操作,JavaMail API还支持邮件过滤、搜索、存储规则、邮件头的解析和处理,以及邮件事件监听器等功能。 在实际开发中,理解并熟练使用这些JavaMail API的关键概念和方法,可以帮助...
JavaMail 是一个开源的 Java 库,用于在 Java 应用程序中发送和接收电子邮件。它提供了丰富的 API,使得开发者可以方便地与各种邮件服务器进行交互,支持 SMTP、POP3 和 IMAP 协议。本篇文章将深入探讨 JavaMail 的...
例如,当通过JavaMail发送带有附件的邮件时,JAF会负责识别附件的MIME类型并将其转化为可发送的格式。 在实际应用中,开发者可能需要将这两个库集成到他们的Java项目中,以实现邮件功能。这通常涉及到将对应的jar...
根据提供的文件信息,本文将详细解释如何使用JavaMail在Java应用程序中发送电子邮件,包括带有附件的邮件发送功能。本文档将覆盖以下知识点: 1. JavaMail API简介 2. JavaMail配置与设置 3. 创建并发送普通邮件 4....
JAF 提供了一种标准的方式来识别和操作数据,使得 Java 应用程序能够处理未知的数据类型,比如在邮件中解析和创建附件。 总结,基于 JavaMail 的电子邮件群发实现了高效、便捷的信息发布。通过使用 JavaMail API,...