Отправка электронной почты в формате HTML со встроенным изображением с помощью JavaMail - медленная загрузка изображения?

1

Когда я отправляю HTML-письмо по электронной почте с помощью JavaMail и включаю встроенное изображение в HTML, изображение занимает 2-3 секунды для загрузки при чтении в Gmail или Yahoo.

Изображение, которое я использую, представляет собой небольшой размер.png, размер которого составляет около 200 байт.

Вот код:

import java.io.File;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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 EmailTest 
{   
    static String from = "Your_Gmail_Account_Name";  // (e.g., "name" if your account is "[email protected]"
    static String password = "Your_Gmail_Password";    
    static String to = "[email protected]";
    static String subject = "test";
    static String body = "<h1>The image in this e-mail is slow to load.</h1><img src=\"cid:my-image\">"; 
    static String host = "smtp.gmail.com";

    public static void main(String[] args)
    {
        Properties properties = System.getProperties();

        properties.put("mail.smtp.starttls.enable", "true");  
        properties.put("mail.smtp.host", host);
        properties.put("mail.smtp.user", from);
        properties.put("mail.smtp.password", password);
        properties.put("mail.smtp.port", "587");
        properties.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(properties);

        MimeMessage message = new MimeMessage(session);

        try 
        {
            message.setFrom(new InternetAddress(from));    
            InternetAddress toAddress = new InternetAddress(to);
            message.addRecipient(Message.RecipientType.TO, toAddress);
            message.setSubject(subject);

            Multipart multipart = new MimeMultipart("related");

            MimeBodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent(body, "text/html");
            multipart.addBodyPart(htmlPart);

            MimeBodyPart imagePart = new MimeBodyPart();
            DataSource ds = new FileDataSource(new File("src\\icon.png"));
            imagePart.setDataHandler(new DataHandler(ds));
            imagePart.setHeader("Content-ID", "<my-image>");
            multipart.addBodyPart(imagePart);

            message.setContent(multipart);

            Transport transport = session.getTransport("smtp");

            try 
            {
                transport.connect(host, from, password);
                transport.sendMessage(message, message.getAllRecipients());
                transport.close();

                System.out.println("e-mail sent.");
            } 
            catch (MessagingException e) 
            {
                e.printStackTrace();
            }
        }
        catch (AddressException e) 
        {
            e.printStackTrace();
        }
        catch (MessagingException e) 
        {
            e.printStackTrace();
        }
    } 
}

Кто-нибудь знает, почему изображение так медленно загружается?

ОБНОВИТЬ:

При чтении электронной почты, созданной вышеуказанным кодом в Thunderbird, изображение даже не загружается, но будет отображаться только как вложение.

Но если я удалю эту строку:

imagePart.setHeader("Content-ID", "<my-image>");

и замените его этими двумя строками:

imagePart.addHeader("Content-ID", "<my-image>");
imagePart.addHeader("Content-Type", "image/png");

то изображение фактически загружается в Thunderbird и мгновенно загружается.

Тем не менее, изображение по-прежнему медленно загружается как в Gmail, так и в Yahoo.

Теги:
email
javamail

2 ответа

1
Лучший ответ

Возможно, на нем работает антивирус? Попробуйте Thunderbird.

  • 0
    Изображение даже не загружается в Thunderbird. Это просто появляется как приложение.
  • 0
    Я на самом деле заставил его работать в Thunderbird (см. Обновление к исходному сообщению). Тем не менее, медленная загрузка все еще сохраняется в Gmail и Yahoo.
Показать ещё 1 комментарий
0

Как упоминал Билл и другой плакат, проблема не проблема с JavaMail, но, похоже, проблема с Gmail и Yahoo сканирует встроенные встроенные изображения, отправленные по электронной почте.

Решение состоит в том, чтобы не встраивать какие-либо встроенные изображения в ваш HTML-адрес электронной почты с Content-ID, а размещать атрибут src в ваших тегах img в вашем HTML, который относится к вашим изображениям, которые сидят на удаленном хосте.

Это заставит ваши изображения загружаться очень быстро, когда они отправляются внутри электронной почты HTML.

Другими словами:

import java.util.Properties;

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.MimeMessage;


public class EmailTest 
{   
    static String from = "Your_Gmail_Account_Name";  // Your Gmail account name (e.g., "name" if your account is "[email protected]"
    static String password = "Your_Gmail_Password";   // Your Gmail password
    static String to = "[email protected]";
    static String subject = "test";
    static String body = "<html><body><h1>The image in this e-mail loads very fast.</h1><img src=\"http://www.your_host.com/path/to/image/icon.png\"></body></html>"; 

    static String host = "smtp.gmail.com";

    public static void main(String[] args)
    {
        Properties properties = System.getProperties();

        properties.put("mail.smtp.starttls.enable", "true");  
        properties.put("mail.smtp.host", host);
        properties.put("mail.smtp.user", from);
        properties.put("mail.smtp.password", password);
        properties.put("mail.smtp.port", "587");
        properties.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(properties);

        MimeMessage message = new MimeMessage(session);

        try 
        {
            message.setFrom(new InternetAddress(from));    
            InternetAddress toAddress = new InternetAddress(to);
            message.addRecipient(Message.RecipientType.TO, toAddress);
            message.setSubject(subject);    
            message.setContent(body, "text/html");

            Transport transport = session.getTransport("smtp");

            try 
            {
                transport.connect(host, from, password);
                transport.sendMessage(message, message.getAllRecipients());
                transport.close();

                System.out.println("e-mail sent.");
            } 
            catch (MessagingException e) 
            {
                e.printStackTrace();
            }
        }
        catch (AddressException e) 
        {
            e.printStackTrace();
        }
        catch (MessagingException e) 
        {
            e.printStackTrace();
        }
    } 
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню