2013-02-28 5 views
0

У меня проблемы с чтением писем из gmail (pop3) с помощью javamail. У меня есть код, который отлично звучит, если почта была отправлена ​​из Thnderbird от ubuntu. Как бы то ни было, если почта была первоначально отправлена ​​с mac, она терпит неудачу.Использование чтения JavaMail из gmail issue

Это код, который я HAM с помощью:

private static final String UNKNOWN_BRAND_PATH = "UNKNOWN"; 
public static final String FOLDER_NAME = "INBOX"; 

private static Logger LOG = org.slf4j.LoggerFactory.getLogger(LzMailRecieverService.class); 

@Value("${lz.mail.address}") 
private String lzMailUserName; 

@Value("${lz.mail.password}") 
private String lzMailPassword; 

@Value("${lz.mail.tmp.folder}") 
private String lzMailTmpFolder; 

public Store connect() throws Exception { 

    String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; 

    Properties pop3Props = new Properties(); 

    pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY); 
    pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false"); 
    pop3Props.setProperty("mail.pop3.port", "995"); 
    pop3Props.setProperty("mail.pop3.socketFactory.port", "995"); 

    URLName url = new URLName("pop3", "pop.gmail.com", 995, "", lzMailUserName, lzMailPassword); 

    Session session = Session.getInstance(pop3Props, null); 
    Store store = new POP3SSLStore(session, url); 
    store.connect(); 
    return store; 
} 

public Folder openFolder(Store store) throws MessagingException { 
    Folder folder = store.getDefaultFolder(); 
    folder = folder.getFolder(FOLDER_NAME); 
    folder.open(Folder.READ_ONLY); 
    return folder; 
} 

public List<MailDetails> readAttachement(Folder folder) throws IOException, MessagingException { 
    Message[] messages = folder.getMessages(); 
    List<MailDetails> mailDetails = new ArrayList<MailDetails>(); 
    for (Message message : messages) { 
     logMailDetails(message); 
     if (message.getContent() instanceof Multipart) { 
      Multipart multipart = (Multipart) message.getContent(); 
      for (int i = 0; i < multipart.getCount(); i++) { 
       BodyPart bodyPart = multipart.getBodyPart(i); 
       if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) { 

        continue; // dealing with attachments only 
       } 
       InputStream is = bodyPart.getInputStream(); 
       String uid = getUid(message); 
       String to = getTo(message); 
       String from = getFrom(message); 
       File d = new File(lzMailTmpFolder + File.separator + uid); 
       if (d.exists() == false) { 
        d.mkdir(); 
       } 
       File f = new File(d, new DateTime().getMillis() + "-" + bodyPart.getFileName()); 
       FileOutputStream fos = new FileOutputStream(f); 
       IOUtils.copy(is, fos); 
       MailDetails md = new MailDetails(to, from, f, uid); 
       mailDetails.add(md); 
      } 
     } 
     else { 
      LOG.warn("Message conteant is not Multipart " + message.getContentType() + " skipping ..."); 
     } 
    } 
    return mailDetails; 
} 

private String getFrom(Message message) throws MessagingException { 
    Address[] froms = message.getFrom(); 
    return froms[0].toString(); 
} 

private String getTo(Message message) throws MessagingException { 
    Address[] tos = message.getAllRecipients(); 
    return tos[0].toString(); 
} 

public void logMailDetails(Message m) throws MessagingException { 
    Address[] f = m.getFrom(); 
    if (f != null) { 
     for (int j = 0; j < f.length; j++) 
      LOG.debug("FROM: " + f[j].toString()); 
    } 

    Address[] r = m.getRecipients(Message.RecipientType.TO); 
    if (r != null) { 
     for (int j = 0; j < r.length; j++) { 
      LOG.debug("TO: " + r[j].toString()); 
     } 
    } 
    LOG.debug("SUBJECT: " + m.getSubject()); 
    Date d = m.getSentDate(); 
    LOG.debug("SendDate: " + d); 
} 

private String getUid(Message m) throws MessagingException { 
    try { 
     Address[] tos = m.getAllRecipients(); 
     String to = tos[0].toString(); 
     to = to.split("@")[0]; 
     String[] parts = to.split("\\+"); 
     return parts[parts.length - 1]; 
    } 
    catch (Exception e) { 
     LOG.error("Failes to extract brand hash from email address " + Lists.newArrayList(m.getFrom())); 
     return UNKNOWN_BRAND_PATH; 
    } 
} 

Проблема заключается в том, что для письма, первоначально созданных в макинтош bodyPart.getDisposition() всегда возвращает нуль. Независимо от того, что я пробовал, я не мог понять, какая часть является частью приложения (это то, что мне действительно нужно: извлечение вложения из почты).

Я искал по всему Интернету, чтобы найти причину этого, и я не смог найти ответ. Как только я нашел нижеследующую заметку, написанную Юргеном Холлером, которая указывает, что здесь может быть проблема (подробности здесь: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/mail/javamail/MimeMessageHelper.html)

Предупреждение о многопользовательской почте: Простые MIME-сообщения, содержащие только текст HTML, но не встроенные элементы или вложения будет работать на более или менее любом почтовом клиенте, который способен на HTML-рендеринг. Однако встроенные элементы и вложения по-прежнему являются серьезной проблемой совместимости между почтовыми клиентами: практически невозможно получить встроенные элементы и вложения, работающие в Microsoft Outlook, Lotus Notes и Mac Mail. Подумайте о выборе конкретного многопроцессорного режима для ваших нужд: javadoc в константах MULTIPART_MODE содержит более подробную информацию.

Есть ли какой-либо пример или объяснение относительно использования JavaMail, если письма отправляются с Mac ??

Yosi

ответ

Смежные вопросы