2012-01-23 10 views
6

que había un problema ya resueltos de esta mañana: Java Mail, sending multiple attachments not workingJava Mail - adjuntos && las imágenes en línea

Esta vez tengo un problema un poco más complicado: me gustaría combinar archivos adjuntos con imágenes.

import java.io.IOException; 
import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.activation.FileDataSource; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

public class MailTest 
{ 

    public static void main(String[] args) throws AddressException, MessagingException, IOException 
    { 
     String host = "***"; 
     String from = "***"; 
     String to = "***"; 

     // Get system properties 
     Properties props = System.getProperties(); 

     // Setup mail server 
     props.put("mail.smtp.host", host); 

     // Get session 
     Session session = Session.getDefaultInstance(props, null); 

     // Define message 
     MimeMessage message = new MimeMessage(session); 
     message.setFrom(new InternetAddress(from)); 
     message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
     message.setSubject("Hello JavaMail"); 

     // Handle attachment 1 
     MimeBodyPart messageBodyPart1 = new MimeBodyPart(); 
     messageBodyPart1.attachFile("c:/Temp/a.txt"); 

     // Handle attachment 2 
     MimeBodyPart messageBodyPart2 = new MimeBodyPart(); 
     messageBodyPart2.attachFile("c:/Temp/b.txt"); 

     FileDataSource fileDs = new FileDataSource("c:/Temp/gti.jpeg"); 
     MimeBodyPart imageBodypart = new MimeBodyPart(); 
     imageBodypart.setDataHandler(new DataHandler(fileDs)); 
     imageBodypart.setHeader("Content-ID", "<myimg>"); 
     imageBodypart.setDisposition(MimeBodyPart.INLINE); 

     // Handle text 
     String body = "<html><body>Elotte<img src=\"cid:myimg\" width=\"600\" height=\"90\" alt=\"myimg\" />Utana</body></html>"; 

     MimeBodyPart textPart = new MimeBodyPart(); 
     textPart.setHeader("Content-Type", "text/plain; charset=\"utf-8\""); 
     textPart.setContent(body, "text/html; charset=utf-8"); 

     MimeMultipart multipart = new MimeMultipart("mixed"); 

     multipart.addBodyPart(textPart); 
     multipart.addBodyPart(imageBodypart); 
     multipart.addBodyPart(messageBodyPart1); 
     multipart.addBodyPart(messageBodyPart2); 

     message.setContent(multipart); 

     // Send message 
     Transport.send(message); 
    } 
} 

Al abrir el correo electrónico en Gmail todo está bien: tengo los dos archivos adjuntos, y la imagen se muestra en el contenido del correo (en la etiqueta IMG).

El problema es con Thunderbird y con el correo web de RoundCubic: cada uno muestra como que falta la imagen y se muestra en la parte inferior como archivo adjunto.

Como puedo hacer este trabajo?

+0

¡Microsoft Outlook 2010 ya no permite imágenes en línea! ¿Es esto un gran problema para ti? –

+0

Bueno, yo no estaba usando Outlook, pero Thunderbird. Antes de cambiar la parte múltiple de "relacionado" a "mixto" estaba funcionando. Pls. ver la pregunta vinculada stackoverflow. – dbalakirev

+0

Así que tengo este resuelto usando esto: http://static.springsource.org/spring/docs/1.2.x/reference/mail.html Spring está haciendo el truco en el fondo. Pero no puedo cerrar la pregunta porque mi representante no es lo suficientemente alto. – dbalakirev

Respuesta

2

Muy conveniente también es el uso de ImageHtmlEmail del org.apache.commons.mail library. (ACTUALIZACIÓN: solo se incluye en la instantánea de 1.3) Por ejemplo:

HtmlEmail email = new ImageHtmlEmail(); 
    email.setHostName("mail.myserver.com"); 
    email.addTo("[email protected]", "John Doe"); 
    email.setFrom("[email protected]", "Me"); 
    email.setSubject("Test email with inline image"); 

    // embed the image and get the content id 
    URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif"); 
    String cid = email.embed(url, "Apache logo"); 

    // set the html message 
    email.setHtmlMsg(htmlEmailTemplate, new File("").toURI().toURL(), false); 
Cuestiones relacionadas