`

JavaMail:带附件的邮件格式解析

阅读更多

JavaMail:带附件的邮件格式解析
最近上课时,用到了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>&nbsp;</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();

    }

}

文章出处:http://www.diybl.com/course/3_program/java/javaxl/200885/134737.html

分享到:
评论
1 楼 wangyj0898 2010-06-02  
刚好模糊在邮件信息这一块,楼主讲的很详细~!

相关推荐

    james和javamail实现邮件收发(带发送附件)

    JavaMail API支持MIME(多用途互联网邮件扩展)格式,这使得我们能够处理包括文本、图片、音频、视频以及各种其他类型在内的复杂邮件内容,包括附件。 下面是一个简化的JavaMail发送邮件的过程: 1. **配置邮件...

    javamail(带界面的javamail)

    关于邮件解析,JavaMail 提供了 MimeMessage 类,可以解析MIME格式的邮件。MIME是一种标准,允许在邮件中包含不同类型的附件,如图片、文档等。通过 MimeMultipart 类,可以访问邮件中的多个部分,并对每个部分进行...

    javamail 回执邮件资料

    例如,使用 Commons Email 发送带附件的邮件: ```java SimpleEmail email = new SimpleEmail(); email.setFrom("sender@example.com"); email.setSubject("邮件主题"); email.setMsg("邮件正文"); email....

    javaMail 发邮件

    这个例子展示了如何使用JavaMail发送带附件的邮件。需要注意的是,实际应用中应处理各种异常,确保邮件发送的健壮性。此外,如果你的邮件服务器需要身份验证,还需要提供一个Authenticator来处理登录信息。 总的来...

    javamail发送、接收邮件

    给定的部分内容展示了如何使用JavaMail API发送带有附件的邮件。代码中使用了`MimeMessage`、`MimeBodyPart`、`MimeMultipart`等类来构建邮件消息,同时通过`DataHandler`和`FileDataSource`来处理邮件附件。此外,...

    基于JaVaMail的Web邮件客户端的设计与实现

    JavaMail不仅支持文本邮件,还支持多媒体附件和多部分消息格式。 #### 二、JavaMail的主要功能 1. **发送邮件**:通过配置SMTP服务器,可以发送纯文本邮件、HTML格式邮件以及包含附件的邮件。 2. **接收邮件**:...

    JavaMail教程:使用IMAP协议接收并解析电子邮件 - 为程序员服务.zip

    以上就是使用JavaMail和IMAP协议在Java中接收并解析电子邮件的基本步骤。通过深入学习和理解这些概念,你可以构建更复杂的邮件处理系统,比如实现邮件过滤、自动回复、邮件归档等功能。同时,还可以探索其他邮件协议...

    完整的javamail发送邮件源码

    以下是对JavaMail核心知识点的详细解析: 1. JavaMail API:JavaMail API 是一组用于处理邮件的Java接口和类,它提供了与各种邮件系统交互的能力,包括SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和IMAP...

    基于Javamail开发的简易邮箱客户端,包括邮件发送,邮件转发,发送附件,邮件接受,邮件删除,邮件查询

    JavaMail是一种在Java环境中处理电子邮件的标准API,它允许开发者创建、发送、接收和管理电子邮件。本项目基于JavaMail开发了一个简易的邮箱客户端,提供了一系列基本的邮件操作功能,包括: 1. **邮件发送**:使用...

    javamail收发邮件(带附件,正文带图).docx

    ### JavaMail 发送带附件及内嵌图片的邮件 #### 一、概述 在现代通讯方式中,电子邮件依然占据着重要的地位,特别是在企业级应用中。JavaMail API 是 Java 平台上广泛使用的邮件处理库之一,它允许开发人员通过...

    javamail发送邮件和java解析pdf

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子...JavaMail使你能够创建复杂的电子邮件,而PDF解析库则帮助你提取和操作PDF文档中的数据。理解并掌握这些技术将大大提高你在开发中的效率和能力。

    javamail发邮件(带附件功能)

    根据提供的文件信息,本文将详细解释如何使用JavaMail在Java应用程序中发送电子邮件,包括带有附件的邮件发送功能。本文档将覆盖以下知识点: 1. JavaMail API简介 2. JavaMail配置与设置 3. 创建并发送普通邮件 4....

    sample-javamail:JavaMail 示例

    6. 处理多部分消息:如果邮件包含文本、HTML、图片或其他类型的附件,示例可能会展示如何解析和显示这些内容。 通过这些示例,开发者可以学习如何在实际项目中使用JavaMail API,从而创建功能丰富的电子邮件应用。...

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    可以通过添加如下代码来确保邮件的正确解析: ```java MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=...

    基于JavaMail的电子邮件群发

    JAF 提供了一种标准的方式来识别和操作数据,使得 Java 应用程序能够处理未知的数据类型,比如在邮件中解析和创建附件。 总结,基于 JavaMail 的电子邮件群发实现了高效、便捷的信息发布。通过使用 JavaMail API,...

    带附件的发送邮件JSP程序

    【标题】:“带附件的发送邮件JSP程序” 在IT领域,JSP(JavaServer Pages)是一种基于Java的服务器端脚本语言,用于创建动态网页。这个“带附件的发送邮件JSP程序”是一个功能丰富的应用程序,允许用户通过网页界...

    JavaMail邮件的上传和下载

    JavaMail是一种在Java环境下处理电子邮件的强大工具,它提供了丰富的API,允许开发者发送、接收和管理邮件。这个压缩包文件中的"16_sendmail"可能包含了用于演示如何使用JavaMail发送邮件的源代码。 JavaMail的核心...

    jsp/servlet javamail 发送邮件 可发送多个附件

    在Java Web开发中,JSP(JavaServer ...总的来说,这个JSP/Servlet邮件系统利用JavaMail API实现了发送多附件邮件的功能,但也需要注意编码问题和安全性。通过不断优化和调试,可以构建出稳定且功能丰富的邮件服务。

    javamail:javamail 与 javamail 1.4

    本文将深入探讨JavaMail及其1.4版本的关键特性,以及如何利用它们来实现文本、HTML和带有附件的邮件。 ### JavaMail 的核心组件 1. **Session**:JavaMail 的核心是 `Session` 类,它代表了与邮件服务器的会话。...

    用javaMail发送邮件

    JAF允许程序识别和操作这些不同类型的数据,使得JavaMail可以正确解析和构建复杂的邮件结构。 下面是一个简单的JavaMail发送邮件的步骤: 1. **导入必要的库**:首先,在项目中导入`mail.jar`和`activation.jar`,...

Global site tag (gtag.js) - Google Analytics