2015-06-01 156 views
0

我找到了一個不錯的代碼從我的收件箱中的郵件服務器讀取電子郵件,代碼工作得很好,但有幾個問題:電子郵件有附件時閱讀電子郵件正文問題?

  1. 我需要捕捉每封電子郵件的郵件正文,但是當電子郵件有一些附件,我收到像這樣的字符串[email protected][email protected],而不是正文消息。如果電子郵件只是純文本並且沒有附件,它就可以正常工作。似乎我不是唯一有這個問題的人,我一直在網上閱讀,但無法找到解決方案。

  2. 我想忽略大小超過4 MB時的附件。

下面是班級,我將不勝感激任何評論。重要的是要說我是java的新手程序員。提前致謝 !

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 
import javax.mail.Address; 
import javax.mail.BodyPart; 
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.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Store; 
import javax.mail.Flags.Flag; 
import javax.mail.search.FlagTerm; 

public class ReadMailSample { 
    Properties properties = null; 
    private Session session = null; 
    private Store store = null; 
    private Folder inbox = null; 
    private String userName; 
    private String password; 
    String downloadDirectory = "D:/Attachment/"; 

    public ReadMailSample() { 
     userName = "[email protected]";// provide user name 
     password = "mypassword";// provide password 
    } 

    public void readMails() { 
     properties = new Properties(); 
     properties.setProperty("mail.host", "imap.secureserver.net"); 
     properties.setProperty("mail.port", "110"); 
     properties.setProperty("mail.transport.protocol", "imap"); 
     session = Session.getInstance(properties, 
       new javax.mail.Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
         return new PasswordAuthentication(userName, password); 
        } 
       }); 
     try { 
      store = session.getStore("imap"); 
      store.connect(); 
      inbox = store.getFolder("INBOX"); 
      inbox.open(Folder.READ_WRITE); 
      Message messages[] = inbox.search(new FlagTerm(
        new Flags(Flag.SEEN), false)); 
      ; 
      System.out.println("Number of mails = " + messages.length); 
      for (int i = 0; i < messages.length; i++) { 
       Message message = messages[i]; 
       Address[] from = message.getFrom(); 
       System.out.println("--> ** E-mail No. "+ i + " **"); 
       System.out.println("-------------------------------"); 
       System.out.println("Date : " + message.getSentDate()); 
       System.out.println("From : " + from[0]); 
       System.out.println("Subject: " + message.getSubject()); 
       System.out.println("Content :"); 
       processMessageBody(message); 
       System.out.println("--------------------------------"); 

      } 
      inbox.close(true); 
      store.close(); 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void processMessageBody(Message message) { 
     try { 
      Object content = message.getContent(); 
      // check for string 
      // then check for multipart 
      if (content instanceof String) { 
       System.out.println(content); 
      } else if (content instanceof Multipart) { 
       System.out.println(content); 
       Multipart multiPart = (Multipart) content; 
       procesMultiPart(multiPart); 
      } else if (content instanceof InputStream) { 
       InputStream inStream = (InputStream) content; 
       int ch; 
       while ((ch = inStream.read()) != -1) { 
        System.out.write(ch); 
      } 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void procesMultiPart(Multipart content) { 

     try { 

      for (int i = 0; i < content.getCount(); i++) { 
       BodyPart bodyPart = content.getBodyPart(i); 
       Object o; 

       o = bodyPart.getContent(); 
       if (o instanceof String) { 
        System.out.println("Text = " + o); 
       } else if (null != bodyPart.getDisposition() 
         && bodyPart.getDisposition().equalsIgnoreCase(
           Part.ATTACHMENT)) { 
        String fileName = bodyPart.getFileName(); 
        System.out.println("Text = " + o); 
        System.out.println("fileName = " + fileName); 
        InputStream inStream = bodyPart.getInputStream(); 
        FileOutputStream outStream = new FileOutputStream(new File(
          downloadDirectory + fileName)); 
        byte[] tempBuffer = new byte[4096];// 4 KB 
        int numRead; 
        while ((numRead = inStream.read(tempBuffer)) != -1) { 
         outStream.write(tempBuffer); 
        } 
        inStream.close(); 
        outStream.close(); 
       } 
       // else? 

      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void main(String[] args) { 
     ReadMailSample sample = new ReadMailSample(); 
     sample.readMails(); 
    } 
} 

回答