2013-02-07 13 views
22

Ho un'applicazione Tomcat che deve inviare e-mail di conferma ecc. Ho codificato l'e-mail con Javamail (mail.jar) per inviare e-mail multipart text/html. Ho basato il codice sugli esempi di Java EE. Sto utilizzando l'MTA SMTP sul server locale.Best practice - Invio di e-mail multiparte javamail mime - e gmail

funziona benissimo. In Outlook, vedo la versione HTML. Se lo trascino nella cartella spam di Outlook, vedo la versione di testo. Quindi lo interpreto dicendo che funziona.

Tuttavia, se visualizzo le e-mail in Gmail, vedo solo la versione di testo. So che l'HTML è lì (è lì che l'ha preso Outlook). Ma Gmail non lo mostra ... Ho molte e-mail da altri sistemi che mostrano come HTML in Gmail.

Qualcuno può indicarmi le specifiche che mostrano cosa mi manca? Ci sono intestazioni speciali che devo creare?

Grazie

codice simile a questo:

Message message = new MimeMessage(session); 
Multipart multiPart = new MimeMultipart("alternative"); 

try { 

    MimeBodyPart textPart = new MimeBodyPart(); 
    textPart.setText(text, "utf-8"); 

    MimeBodyPart htmlPart = new MimeBodyPart(); 
    htmlPart.setContent(html, "text/html; charset=utf-8"); 

    multiPart.addBodyPart(htmlPart); 
    multiPart.addBodyPart(textPart); 
    message.setContent(multiPart); 

    if(from != null){ 
     message.setFrom(new InternetAddress(from)); 
    }else 
     message.setFrom(); 

    if(replyto != null) 
     message.setReplyTo(new InternetAddress[]{new InternetAddress(replyto)}); 
    else 
     message.setReplyTo(new InternetAddress[]{new InternetAddress(from)}); 

    InternetAddress[] toAddresses = { new InternetAddress(to) }; 
    message.setRecipients(Message.RecipientType.TO, toAddresses); 
    message.setSubject(subject); 
    message.setSentDate(new Date()); 

    Transport.send(message); 

} catch (AddressException e) { 
    e.printStackTrace(); 
    System.out.println("Error: "+e.getMessage()); 

} catch (MessagingException e) { 
    e.printStackTrace(); 
    System.out.println("Error: "+e.getMessage()); 

} finally {  
    System.out.println("Email sent!"); 
} 
+0

Il tuo codice sembra buono. Gmail potrebbe mostrare volutamente la versione in testo semplice per evitare tutti i problemi con il rendering sicuro del contenuto html. Data una scelta, potrebbe preferire il testo normale. –

risposta

51

risolto! Sembra secondo le specifiche MIME multipart, l'ordine delle parti è importante. Dovrebbero essere aggiunti in ordine di bassa fedeltà ad alta fedeltà. Quindi sembra che GMail segua le specifiche e utilizzi l'ultima parte. Nel mio caso ho avuto loro HTML, testo. Ho appena scambiato l'ordine di testo, HTML e Gmail rende correttamente ...

ossia

MimeBodyPart textPart = new MimeBodyPart(); 
textPart.setText(text, "utf-8"); 

MimeBodyPart htmlPart = new MimeBodyPart(); 
htmlPart.setContent(html, "text/html; charset=utf-8"); 

multiPart.addBodyPart(textPart); // <-- first 
multiPart.addBodyPart(htmlPart); // <-- second 
message.setContent(multiPart); 

Grazie per l'aiuto!

+0

Grazie è grandioso e ha risolto il mio problema per anni. Un'altra domanda, cosa dovremmo fare se avessimo bisogno di aggiungere un'immagine al contenuto HTML usando il gestore dati? – serkan