`
i2534
  • 浏览: 182834 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javamail收取信件

    博客分类:
  • util
阅读更多
主要是为了解决某些邮件客户端发送邮件时把繁体也编码为gb2312,导致乱码出现.
懒得存数据库了,就写文件了.
另没有解决multipart中只取text/html或者text/plain的问题.
长时间潜水,第一次在je发表东西,自己纪念下.
package com.hcycom.lan.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Folder;
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.Message.RecipientType;
import javax.mail.event.StoreEvent;
import javax.mail.event.StoreListener;
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 com.sun.mail.pop3.POP3Folder;

public class ShowMail {

    private static final String D_MAIL = "D:/mail/";
    private static final String BR = "\n";

    public static String replaceGB2312ToGBK(String source) {
        if (source == null) {
            return null;
        }
        if (source.toLowerCase().indexOf("?gb2312?") != -1) {
            source = source.replaceAll("\\?[gG][bB]2312\\?", "?gbk?");
        }

        return source;

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new ShowMail().show();

    }

    private void show() {
        Properties prop = System.getProperties();
        Session session = Session.getDefaultInstance(prop);

        try {
            Store store = session.getStore("pop3");
            store.addStoreListener(new StoreListener() {

                public void notification(StoreEvent e) {
                    switch (e.getMessageType()) {
                    case StoreEvent.ALERT:
                        System.out.println("alert : " + e.getMessage());
                        break;
                    case StoreEvent.NOTICE:
                        System.out.println("notice : " + e.getMessage());
                        break;
                    }

                }

            });
            store.connect("pop.163.com", "i2534", "password");
            if (store.isConnected()) {
                POP3Folder inbox = (POP3Folder) store.getFolder("INBOX");
                if (inbox.exists()) {
                    inbox.open(Folder.READ_ONLY);
                    File dir = new File(D_MAIL);
                    if (!dir.exists()) {
                        dir.mkdirs();
                    }
                    File uids = new File(dir, "uids");
                    HashSet set = new HashSet();
                    HashSet newUids = new HashSet();
                    if (uids.exists()) {
                        BufferedReader br = new BufferedReader(new FileReader(
                                uids));
                        String line = null;
                        while ((line = br.readLine()) != null) {
                            set.add(line);
                        }
                        br.close();
                    }
                    int nCount = inbox.getMessageCount();
                    System.out.println("Inbox contains " + nCount
                            + " messages.");
                    for (int i = 1; i <= nCount; i++) {
                        System.out.println("now accept " + i);
                        MimeMessage msg = (MimeMessage) inbox.getMessage(i);

                        String uid = inbox.getUID(msg);
                        if (set.contains(uid)) {
                            System.out
                                    .println("this message is already exists.skip to next.");
                            continue;
                        }

                        File mail = File.createTempFile(new SimpleDateFormat(
                                "yyyyMMdd_").format(new Date()), ".mail", dir);
                        FileWriter fw = new FileWriter(mail, true);

                        newUids.add(uid);
                        fw.write("UID : " + uid);
                        fw.write(BR);

                        String subject = msg.getHeader("Subject", null);
                        fw
                                .write("Subject : "
                                        + MimeUtility
                                                .decodeText(replaceGB2312ToGBK(subject)));
                        fw.write(BR);

                        fw.write("Send Date : "
                                + new SimpleDateFormat("yyyy-MM-dd HH:mm")
                                        .format(msg.getSentDate()));
                        fw.write(BR);

                        fw.write("From : ");
                        dumpAddresses(msg.getFrom(), fw);
                        fw.write(BR);

                        fw.write("To : ");
                        dumpAddresses(msg.getRecipients(RecipientType.TO), fw);
                        fw.write(BR);

                        fw.write("CC : ");
                        dumpAddresses(msg.getRecipients(RecipientType.CC), fw);
                        fw.write(BR);

                        fw.write("Content type : " + msg.getContentType());
                        fw.write(BR);

                        parts(msg, fw);

                        fw.flush();
                        fw.close();

                        System.out.println("accept over.");
                    }

                    if (!newUids.isEmpty()) {
                        FileWriter fw = new FileWriter(uids, true);
                        for (String s : newUids) {
                            fw.write(s);
                            fw.write(BR);
                        }
                        fw.flush();
                        fw.close();
                    }
                }

                inbox.close(false);

            }

            store.close();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void dumpAddresses(Address[] addresses, FileWriter fw)
            throws UnsupportedEncodingException, IOException {
        if (addresses == null || fw == null) {
            return;
        }
        for (Address address : addresses) {
            fw.write(MimeUtility.decodeText(replaceGB2312ToGBK(address
                    .toString())));
            fw.write(";");
        }
    }

    private static void parts(Part part, FileWriter fw) {
        if (part == null || fw == null) {
            return;
        }
        try {
            Object content = part.getContent();
            if (content instanceof Multipart) {
                MimeMultipart mmp = (MimeMultipart) content;
                for (int index = 0; index < mmp.getCount(); index++) {
                    parts(mmp.getBodyPart(index), fw);
                }
            } else if (content instanceof InputStream) {
                MimeBodyPart mbp = (MimeBodyPart) part;
                String contentType = mbp.getContentType();
                String name = getFileName(contentType);
                fw.write("File name : " + name);
                String cid = null;
                if ((cid = mbp.getContentID()) != null) {
                    fw.write(" (cid : " + cid + ")");
                }
                String disposition = null;
                if ((disposition = mbp.getDisposition()) != null) {
                    fw.write(" (disposition : " + disposition + ")");
                }
                fw.write(BR);
                File file = new File(D_MAIL + name);
                FileOutputStream fos = new FileOutputStream(file);
                InputStream is = (InputStream) content;
                int i = -1;
                while ((i = is.read()) != -1) {
                    fos.write(i);
                }
                fos.flush();
                fos.close();
            } else if (content instanceof String) {
                fw.write("----------- part begin -------------");
                fw.write(BR);
                if (part instanceof BodyPart) {
                    MimeBodyPart mbp = (MimeBodyPart) part;
                    String contentType = mbp.getContentType();
                    String language = getCharset(contentType);

                    String encoding = mbp.getEncoding();

                    fw.write("Content type : " + contentType);
                    fw.write(BR);
                    if (encoding != null) {
                        fw.write("Encoding : " + encoding);
                        fw.write(BR);
                    }

                    if (mbp.getRawInputStream() != null && encoding != null) {
                        InputStream is = MimeUtility.decode(mbp
                                .getRawInputStream(), encoding);
                        InputStreamReader isr = new InputStreamReader(is,
                                language);
                        BufferedReader br = new BufferedReader(isr);
                        String line = null;
                        StringBuilder sb = new StringBuilder();
                        while ((line = br.readLine()) != null) {
                            sb.append(line).append(BR);
                        }
                        fw.write(sb.toString());
                        fw.write(BR);
                    }
                } else {
                    fw.write((String) content);
                    fw.write(BR);
                }
                fw.write("----------- part end -------------");
                fw.write(BR);
            }
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String getCharset(String contentType) {
        String language = null;
        try {
            ContentType ct = new ContentType(contentType);
            language = ct.getParameter("charset");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (language == null) {
            language = MimeUtility.getDefaultJavaCharset();
        }
        if (language.equalsIgnoreCase("gb2312")) {
            language = "gbk";
        }
        return language;
    }

    private static String getFileName(String contentType) {
        String name = null;
        try {
            ContentType ct = new ContentType(contentType);
            name = ct.getParameter("name");
        } catch (ParseException e1) {
            e1.printStackTrace();
        }
        if (name == null) {
            name = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
        }
        try {
            name = MimeUtility.decodeText(replaceGB2312ToGBK(name));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return name;
    }
}



分享到:
评论

相关推荐

    怎么用JavaMail收取邮件

    在本文中,我们将深入探讨如何使用 JavaMail 收取邮件,包括了解 POP3 和 IMAP 协议以及如何通过 JavaMail API 实现邮件的接收。 首先,我们需要知道发送邮件通常使用 SMTP(简单邮件传输协议),而接收邮件则涉及...

    javamail收取邮件(包括附件)

    下面我们将详细探讨如何使用JavaMail API实现邮件的收取,特别是如何通过POP3和IMAP协议获取邮件信息。 首先,确保你的项目中已经引入了JavaMail相关的依赖,如果你使用的是Maven,可以在pom.xml文件中添加以下依赖...

    javamail 发送收取邮件

    根据提供的文件信息,我们可以深入探讨如何使用JavaMail API来发送和接收邮件,特别是通过QQ邮箱服务来进行操作。本文将详细解析文件中提到的关键步骤,并补充更多实用的信息。 ### JavaMail API简介 JavaMail API...

    javamail(带界面的javamail)

    JavaMail 是一个强大的开源库,用于在Java应用程序中实现电子邮件的发送和接收功能。它提供了丰富的API,使得开发者能够方便地处理SMTP、POP3、IMAP等邮件协议,支持多种邮件格式,包括文本、HTML以及带有附件的邮件...

    javamail通过imap协议收取邮件(Exchange2007)

    在JavaMail中使用IMAP协议来收取Exchange 2007中的邮件,首先需要理解以下几个关键概念: 1. **JavaMail API**: JavaMail API提供了一系列的类和接口,如`Session`、`Store`、`Folder`和`Message`,它们是处理邮件...

    使用javaMail发邮件及收取邮箱未读邮件并标记为已读

    JavaMail 是一个强大的 Java 库,它允许开发者在应用程序中实现电子邮件的发送和接收功能。这个库支持多种邮件协议,如 SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)和 IMAP(因特网消息访问协议)用于...

    JavaMail收发Gmail邮件

    ### JavaMail收发Gmail邮件知识点详解 #### 一、JavaMail简介 JavaMail API是Java平台中的一个标准扩展库,用于发送、接收以及管理电子邮件。它提供了丰富的接口来实现邮件的各种操作,如构建复杂的MIME消息、处理...

    javamail的jar包:javamail-1.6

    JavaMail 是一个开源库,用于在Java应用程序中处理电子邮件。这个库提供了丰富的API,使得开发者可以方便地执行发送、接收、读取和管理邮件的任务。`javamail-1.6`是JavaMail的一个版本,它包含了从早期版本中继承的...

    JavaMail+JAF+JavaMail_API+JavaMail_API详解

    JavaMail 是一个开源的Java库,它为Java程序员提供了处理电子邮件的能力。这个库不仅支持SMTP、POP3和IMAP协议,还支持其他的邮件系统协议,如NNTP和EWS。JavaMail API是JavaMail库的核心部分,它提供了一系列的接口...

    javamail附件从流中获取

    JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。它提供了丰富的API,使得开发者可以方便地处理复杂的邮件操作,包括添加附件、设置HTML内容等。在"javamail附件从流中获取"这个主题中,我们将深入...

    javamail实现对邮件的发送和收取(一)

    javamail所需要的两个jar包。mail.jar,activation.jar 博文链接:https://javeye.iteye.com/blog/153827

    javamail.jar,javamail资源包

    它提供了读取和管理邮件存储的能力,如收取新的邮件、删除已读邮件等。主要的实现有`POP3Store`和`IMAPStore`,分别对应POP3和IMAP协议。 4. **Transport**: 负责将邮件发送到指定的邮件服务器。通过`javax.mail....

    JavaMail-1.5 API

    JavaMail API是Java平台上用于发送和接收电子邮件的一个标准扩展库。它并不是Java标准库的一部分,而是Java企业版(J2EE)中的一部分。JavaMail提供了一系列用于处理电子邮件的类和接口,允许开发者在Java应用程序中...

    javamail 所有jar包

    JavaMail 是一个开源的 Java API,它为开发者提供了在 Java 应用程序中发送和接收电子邮件的功能。这个API包括了多种协议的支持,如SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)。在...

    javaMail API 跟 javaMail.jar包

    JavaMail API是Java平台上用于处理电子邮件的一套标准API,它为开发者提供了丰富的接口和类,以便于发送、接收和管理电子邮件。JavaMail API是Java EE的一部分,但也可以在Java SE环境中使用。`javaMail.jar`是...

    JavaMail相关jar包

    JavaMail是Java编程语言中用于处理电子邮件的API,它提供了丰富的功能,允许开发人员发送、接收和管理电子邮件。本篇文章将深入探讨JavaMail的核心概念、关键组件以及如何使用这两个特定的jar包——`jaf-1_1_1.zip`...

    JavaMail_Doc

    javaMail javaMail javaMail javaMail javaMail javaMail javaMail

    JavaMail 1.6.0 Final Release

    JavaMail 是一个开源的 Java API,它为开发者提供了在 Java 应用程序中发送和接收电子邮件的能力。这个“JavaMail 1.6.0 Final Release”是 JavaMail 的一个重要版本,它包含了对 SMTP(简单邮件传输协议)、IMAP...

    JavaMail完整JAR包

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中处理电子邮件。这个完整JAR包包含了所有必要的组件,使得开发者能够方便地实现发送、接收、读取以及管理电子邮件。以下是JavaMail的一些关键知识点: 1. **...

    JavaMail邮件收发实例_JavaMail_API

    JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API JavaMail邮件收发实例_JavaMail_API

Global site tag (gtag.js) - Google Analytics