2013-02-07 12 views
22

Mam aplikację Tomcat, która musi wysyłać wiadomości e-mail z potwierdzeniami itp. Mam kodowany program pocztowy z Javamail (mail.jar), aby wysyłać wieloczęściowe wiadomości tekstowe/html. Oparłem kod na przykładach Java EE. Używam MTA SMTP na lokalnym serwerze.Sprawdzone metody - Wysyłanie wiadomości e-mail wieloskładnikowych javamail mime - i Gmail

Działa świetnie. W Outlooku widzę wersję HTML. Jeśli przeciągnę go do folderu spamu programu Outlook, widzę wersję tekstową. Więc interpretuję to jako mówiąc, że to działa.

Jednak jeśli przeglądam wiadomości e-mail w Gmailu, widzę tylko wersję tekstową. Wiem, że kod HTML tam jest (stąd Outlook dostał go). Ale Gmail tego nie pokazuje ... Mam wiele e-maili z innych systemów, które wyświetlają się jako HTML w Gmailu.

Czy ktoś może wskazać mi specyfikację, która pokazuje, czego mi brakuje? Czy muszę utworzyć specjalne nagłówki?

Dzięki

kod wygląda następująco:

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

Twój kod wygląda dobrze. Gmail może celowo wyświetlać wersję tekstową, aby uniknąć problemów z bezpiecznym renderowaniem treści HTML. Mając wybór, może preferować zwykły tekst. –

Odpowiedz

51

rozwiązany! Wydaje się, że według wieloczęściowej specyfikacji MIME ważna jest kolejność części. Powinny być dodawane w kolejności od niskiej wierności do wysokiej wierności. Wygląda na to, że GMail podąża za specyfikacją i używa ostatniej części. W moim przypadku miałem je HTML, Text. Właśnie zamieniłem kolejność na tekst, HTML i Gmail czyni go prawidłowo ...

tj

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); 

Dzięki za pomoc!

+0

Dzięki temu jest świetny i rozwiązany przez lata. Kolejne pytanie, co powinniśmy zrobić, jeśli potrzebujemy dodania obrazu do treści HTML za pomocą procedury obsługi danych? – serkan