javaMail的邮件接收

标签: javamail 邮件 接收 | 发表时间:2015-02-08 21:48 | 作者:xsd_旧
出处:http://www.iteye.com

下面是一个邮件接收的工具类,有点长!!!

public class ReciveMail {
 private MimeMessage msg = null;
    private String saveAttchPath = "";
    private StringBuffer bodytext = new StringBuffer();
    private String dateformate = "yy-MM-dd HH:mm";
   
    public ReciveMail(MimeMessage msg){
        this.msg = msg;
        }
    public void setMsg(MimeMessage msg) {
        this.msg = msg;
    }
   
    /**
     * 获取发送邮件者信息
     * @return
     * @throws MessagingException
     */
    public String getFrom() throws MessagingException{
        InternetAddress[] address = (InternetAddress[]) msg.getFrom();
        String from = address[0].getAddress();
        if(from == null){
            from = "";
        }
        String personal = address[0].getPersonal();
        if(personal == null){
            personal = "";
        }
        String fromaddr = personal +"<"+from+">";
        return fromaddr;
    }
   
    /**
     * 获取邮件收件人,抄送,密送的地址和信息。根据所传递的参数不同 "to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址
     * @param type
     * @return
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public String getMailAddress(String type) throws MessagingException, UnsupportedEncodingException{
        String mailaddr = "";
        String addrType = type.toUpperCase();
        InternetAddress[] address = null;
       
        if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){
            if(addrType.equals("TO")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.TO);
            }
            if(addrType.equals("CC")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.CC);
            }
            if(addrType.equals("BCC")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.BCC);
            }       
            if(address != null){
                for(int i=0;i<address.length;i++){
                    String mail = address[i].getAddress();
                    if(mail == null){
                        mail = "";
                    }else{
                        mail = MimeUtility.decodeText(mail);
                    }
                    String personal = address[i].getPersonal();
                    if(personal == null){
                        personal = "";
                    }else{
                        personal = MimeUtility.decodeText(personal);
                    }
                    String compositeto = personal +"<"+mail+">";
                    mailaddr += ","+compositeto;
                }
                mailaddr = mailaddr.substring(1);
            }
        }else{
            throw new RuntimeException("Error email Type!");
        }
        return mailaddr;
    }
   
    /**
     * 获取邮件主题
     * @return
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     */
    public String getSubject() throws UnsupportedEncodingException, MessagingException{
        String subject = "";
        subject = MimeUtility.decodeText(msg.getSubject());
        if(subject == null){
            subject = "";
        }
        return subject;
    }
   
    /**
     * 获取邮件发送日期
     * @return
     * @throws MessagingException
     */
    public String getSendDate() throws MessagingException{
        Date sendDate = msg.getSentDate();
        SimpleDateFormat smd = new SimpleDateFormat(dateformate);
        return smd.format(sendDate);
    }
   
    /**
     * 获取邮件正文内容
     * @return
     */
    public String getBodyText(){
        return bodytext.toString();
    }
   
    /**
     * 解析邮件,将得到的邮件内容保存到一个stringBuffer对象中,
     * 解析邮件 主要根据MimeType的不同执行不同的操作,一步一步的解析
     * @param part
     * @throws MessagingException
     * @throws IOException
     */
    public void getMailContent(Part part) throws MessagingException, IOException{
       
        String contentType = part.getContentType();
        int nameindex = contentType.indexOf("name");
        boolean conname = false;
        if(nameindex != -1){
            conname = true;
        }
        System.out.println("CONTENTTYPE:"+contentType);
        if(part.isMimeType("text/plain")&&!conname){
            bodytext.append((String)part.getContent());
        }else if(part.isMimeType("text/html")&&!conname){
            bodytext.append((String)part.getContent());
        }else if(part.isMimeType("multipart/*")){
            Multipart multipart = (Multipart) part.getContent();
            int count = multipart.getCount();
            for(int i=0;i<count;i++){
                getMailContent(multipart.getBodyPart(i));
            }
        }else if(part.isMimeType("message/rfc822")){
            getMailContent((Part) part.getContent());
        }
       
    }
   
    /**
     * 判断邮件是否需要回执,如需回执返回true,否则返回false
     * @return
     * @throws MessagingException
     */
    public boolean getReplySign() throws MessagingException{
        boolean replySign = false;
        String needreply[] = msg.getHeader("Disposition-Notification-TO");
        if(needreply != null){
            replySign = true;
        }
        return replySign;
    }
   
    /**
     * 获取此邮件的message-id
     * @return
     * @throws MessagingException
     */
    public String getMessageId() throws MessagingException{
        return msg.getMessageID();
    }
   
    /**
     * 判断此邮件是否已读,如果未读则返回false,已读返回true
     * @return
     * @throws MessagingException
     */
    public boolean isNew() throws MessagingException{
        boolean isnew = false;
        Flags flags = ((Message)msg).getFlags();
        Flags.Flag[] flag = flags.getSystemFlags();
        System.out.println("flags's length:"+flag.length);
        for(int i=0;i<flag.length;i++){
            if(flag[i]==Flags.Flag.SEEN){
                isnew = true;
                System.out.println("seen message .......");
                break;
            }
        }
        return isnew;
    }
   
    /**
     * 判断是是否包含附件
     * @param part
     * @return
     * @throws MessagingException
     * @throws IOException
     */
    public boolean isContainAttch(Part part) throws MessagingException, IOException{
        boolean flag = false;
       
        //String contentType = part.getContentType();
        if(part.isMimeType("multipart/*")){
            Multipart multipart = (Multipart) part.getContent();
            int count = multipart.getCount();
            for(int i=0;i<count;i++){
                BodyPart bodypart = multipart.getBodyPart(i);
                String dispostion = bodypart.getDisposition();
                if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
                    flag = true;
                }else if(bodypart.isMimeType("multipart/*")){
                    flag = isContainAttch(bodypart);
                }else{
                    String conType = bodypart.getContentType();
                    if(conType.toLowerCase().indexOf("appliaction")!=-1){
                        flag = true;
                    }
                    if(conType.toLowerCase().indexOf("name")!=-1){
                        flag = true;
                    }
                }
            }
        }else if(part.isMimeType("message/rfc822")){
            flag = isContainAttch((Part) part.getContent());
        }
       
        return flag;
    }
   
    /**
     * 保存附件
     * @param part
     * @throws MessagingException
     * @throws IOException
     */
    public void saveAttchMent(Part part) throws MessagingException, IOException{
        String filename = "";
        if(part.isMimeType("multipart/*")){
            Multipart mp = (Multipart) part.getContent();
            for(int i=0;i<mp.getCount();i++){
                BodyPart mpart = mp.getBodyPart(i);
                String dispostion = mpart.getDisposition();
                if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
                    filename = mpart.getFileName();
                    if(filename.toLowerCase().indexOf("gb2312")!=-1){
                        filename = MimeUtility.decodeText(filename);
                    }
                    saveFile(filename,mpart.getInputStream());
                }else if(mpart.isMimeType("multipart/*")){
                    saveAttchMent(mpart);
                }else{
                    filename = mpart.getFileName();
                    if(filename != null&&(filename.toLowerCase().indexOf("gb2312")!=-1)){
                        filename = MimeUtility.decodeText(filename);
                    }
                    saveFile(filename,mpart.getInputStream());
                }
            }
           
        }else if(part.isMimeType("message/rfc822")){
            saveAttchMent((Part) part.getContent());
        }
    }
    /**
     * 获得保存附件的地址
     * @return
     */
    public String getSaveAttchPath() {
        return saveAttchPath;
    }
    /**
     * 设置保存附件地址
     * @param saveAttchPath
     */
    public void setSaveAttchPath(String saveAttchPath) {
        this.saveAttchPath = saveAttchPath;
    }
    /**
     * 设置日期格式
     * @param dateformate
     */
    public void setDateformate(String dateformate) {
        this.dateformate = dateformate;
    }
    /**
     * 保存文件内容
     * @param filename
     * @param inputStream
     * @throws IOException
     */
    private void saveFile(String filename, InputStream inputStream) throws IOException {
        String osname = System.getProperty("os.name");
        String storedir = getSaveAttchPath();
        String sepatror = "";
        if(osname == null){
            osname = "";
        }
       
        if(osname.toLowerCase().indexOf("win")!=-1){
            sepatror = "//";
            if(storedir==null||"".equals(storedir)){
                storedir = "d://temp";
            }
        }else{
            sepatror = "/";
            storedir = "/temp";
        }
       
        File storefile = new File(storedir+sepatror+filename);
        System.out.println("storefile's path:"+storefile.toString());
       
        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
       
        try {
            bos = new BufferedOutputStream(new FileOutputStream(storefile));
            bis = new BufferedInputStream(inputStream);
            int c;
            while((c= bis.read())!=-1){
                bos.write(c);
                bos.flush();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            bos.close();
            bis.close();
        }
       
    }
   
    public void recive(Part part,int i) throws MessagingException, IOException{
        System.out.println("------------------START-----------------------");
        System.out.println("Message"+i+" subject:" + getSubject());
        System.out.println("Message"+i+" from:" + getFrom());
        System.out.println("Message"+i+" isNew:" + isNew());
        boolean flag = isContainAttch(part);
        System.out.println("Message"+i+" isContainAttch:" +flag);
        System.out.println("Message"+i+" replySign:" + getReplySign());
        getMailContent(part);
        System.out.println("Message"+i+" content:" + getBodyText());
        setSaveAttchPath("c://temp//"+i);
        if(flag){
            saveAttchMent(part);
        }
        System.out.println("------------------END-----------------------");
    }

}

邮件接收与工具类的使用,有好几种邮件接收的写法!:

看了很多网上其他代码,pop3Server的值是pop.mail.163.com,但是试了试不成功,还有 user的值既可以是带有 [email protected]也可以是username。

如果收件邮箱是163邮箱,必须先登陆163邮箱中设置,开启pop3服务。至于别的邮箱暂不知道。

public static void main(String[] args) throws Exception { 
        // 连接pop3服务器的主机名、协议、用户名、密码 
        String pop3Server = "pop.163.com"; 
        String protocol = "pop3"; 
        String user = "username"; 
        String pwd = "password"; 
         
        // 创建一个有具体连接信息的Properties对象 
        Properties props = new Properties(); 
        props.setProperty("mail.store.protocol", protocol);
        props.setProperty("mail.pop3.host", pop3Server); 
         
        // 使用Properties对象获得Session对象 
        Session session = Session.getInstance(props); 
        session.setDebug(true); 
         
        // 利用Session对象获得Store对象,并连接pop3服务器 
        Store store = session.getStore(); 
        store.connect(pop3Server, user, pwd); 
         
        // 获得邮箱内的邮件夹Folder对象,以"只读"打开 
        Folder folder = store.getFolder("inbox"); 
        folder.open(Folder.READ_ONLY); 
         
        // 获得邮件夹Folder内的所有邮件Message对象 
        Message [] messages = folder.getMessages();  
        ReciveMail rm = null;
        for(int i=0;i<
messages.size() ;i++){
            rm = new ReciveMail((MimeMessage) messages[i]);
            rm.recive(messages[i],i);;
        }
         folder.close(false); 
        store.close(); 
    } 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [javamail 邮件 接收] 推荐:

javaMail的邮件接收

- - 编程语言 - ITeye博客
下面是一个邮件接收的工具类,有点长.      * 获取发送邮件者信息.      * 获取邮件收件人,抄送,密送的地址和信息. 根据所传递的参数不同 "to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址.      * 获取邮件主题.      * 获取邮件发送日期.      * 获取邮件正文内容.

hudson 邮件配置

- - ITeye博客
最近在研究使用hudson 进行CI测试. 当构建失败时,自动发送邮件给指定人员. (2)点击“ Manage Hudson”. (3)点击“ Configure System”;. (5)设置job的配置,点击“Configure”进入job的配置页面,勾选E-mail Notification:.

警惕Gmail 钓鱼邮件

- 独钓寒江雪 - 阿禅日记
思想挣扎了很久,博客还是要更新的,不管是哪一个. 在编辑器里打字总能让烦躁的心情平服下来. 这两天我收到了两封来自 [email protected] 的邮件,标题与内容都不一样,带附带的附件都是一个大小为70KB的.doc 文档. 我在Gmail 里用预览查看.doc 附件,发现里面只有一幅不到100px*100px的黑白正方形线框图,我觉得这样的.doc 文件大小不可能有70KB,于是就怀疑这是钓鱼邮件.

Java远程调用邮件服务器,实现邮件发送

- - CSDN博客推荐文章
写这篇文章的背景是公司Android客户端需要实现一个功能,实现类似于密码找回或者用户注册完发送一个邮件给用户的功能,当然这些逻辑客户端只负责请求自己的服务端,自己的服务端再去请求邮件服务器. 邮件服务器使用的Apache的James,Java写的开源的,而且方便调用. 远程调用使用的是Java Mail的API.

邮件服务器垃圾邮件防范术

- - 互联网 - ITeye博客
从互联网诞生之日起,垃圾邮件就相伴相随,尤其是随着网购的普及,垃圾邮件更呈“遍地开花” 蔓延之势,防不胜防的垃圾邮件轻则令人占用邮箱容量浪费用户时间,重则造成财产损失,因此对垃圾邮件的“严防死守”一直是邮件系统服务商的头等大事之一, 也是衡量一款邮件服务器是否足够优秀的指标之一. 我国素来是垃圾邮件的“重灾区”,但近年来这种状况却有所改善,据新华社报道:中国互联网协 会8月25日在京通报,我国互联网用户收到垃圾邮件占其邮件总量比例从2006年初的63.97%下降到2014年一季度的38.2%;中国在全球所占垃 圾邮件比例排名由2006年的第二下降至第五位.

世界上最小的GPS接收机

- zffl - 译言-电脑/网络/数码科技
译者 cyber-china. 整个GPS系统,包括电池和供下载数据的无线发射机,比硬币还小. 有了足够小巧的GPS传感器,就可以跟踪定位任何事物,无论是丢失的钥匙还是跑失的爱犬. 因为当今世界最小的 GPS接收机比1便士的硬币还小,重量近0.3克. 那么,加上其他电子器件,使之成为一个有用系统,并遥控下载记录的数据,它会变成多大呢.

Struts2中Action自动接收参数

- - CSDN博客架构设计推荐文章
Struts2中Action接收参数的方法主要有以下三种:. 1.使用Action的属性接收参数:(通过属性驱动式).     a.定义:在Action类中定义属性,创建get和set方法;.     b.接收:通过属性接收参数,如:userName;.     c.发送:使用属性名传递参数,如:user1!add?userName=Magci;.

Spark Streaming 自定义接收器

- - zzm
Spark Streaming可以从任意数据源接受流数据,而不仅仅是那些内置支持的数据源(如Flume、kafka等). 这就要求开发人员实现一个接收器(recevier),用于接收来自有关数据源的数据. 本篇手册以一个自定义的接收器(recevier)实现和其在spark streaming中的应为为主线进行讲解.

英文电子邮件必备金句

- 阿德 - 佳人
英文电子邮件必备金句,让你的E-mail更专业一些. 1.Initiate a meeting 发起会议. 今天下午我建议我们就A项目的发展计划开会讨论一下. 我建议我们今晚九点半和Brown小聚一下,你和Ben有没有空?. 十月三十号(周四),老时间,开会. 下周一盐湖城时区下午五点半开会. 我想跟你电话讨论下报告进展和XXX项目的情况.

让电子邮件更给力

- mgo - Heidi格物志
前些日子,整理过一些开会的技巧,(1),(2),(3),但是后来发现有效的会议并不能解决大部分的沟通问题,相反,电子邮件才是那低调但是着实影响着推动和沟通效率的罪魁祸首. 但是,电子邮件却往往不可或缺,即使我们有大量的会议,面对面工作,人手一部电话,电子邮件依然非常重要. 这是因为,电子邮件能 够将事情书面化,沉淀声音,落实决策,能够不受人在不在场影响,能够更加广泛知会信息、征询建议.