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

MIME编码

阅读更多

1 .依赖库

 

mail.jar

 

2. 代码



import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.mail.internet.ParseException;
import javax.mail.internet.PreencodedMimeBodyPart;

import org.apache.log4j.Logger;

public class MimeEncoder {
   
    private Logger logger =  Logger.getLogger(MimeEncoder.class);
   
    private String encoding = "UTF-8";
    private String transferEncoding = "base64";
    private String subtype = "mixed";
    private MimeBodyPart txtContent;
    private MimeBodyPart htmlContent;
    private List<MimeBodyPart> inlineList = new ArrayList<MimeBodyPart>(); //内嵌文件
    private List<MimeBodyPart> attachmentList = new ArrayList<MimeBodyPart>(); //附件
    private Map<String, String> headers = new LinkedHashMap<String, String>();
   
    public MimeEncoder(){
       
    }
   
    public MimeEncoder(String encoding){
        this.encoding = encoding;
    }
   
    /**
     * 构造MIME编码器
     * @param encoding String MIME正文默认字符编码
     * @param transferEncoding MIME段体传输编码("base64", "quoted-printable", "7bit", "8bit", "binary", "uuencode")
     */
    public MimeEncoder(String encoding, String transferEncoding){
        this.encoding = encoding;
        this.transferEncoding = transferEncoding;
    }
   
    public void setSubType(String subtype){
        this.subtype = subtype;
    }
   
    public void setHeader(String name, String value){
        headers.put(name, value);
    }
   
    private String readFile(File f)throws IOException, MessagingException{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
        String s = encodeInputStream(bis);
        bis.close();
        return s;
    }
   
    private String contentEnode(String contentText, String contentType)throws IOException, MessagingException{
        String contentEncode = encoding;
        if(contentType != null){
            ContentType ct = new ContentType(contentType);
            if(ct.getParameter("charset") != null){
                contentEncode = ct.getParameter("charset");
            }
        }
        return contentEnode(contentText.getBytes(contentEncode));
    }
    private String contentEnode(byte[] content)throws IOException, MessagingException{
        ByteArrayInputStream bais = new ByteArrayInputStream(content);
        String s = encodeInputStream(bais);
        bais.close();
        return s;
    }
    private String encodeInputStream(InputStream is)throws IOException, MessagingException{
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream os = MimeUtility.encode(baos, transferEncoding);
        int data = -1;
        while((data = is.read()) != -1){
            os.write(data);
        }
        String s = baos.toString(encoding);
        os.close();
        baos.close();
        return s;
    }
   
    public void setTxtContent(String content)throws ParseException{
        ContentType ct = new ContentType("text/plain");
        ct.setParameter("charset", encoding);
        setTxtContent(content, ct.toString());
    }
    public void setTxtContent(String content, String contentType){
        PreencodedMimeBodyPart txtContentPart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            txtContentPart.setText(contentEnode(content, contentType));
            if(contentType != null){
                txtContentPart.setHeader("Content-Type", contentType);
            }
            this.txtContent = txtContentPart;
        }  catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
    public void setHtmlContent(String content)throws ParseException{
        ContentType ct = new ContentType("text/html");
        ct.setParameter("charset", encoding);
        setHtmlContent(content, ct.toString());
    }
    public void setHtmlContent(String content, String contentType){
        PreencodedMimeBodyPart htmlContentPart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            htmlContentPart.setText(contentEnode(content, contentType));
            if(contentType != null){
                htmlContentPart.setHeader("Content-Type", contentType);
            }
            this.htmlContent = htmlContentPart;
        }  catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
   
    public void addAttachment(File f, String contentType){
        PreencodedMimeBodyPart attachmentPart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            attachmentPart.setText(readFile(f));
            attachmentPart.setDisposition(Part.ATTACHMENT);
            attachmentPart.setFileName(nameEncode(f.getName()));
            if(contentType != null){
                attachmentPart.setHeader("Content-Type", contentType);
            }
            attachmentList.add(attachmentPart);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
    public void addAttachment(String fileName, String contentText, String contentType){
        PreencodedMimeBodyPart attachmentPart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            attachmentPart.setText(contentEnode(contentText, contentType));
            attachmentPart.setDisposition(Part.ATTACHMENT);
            attachmentPart.setFileName(fileName);
            if(contentType != null){
                attachmentPart.setHeader("Content-Type", contentType);
            }
            attachmentList.add(attachmentPart);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            e.printStackTrace();
        }
    }
    public void addAttachment(String fileName, byte[] data, String contentType){
        PreencodedMimeBodyPart attachmentPart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            attachmentPart.setText(contentEnode(data));
            attachmentPart.setDisposition(Part.ATTACHMENT);
            attachmentPart.setFileName(fileName);
            if(contentType != null){
                attachmentPart.setHeader("Content-Type", contentType);
            }
            attachmentList.add(attachmentPart);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
            e.printStackTrace();
        }
    }
   
    public void addInline(File f, String contentType){
        addInline(f.getName(), f, contentType);
    }
    public void addInline(String name, File f, String contentType){
        PreencodedMimeBodyPart inlinePart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            inlinePart.setText(readFile(f));
            inlinePart.setDisposition(Part.INLINE);
            inlinePart.setContentID(nameEncode(name));
            if(contentType != null){
                inlinePart.setHeader("Content-Type", contentType);
            }
            inlineList.add(inlinePart);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
   
    public void addInline(String name, String contentText, String contentType){
        PreencodedMimeBodyPart inlinePart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            inlinePart.setText(contentEnode(contentText, contentType));
            inlinePart.setDisposition(Part.INLINE);
            inlinePart.setContentID(nameEncode(name));
            if(contentType != null){
                inlinePart.setHeader("Content-Type", contentType);
            }
            inlineList.add(inlinePart);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
    public void addInline(String name, byte[] data, String contentType){
        PreencodedMimeBodyPart inlinePart = new PreencodedMimeBodyPart(transferEncoding);
        try {
            inlinePart.setText(contentEnode(data));
            inlinePart.setDisposition(Part.INLINE);
            inlinePart.setContentID(nameEncode(name));
            if(contentType != null){
                inlinePart.setHeader("Content-Type", contentType);
            }
            inlineList.add(inlinePart);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
   
    protected String nameEncode(String s)throws UnsupportedEncodingException{
        return MimeUtility.encodeText(s, encoding, "B");
    }
    public static String nameEncode(String s, String encoding)throws UnsupportedEncodingException{
        return MimeUtility.encodeText(s, encoding, "B");
    }
   
    public String encode(){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        encodeToOutputStream(baos);
        try {
            return baos.toString("iso-8859-1");
        } catch (UnsupportedEncodingException e) {
            logger.warn(e.getMessage(), e);
        }
        return null;
    }
   
    public void encodeToOutputStream(OutputStream os){
        try {
            MimeMultipart multipart = new MimeMultipart(subtype);
           
            if((txtContent != null) && (htmlContent != null)){
                MimeMultipart contentPart = new MimeMultipart("alternative");
                contentPart.addBodyPart(txtContent);
                contentPart.addBodyPart(htmlContent);
                MimeBodyPart part = new MimeBodyPart();
                part.setContent(contentPart);
                multipart.addBodyPart(part);
            }else if(txtContent != null){
                multipart.addBodyPart(txtContent);
            }else if(htmlContent != null){
                multipart.addBodyPart(htmlContent);
            }
           
            for(MimeBodyPart attachment : attachmentList){
                multipart.addBodyPart(attachment);
            }
       
            for(MimeBodyPart inline : inlineList){
                multipart.addBodyPart(inline);
            }
           
            MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
            for(String key : headers.keySet()){
                message.setHeader(key, headers.get(key));
            }
            message.setContent(multipart);
            message.writeTo(os);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }
    }
   
    public void encodeToFile(String f){
        BufferedOutputStream bos = null;
        try {
            bos = new BufferedOutputStream(new FileOutputStream(f));
            encodeToOutputStream(bos);
        } catch (Exception e) {
            logger.warn(e.getMessage(), e);
        }finally{
            if(bos != null){
                try {
                    bos.close();
                } catch (IOException e) {
                    logger.warn(e.getMessage(), e);
                }
            }
        }
    }
   
   

}

 

 

3. 测试

 

 

public static void main(String args[])throws Exception{
        MimeEncoder encoder = new MimeEncoder("UTF-8");
        encoder.setTxtContent("文本内容");
        encoder.setHtmlContent("<b>html内容</b><img src='cid:f1'/>");
        encoder.addInline("f1", new File("d:/test/内嵌文件.gif"), "image/gif");
        encoder.addAttachment(new File("d:/test/附件.txt"), "text/plain");
        encoder.encodeToFile("d:/test/mime.eml");
    }

 

执行完测试代码后会生成一个mime.eml文件, 该文件可以使用记事本等文件编辑器打开,也可以使用FoxMail等邮件工具打开。

  • 大小: 1.9 KB
分享到:
评论

相关推荐

    《运用设计模式设计mime编码类》

    《运用设计模式设计MIME编码类》是一篇关于在编程中如何使用设计模式来构建一个MIME(Multipurpose Internet Mail Extensions)编码类的文章。MIME是互联网标准,用于定义非ASCII字符的邮件传输和格式,它扩展了电子...

    mime64编码修正

    MIME64是MIME编码的一种,主要用于将二进制数据转换为ASCII文本,以便在电子邮件或其他网络协议中传输。在某些情况下,特别是涉及到特定软件如Foxmail时,可能会遇到一些编码问题,比如对某些小于0x7f的ASCII字符...

    MIME的编码介绍(由网上资料和实践经验整合)

    ### MIME编码介绍 #### 一、MIME:Multipurpose Internet Mail Extensions MIME,全称为Multipurpose Internet Mail Extensions,即“多用途互联网邮件扩展”,是一种用于处理非纯文本信息的标准编码方式。它允许...

    Go mime包资源获取

    9. **编码MIME编码**:虽然Go的`mime`包本身不提供MIME编码,但`mime/multipart`和`mime/quotedprintable`包提供了编码功能,可以根据需要进行使用。 通过以上知识点,我们可以看出Go的`mime`包在处理网络数据、...

    MIME加密解密源代码VB版

    1. MIME编码:MIME定义了多种编码方式,如Base64、Quoted-Printable和Binary。Base64常用于将二进制数据转换为ASCII文本,以便在网络上传输;Quoted-Printable则用于保持文本格式,避免特殊字符被误解;Binary则用于...

    .NET POP3 MIME Client

    .NET POP3 MIME Client 是一个基于.NET框架的邮件客户端开发库,它主要用于实现POP3协议来检索电子邮件,并且处理MIME编码的邮件内容。这个库可能是由一个国外的开发者或团队创建,供其他开发者在自己的应用程序中...

    MIME_Developer

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

    php 电子邮件反编码调用类

    MIME编码通常用于在电子邮件中传输非ASCII字符或特殊格式的文本,例如中文、日文等语言或带有特殊符号的邮件主题和正文。 #### 核心知识点分析: 1. **MIME编码:**MIME是一种标准协议,允许通过电子邮件发送二...

    一个PHP邮件mime解析器

    描述中提到的“一个PHP邮件mime解析器”进一步强调了这是一个用PHP编写的工具,专注于处理MIME编码的邮件。这暗示了该解析器可能具有以下特点: 1. **解析MIME头**:能解析并解码邮件头中的字段,如编码的地址、...

    MIME

    通过这些文件,开发者可以学习如何在自己的应用程序中实现MIME编码和解码,这对于创建跨平台的邮件客户端、Web服务或其他需要处理复杂数据格式的项目来说非常有用。例如,你可以使用MIME来发送带有附件的电子邮件,...

    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...

    Shift JIS编码表

    例如,在电子邮件和网页中,可能会使用MIME编码的"iso-2022-jp"来表示Shift JIS,或者在HTML文档中使用`&lt;meta&gt;`标签指定字符集为Shift JIS。 总的来说,Shift JIS编码作为日文处理的重要工具,虽然有其独特的优势,...

    VC++ 基于MIME的邮件附件发送

    总的来说,“VC++ 基于MIME的邮件附件发送”涉及网络编程、SMTP协议、MIME编码和Windows API的使用。理解这些概念并熟练运用,开发者可以构建出能够发送带附件的电子邮件的应用程序,这对于自动化报告、通知服务和...

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

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

    将网页保存成mht文件的代码

    MHT全称是MIME HTML,它是一种Web档案格式,使用MIME编码将网页的所有元素打包在一起。这种格式方便离线查看或传输网页内容,因为它不需要互联网连接来重新加载图片和其他外部资源。 在编程中,实现将网页保存为MHT...

    彩信的编码解码(代码)

    2. **MIME编码**:多媒体内容被封装在一个MIME(Multipurpose Internet Mail Extensions)消息中,MIME是一种标准,用于定义非ASCII字符的电子邮件内容。它将不同的媒体类型(如文本、图像、音频等)用特定的头部...

    Mimemai

    MIME编码允许邮件包含文本、图像、音频、视频等多种类型的数据,使得电子邮件可以传递更丰富的信息。在PHP中,处理MIME编码邮件的库通常包括创建、解析和操作MIME格式的工具。 "Mimemai"是一个专门针对此功能的PHP...

    邮件转吗代码

    这里,`$subject`变量包含了邮件的主题内容,通过调用`base64_encode()`函数将其转换为Base64编码格式,然后使用特定的MIME编码语法进行封装,最终形成符合MIME标准的编码字符串。 ### 实现细节 1. **编码选择**:...

    vc解析mail文件

    3. **处理MIME编码**:邮件正文和附件可能被MIME编码,`MimeCode`类的功能就在这里发挥作用,将编码内容解码成可读格式。 4. **处理MIME类型**:`MimeType`类可能用于识别和处理不同类型的MIME实体,如文本、图像、...

Global site tag (gtag.js) - Google Analytics