Java Электронное письмо с HTML, встроенным изображением и вложениями - PullRequest
0 голосов
/ 19 июня 2020

По какой-то причине следующий полностью работающий код при странных обстоятельствах вызова не работает должным образом во всех случаях. Например, он отправляет встроенное изображение как вложение при вызове из других программ.

Поскольку я строю его вслепую, исходя из интуиции, взяв за основу фрагменты кода, я подозреваю, что структура созданного электронного письма недостаточно надежна. или, в лучшем случае, не следуя никаким рекомендациям.

Может ли кто-нибудь проверить правильность структуры электронного письма, созданного с помощью этого кода, например, указанный ответ в здесь , или какая модификация будет Вы представляете, чтобы улучшить структуру?

Заранее спасибо.

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;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;

public class Test {

    private Properties emailProperties;
    private Session mailSession;
    private MimeMessage emailMessage;       

    public String[] toEmails={"Admin <admin@example.com>"};
    public String emailSubject="Subject";
    public String emailBody="";
    public String htmlText= "Subject<br>";  
    public String txtContentID="<image1>";  
    public String txtImage="Example.png";
    public String emailHost="example.com";
    public String fromUser="admin@example.com";
    public String fromUserEmailPassword="mypassword";
    public String sPort="587";
    public String sXMailer="Example";
    public String sMID="20200618235959.00.admin@example.com";
    public String fromEmail="admin@example.com";
    public String fromName="Admin";
    public String sReturnEmail="Admin <admin@example.com>";    
    public String[] txtAttachment = {"File.txt"}; //PROBLEM??
    public String[] txtAttachmentName = {"File.txt"};

    public static void main(String args[]) throws AddressException,
            MessagingException {
        System.out.println("Test");
        SendEmail javaEmail = new SendEmail();
        javaEmail.send();
    }

    public void send() throws AddressException,
            MessagingException {        
        emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port",sPort);
        emailProperties.put("mail.smtp.auth", "true");
        emailProperties.put("mail.smtp.starttls.enable", "true");

        mailSession = Session.getDefaultInstance(emailProperties, null);
        emailMessage = new MimeMessage(mailSession);
        if (!(toEmails==null))
            for (int i=0;i<toEmails.length;i++){
                emailMessage.addRecipient(Message.RecipientType.TO, 
                new InternetAddress(toEmails[i]));
            }
        emailMessage.setSubject(emailSubject);
        emailMessage.setHeader("X-Mailer",sXMailer);
        emailMessage.setHeader("Return-path",sReturnEmail);
        emailMessage.setHeader("Return-Path",sReturnEmail);
        emailMessage.setHeader("Envelope-from",sReturnEmail);
        try {
            emailMessage.setFrom(new InternetAddress(fromEmail,fromName));
        } catch (java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        MimeMultipart multipart = new MimeMultipart("related");
        BodyPart messageBodyPart1 = new MimeBodyPart();
        messageBodyPart1.setContent(htmlText, "text/html; charset=utf-8");
        messageBodyPart1.setDisposition(MimeBodyPart.INLINE);
        multipart.addBodyPart(messageBodyPart1);
        BodyPart messageBodyPart2 = new MimeBodyPart();
        DataSource fdsImage = new FileDataSource(txtImage);
        messageBodyPart2.setDataHandler(new DataHandler(fdsImage));
        messageBodyPart2.setHeader("Content-ID",txtContentID);
        messageBodyPart2.setDisposition(MimeBodyPart.INLINE);
        multipart.addBodyPart(messageBodyPart2);
        MimeMultipart multipart2 = new MimeMultipart();
        BodyPart rbp = new MimeBodyPart();
        rbp.setContent(multipart);
        multipart2.addBodyPart(rbp);
        for (int i=0;i<txtAttachment.length;i++){
            BodyPart messageBodyPart3 = new MimeBodyPart();
            DataSource fdsAttachment = new FileDataSource(txtAttachment[i]);
            messageBodyPart3.setDataHandler(new DataHandler(fdsAttachment));
            messageBodyPart3.setFileName(txtAttachmentName[i]);
            messageBodyPart3.setDisposition(MimeBodyPart.ATTACHMENT);
            multipart2.addBodyPart(messageBodyPart3);
        }
        emailMessage.setContent(multipart2);    

        System.out.println("Sending Email...");
        Transport transport=mailSession.getTransport("smtp");
        transport.connect(emailHost,fromUser,fromUserEmailPassword);
        emailMessage.saveChanges();
        emailMessage.setHeader("Message-ID",sMID);
        transport.sendMessage(emailMessage,emailMessage.getAllRecipients());
        transport.close();
    }
}
...