`
yuancihang
  • 浏览: 145187 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

MIME解码

阅读更多

1.环境

 

JDK6

Java MAIL

 

2. 代码


import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import javax.mail.Header;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.ParseException;

import org.apache.log4j.Logger;

public class MimeDecoder {
   
    private Logger logger =  Logger.getLogger(MimeDecoder.class);
   
    private MimeMessage message;
    private String encoding = "UTF-8"; //MIME正文编码
   
    private String txtContent; //纯文本正文
    private String htmlContent; //超文本正文
    private Map<String, MimeAttachment> attachmentMap = new HashMap<String, MimeAttachment>(); //附件, 内嵌文件
    private Map<String, String> headers = new LinkedHashMap<String, String>();
   
    /**
     * 构造MIME解码器
     * @param text String MIME原始报文
     * @param encoding String MIME正文默认编码, 仅当MIME正文没有指定编码时使用
     * @throws MessagingException
     */
    public MimeDecoder(String text, String encoding)throws MessagingException{
        message = new MimeMessage(Session.getDefaultInstance(new Properties()), new ByteArrayInputStream(text.getBytes()));
        this.encoding = encoding;
    }
    public MimeDecoder(String text)throws MessagingException{
        message = new MimeMessage(Session.getDefaultInstance(new Properties()), new ByteArrayInputStream(text.getBytes()));
    }
    public MimeDecoder(byte[] data, String encoding)throws MessagingException{
        message = new MimeMessage(Session.getDefaultInstance(new Properties()), new ByteArrayInputStream(data));
        this.encoding = encoding;
    }
    public MimeDecoder(byte[] data)throws MessagingException{
        message = new MimeMessage(Session.getDefaultInstance(new Properties()), new ByteArrayInputStream(data));
    }
    public MimeDecoder(InputStream is, String encoding)throws MessagingException{
        message = new MimeMessage(Session.getDefaultInstance(new Properties()), is);
        this.encoding = encoding;
    }
    public MimeDecoder(InputStream is)throws MessagingException{
        message = new MimeMessage(Session.getDefaultInstance(new Properties()), is);
    }
   
    public String getHeader(String name){
        return headers.get(name);
    }
    public Set<String> headNameSet(){
        return headers.keySet();
    }
   
    public String getTxtContent(){
        return txtContent;
    }
    public byte[] getTxtData()throws UnsupportedEncodingException{
        if(txtContent != null){
            return txtContent.getBytes(encoding);
        }
        return null;
    }
    public String getHtmlContent(){
        return htmlContent;
    }
    public byte[] getHtmlData()throws UnsupportedEncodingException{
        if(htmlContent != null){
            return htmlContent.getBytes(encoding);
        }
        return null;
    }
    public Iterator<Map.Entry<String, MimeAttachment>> attachmentIterator(){
        return attachmentMap.entrySet().iterator();
    }
   
    public Collection<MimeAttachment> attachmentCollections(){
        return attachmentMap.values();
    }
   
    private void updateEncoding(String contentType)throws ParseException{
        if(contentType != null){
            ContentType ct = new ContentType(contentType);
            String e = ct.getParameter("charset");
            if(e != null){
                this.encoding = e;
            }
        }
    }
   
    public void decode(){
        try {
            decodeHeaders();
           
            Object messageBody = message.getContent();
            if(message.isMimeType("text/html")){//MIME超文本正文
                updateEncoding(message.getContentType());
                htmlContent = (String)messageBody;
            }else if(message.isMimeType("text/*")){//MIME纯文本正文
                updateEncoding(message.getContentType());
                txtContent = (String)messageBody;
            }else if(message.isMimeType("multipart/*")){ //带附件的MIME处理
                Multipart multipart = (Multipart)messageBody;
                int count = multipart.getCount();
                for (int i=0, n=count; i<n; i++) {
                    MimeBodyPart part = (MimeBodyPart)multipart.getBodyPart(i);
                    decodeBodyPart(part);
                }
            }
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
   
    protected void decodeHeaders()throws MessagingException{
        Enumeration<?> headEnumeration = message.getAllHeaders();
        while(headEnumeration.hasMoreElements()){
            Header header = (Header)headEnumeration.nextElement();
            headers.put(header.getName(), header.getValue());
        }
    }
   
    protected void decodeBodyPart(MimeBodyPart part)throws MessagingException, IOException{
        String disposition = part.getDisposition();
        if (disposition != null) {//如果是附件
            MimeAttachment mimeAttachment= new MimeAttachment(part);
            attachmentMap.put(mimeAttachment.getName(), mimeAttachment);
        }else {
            if(part.isMimeType("text/html")){//MIME超文本正文
                updateEncoding(part.getContentType());
                htmlContent = (String)part.getContent();
            }else if(part.isMimeType("text/*")){//MIME纯文本正文
                updateEncoding(part.getContentType());
                txtContent = (String)part.getContent();
            }else if(part.isMimeType("multipart/*")){//嵌套multipart
                Multipart multipart = (Multipart)part.getContent();
                int count = multipart.getCount();
                for (int i=0, n=count; i<n; i++) {
                    MimeBodyPart p = (MimeBodyPart)multipart.getBodyPart(i);
                    decodeBodyPart(p);
                }
            }else{
                logger.info("不支持的MIME正文媒体类型: " + part.getContentType());
            }
           
        }
    }
   
   
}



import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeUtility;

public class MimeAttachment {
   
    protected byte[] data;
    protected String name;
    protected boolean isInline = false;
    protected ContentType ct;
   
    public MimeAttachment(MimeBodyPart part)throws IOException, MessagingException{
        String disposition = part.getDisposition();
        if (disposition != null) {//如果是附件
            ct = new ContentType(part.getContentType());
            if(disposition.equals(Part.ATTACHMENT)){
                this.name = nameDecode(part.getFileName());
            }else if(disposition.equals(Part.INLINE)){
                this.name = nameDecode(part.getContentID());
                this.isInline = true;
            }
            parse(part);
        }
    }
   
    protected void parse(MimeBodyPart part)throws IOException, MessagingException{
        InputStream is = part.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int data = -1;
        while((data = is.read()) != -1){
            baos.write(data);
        }
        this.data = baos.toByteArray();
    }
   
    protected String nameDecode(String s)throws UnsupportedEncodingException{
        return MimeUtility.decodeText(s);
    }
   
    public byte[] getData(){
        return data;
    }
   
    public String getName(){
        return name;
    }
   
    public File saveTo(String dir)throws IOException{
        if(data != null){
            File f = new File(new File(dir), name);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f));
            bos.write(data);
            bos.close();
            return f;
        }
       
        return null;
    }
   
    public boolean isInline(){
        return isInline;
    }
   
    public ContentType getContentType(){
        return ct;
    }

}

3. 测试

 

public static void main(String args[])throws Exception{

        MimeDecoder decoder = new MimeDecoder(new FileInputStream("d:/test/开源项目.eml"));
        decoder.decode();
        if(decoder.getTxtContent() != null){
            System.out.println("MIME纯文本正文: " + decoder.getTxtContent());
        }
        if(decoder.getHtmlContent() != null){
            System.out.println("MIME超文本正文: " + decoder.getHtmlContent());
        }
       
        //保存附件
        String dir = "d:/test";
        Collection<MimeAttachment> attachments = decoder.attachmentCollections();
        for(MimeAttachment attachment : attachments){
            attachment.saveTo(dir);
        }
       
    }

分享到:
评论

相关推荐

    The mimedecode library:C ++ MIME解码库-开源

    《C++ MIME解码库——mimedecode的探索与应用》 在信息化时代,电子邮件、Web通信等网络服务广泛采用MIME(Multipurpose Internet Mail Extensions)标准来编码和传输各种类型的数据。为了处理这些MIME编码的数据,...

    MIME编解码器

    原创作品, VC6.0,MFC开发. 支持常用的MIME编解码, 如base64, quoted-printable, UUENCODE, UTF-7, UTF-8, 简繁转换, MD5计算等.

    PHP教程之用PHP实现POP3邮件的收取[二]

    分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取,解码部分会在以后的文章中为各位详细的介绍,敬请关注。  现在Internet上最大的应用应该是非Email莫属了,我们每天都习惯于每天通过Email进行...

    PHP教程之用PHP实现POP3邮件的收取[一]

    分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取,解码部分会在以后的文章中为各位详细的介绍,敬请关注。  现在Internet上最大的应用应该是非Email莫属了,我们每天都习惯于每天通过Email进行...

    编码解码方法

    3. MIME解码:MIME(Multipurpose Internet Mail Extensions)用于扩展电子邮件标准,包含多种编码方式,如Base64、Quoted-Printable等,用于在邮件中传输非ASCII字符。 4. 图像解码:JPEG、PNG、GIF等图像文件格式...

    enmime:Go的MIME邮件编码和解码包

    enmime是Go的MIME编码和解码库,专注于生成和解析MIME编码的电子邮件。 它与电子邮件服务一起开发。 enmime包括一个流畅的界面生成器,用于生成MIME编码的消息,请参阅Wiki中的示例。 有关示例和API使用信息,请...

    MIME Quoted Printable &amp; Base64 编码解码程序

    在MIME协议中,有两类常见的编码方式:Quoted-Printable(引号可打印)和Base64,这两种编码主要用于处理包含特殊字符的数据,确保它们能够在电子邮件或其他文本传输系统中正确地编码和解码。 **Quoted-Printable...

    电子邮件MIME协议中的Base64编解码

    电子邮件MIME协议中的Base64编解码 Base64编解码是MIME协议中的一种常用的编码方式,用于将二进制数据转换为文本数据,以便在电子邮件中传输。下面是 Base64 编解码的知识点: 1. 什么是Base64编解码? Base64编...

    C#实现邮件内容 MIME信息的编码/解码

    C# 类库来实现MIME的编码和解码 MimeMessage mail new MimeMessage ; mail SetDate ; mail Setversion ; mail SetFrom &quot;sender@local com&quot; null ; mail SetTo &quot;recipient1@server1 com Nick Name...

    CodeView2.6(邮件乱码查看器)

    - **MIME解码**:对于MIME编码的邮件内容,该工具能够正确地解码,恢复原始的文本格式。 - **界面友好**:提供简洁直观的用户界面,让用户轻松操作,快速查看乱码邮件的原文。 - **批量处理**:如果用户收到多封...

    MIME协议分析 MIME

    邮件客户端在接收到MIME格式的邮件后,会根据邮件头中的指示解码并呈现内容,使得用户能够阅读和交互。 总结来说,MIME协议通过增强电子邮件的格式和编码能力,极大地扩展了邮件的使用范围,使得邮件不仅可以传输...

    mime64编码修正

    `mimeb64.cpp`可能包含了修正后的MIME64编码的函数实现,这些函数可能包括将字节流转换为MIME64字符串的编码过程,以及将MIME64字符串解码回原始字节流的解码过程。而`mimeb64.h`则可能包含了这些函数的声明,供其他...

    Go mime包资源获取

    8. **解码MIME编码**:`mime/quotedprintable`包提供了对Quoted-Printable编码的解码,这是一种在邮件和其他文本传输中常见的编码方式。 9. **编码MIME编码**:虽然Go的`mime`包本身不提供MIME编码,但`mime/...

    httpmime-4.25.jar.zip

    httpmime-4.25.jar是Apache HttpClient库的一部分,它专注于HTTP消息内容的编码和解码,提供了对MIME(Multipurpose Internet Mail Extensions)类型的全面支持。MIME是一种标准,用于定义非文本格式的数据如何在...

    MIME加密解密源代码VB版

    分析这段代码可以帮助理解如何在VB环境中处理MIME数据,包括解析头信息、解码MIME编码的正文和附件、以及执行加密和解密操作。 6. 类库和API:VB开发人员可能会利用现有的类库或API,如System.Net.Mail类库,来简化...

    .NET POP3 MIME Client

    3. **解码MIME内容**:解码Base64、Quoted-Printable等编码的邮件内容,恢复原始数据。 4. **处理附件**:提取和保存邮件中的附件,支持各种文件类型。 5. **编码转换**:处理不同字符集之间的转换,确保正确显示非...

    apache-mime4j-0.6.jar&httpmime-4.0.1.jar

    2. 内容处理:支持对MIME消息中的不同部分进行解码、编码,如Base64、Quoted-Printable等。 3. 建立MIME消息:除了解析,MIME4J还允许开发者构建新的MIME消息,为发送文件或创建复杂的邮件结构提供便利。 4. 头部...

    MIME_Developer

    webMethods是一款由同名公司开发的企业服务总线(ESB)和业务流程管理(BPM)软件,其版本7.1的“MIME-S/MIME Developer’s Guide”提供了深入理解MIME编码、解码以及在Web服务通信中的应用的宝贵资源。 ### MIME与...

Global site tag (gtag.js) - Google Analytics