web-dev-qa-db-ja.com

JavaMailを使用してファイルが添付されたHTMLメールを送信する方法

次のJavaコードは、ファイルをhtmlメールに添付して送信するために使用されます。これを添付ファイルとして送信したいhtmlメール。どんな提案でもいただければ幸いです。

public void sendEmail(final String userName, final String password, final String Host, final String html, final List<String> emails, String subject, String file) throws MessagingException
    {
        System.out.println("User Name: " + userName);
        System.out.println("Password: " + password);
        System.out.println("Host: " + Host);

        //Get the session object  
        Properties props = new Properties();
        props.put("mail.smtp.Host", Host);
        props.put("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator()
                {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication()
                    {
                        return new PasswordAuthentication(userName, password);
                    }
                });

        if (!emails.isEmpty())
        {
            //Compose the message  
            InternetAddress[] address = new InternetAddress[emails.size()];
            for (int i = 0; i < emails.size(); i++)
            {
                address[i] = new InternetAddress(emails.get(i));
            }

            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(userName));
            message.setRecipients(Message.RecipientType.TO, address);
            message.setSubject(subject);

            MimeBodyPart messageBodyPart = new MimeBodyPart();

            Multipart multipart = new MimeMultipart();

            messageBodyPart = new MimeBodyPart();
            String fileName = "attachmentName";
            DataSource source = new FileDataSource(file);
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(fileName);
            multipart.addBodyPart(messageBodyPart);
            message.setContent(html, "text/html; charset=utf-8");
            message.setContent(multipart);
            //send the message  
            Transport.send(message);

            System.out.println("message sent successfully...");
        } else
        {
            System.out.println("No Recieptions");
        }

    }

これは私に添付ファイルだけをもたらします。しかし、私はこの添付ファイル付きのhtmlメールを送信したいと思います。

8
Terance

HTML本文と添付ファイルを使用してメールを作成するということは、実際には、コンテンツが「マルチパートエンティティ」であり、2つの部分を含むメールを作成することを意味します。1つはHTMLコンテンツで、もう1つは添付ファイルです。

これは現在のコードに対応していません:

Multipart multipart = new MimeMultipart(); // creating a multipart is OK

// Creating the first body part of the multipart, it's OK
messageBodyPart = new MimeBodyPart();
// ... bla bla
// ok, so this body part is the "attachment file"
messageBodyPart.setDataHandler(new DataHandler(source));
// ... bla bla
multipart.addBodyPart(messageBodyPart); // at this point, the multipart contains your file attachment, but only that!

// at this point, you set your mail's body to be the HTML message    
message.setContent(html, "text/html; charset=utf-8");
// and then right after that, you **reset** your mail's content to be your multipart, which does not contain the HTML
message.setContent(multipart);

この時点で、電子メールのコンテンツは、添付ファイルである1つの部分のみを持つマルチパートです。

したがって、期待される結果に到達するには、別の方法で進める必要があります。

  1. マルチパートを作成します(あなたがしたように)
  2. (あなたがしたように)あなたの添付ファイルをコンテンツとして持つパーツを作成します
  3. この最初のパートをマルチパートに追加します(あなたがしたように)
  4. 2番目のMimeBodyPartを作成します
  5. その2番目の部分にHTMLコンテンツを追加します
  6. この2番目のパートをマルチパートに追加します
  7. メールの内容をマルチパートに設定します(あなたがしたように)

これは大まかに次のように解釈されます:

Multipart multipart = new MimeMultipart(); //1
// Create the attachment part
BodyPart attachmentBodyPart = new MimeBodyPart(); //2
attachmentBodyPart.setDataHandler(new DataHandler(fileDataSource)); //2
attachmentBodyPart.setFileName(file.getName()); // 2
multipart.addBodyPart(attachmentBodyPart); //3
// Create the HTML Part
BodyPart htmlBodyPart = new MimeBodyPart(); //4
htmlBodyPart.setContent(htmlMessageAsString , "text/html"); //5
multipart.addBodyPart(htmlBodyPart); // 6
// Set the Multipart's to be the email's content
message.setContent(multipart); //7
20
GPI