【Java】JavaでEmail ~ JavaMail / 添付ファイル ~

■ はじめに

https://dk521123.hatenablog.com/entry/2016/07/16/222422

の続き。

今度は、添付ファイルを付けて送る。
ついでに、CCとBCCをつけてみた。

【1】ポイント

* 言葉で説明するより、サンプルコードをみてもらった方が早い...

「■ サンプル」部分より抜粋

BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(this.mailBody);
// ★「text/html;」→「text/plain;」でないと改行コードで折り返さなくなる★
// ★「charset=UTF-8」がないとBody部が文字化け★
messageBodyPart.setContent(this.mailBody, "text/plain; charset=UTF-8");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);

// ★添付ファイルを設定★
if (this.attachmentFilePath != null) {
  MimeBodyPart mimeBodyPart = new MimeBodyPart();
  FileDataSource fileDataSource = new FileDataSource(this.attachmentFilePath);
  DataHandler dataHandler = new DataHandler(fileDataSource);
  mimeBodyPart.setDataHandler(dataHandler);
  mimeBodyPart.setFileName(MimeUtility.encodeWord(dataHandler.getName()));
  multipart.addBodyPart(mimeBodyPart);
}
mimeMessage.setContent(multipart);
Transport.send(mimeMessage);

【2】サンプル

import java.io.UnsupportedEncodingException;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

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

public class EmailHandler {
  private final static String DEFAULT_TIMEOUT = "10000";
  private final static String DEFAULT_HOST = "localhost";
  private final static String DEFAULT_POST = "25";
  private String fromAddress;
  private List<String> toAddresses;
  private List<String> ccAddresses;
  private List<String> bccAddresses;
  private String mailSubject;
  private String mailBody;
  private String attachmentFilePath; // ★注目★
  private String host;
  private String port;
  private String timeout;
  private boolean isOnDebugMode;

  /**
   * Default Contractor.
   */
  public EmailHandler() {
    this.fromAddress = null;
    this.toAddresses = new ArrayList<>();
    this.ccAddresses = new ArrayList<>();
    this.bccAddresses = new ArrayList<>();
    this.mailSubject = null;
    this.mailBody = null;
    this.attachmentFilePath = null;
    this.host = DEFAULT_HOST;
    this.port = DEFAULT_POST;
    this.timeout = DEFAULT_TIMEOUT;
    this.isOnDebugMode = false;
  }

  public void setFromAddress(String fromAddress) {
    this.fromAddress = fromAddress;
  }

  public void setToAddresses(List<String> toAddresses) {
    this.toAddresses = toAddresses;
  }

  public void addToAddress(String toAddress) {
    this.toAddresses.add(toAddress);
  }

  public void setCcAddresses(List<String> ccAddresses) {
    this.ccAddresses = ccAddresses;
  }

  public void addCcAddress(String ccAddress) {
    this.ccAddresses.add(ccAddress);
  }

  public void setBccAddresses(List<String> bccAddresses) {
    this.bccAddresses = bccAddresses;
  }

  public void addBccAddress(String bccAddress) {
    this.bccAddresses.add(bccAddress);
  }

  public void setMailSubject(String mailSubject) {
    this.mailSubject = mailSubject;
  }

  public void setMailBody(String mailBody) {
    this.mailBody = mailBody;
  }

  public void setAttachmentFilePath(String attachmentFilePath) {
    this.attachmentFilePath = attachmentFilePath;
  }

  public void setHost(String host) {
    this.host = host;
  }

  public void setPort(String port) {
    this.port = port;
  }

  public void setOnDebugMode(boolean isOnDebugMode) {
    this.isOnDebugMode = isOnDebugMode;
  }

  public void send() throws MessagingException, UnsupportedEncodingException {
    if (this.toAddresses == null || this.host == null) {
      throw new InvalidParameterException();
    }

    Properties props = new Properties();
    props.put("mail.smtp.host", this.host);
    props.put("mail.smtp.port", this.port);
    props.put("mail.debug", this.isOnDebugMode);
    props.put("mail.smtp.connectiontimeout", this.timeout);
    props.put("mail.smtp.timeout", this.timeout);

    Session session = Session.getInstance(props, null);

    Message mimeMessage = new MimeMessage(session);
    mimeMessage.setFrom(this.toInternetAddress(this.fromAddress));

    InternetAddress[] toAddresses = this.toInternetAddresses(this.toAddresses);
    mimeMessage.setRecipients(Message.RecipientType.TO, toAddresses);

    InternetAddress[] ccAddresses = this.toInternetAddresses(this.ccAddresses);
    mimeMessage.setRecipients(Message.RecipientType.CC, ccAddresses);

    InternetAddress[] bccAddresses = this.toInternetAddresses(this.bccAddresses);
    mimeMessage.setRecipients(Message.RecipientType.BCC, bccAddresses);

    mimeMessage.setSubject(this.mailSubject);
    mimeMessage.setSentDate(new Date());

    // ★重要部分★
    BodyPart messageBodyPart = new MimeBodyPart();
    messageBodyPart.setText(this.mailBody);
    messageBodyPart.setContent(this.mailBody, "text/plain; charset=UTF-8");
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // ★添付ファイルを設定★
    if (this.attachmentFilePath != null) {
      MimeBodyPart mimeBodyPart = new MimeBodyPart();
      FileDataSource fileDataSource = new FileDataSource(this.attachmentFilePath);
      DataHandler dataHandler = new DataHandler(fileDataSource);
      mimeBodyPart.setDataHandler(dataHandler);
      mimeBodyPart.setFileName(MimeUtility.encodeWord(dataHandler.getName()));
      multipart.addBodyPart(mimeBodyPart);
    }
    mimeMessage.setContent(multipart);
    Transport.send(mimeMessage);
  }

  private InternetAddress[] toInternetAddresses(List<String> addresses) throws AddressException {
    InternetAddress[] returnValues = new InternetAddress[addresses.size()];

    int index = 0;
    for (String address : addresses) {
      returnValues[index] = this.toInternetAddress(address);
      index++;
    }

    return returnValues;
  }

  private InternetAddress toInternetAddress(String address) throws AddressException {
    return new InternetAddress(address);
  }

  /**
   * 【使用例】
   * 
   * @param args
   */
  public static void main(String[] args) {
    try {
      EmailHandler email = new EmailHandler();
      email.setFromAddress("sample@yahoo.com");
      email.addToAddress("to.sample@gmail.com");
      email.addCcAddress("cc.sample@gmail.com");
      email.addBccAddress("bcc.sample@gmail.com");
      email.setMailSubject("test");
      email.setMailBody("body");
      email.setOnDebugMode(true);
      email.setAttachmentFilePath("C:\\temp\\Book1.xlsx");
      email.send();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

【3】注意:Body部が表示されない場合

* 以下の「サンプル(ダメな例)」だと、Body部が表示されない

1)サンプル(ダメな例)

    mimeMessage.setSubject(this.mailSubject);
    mimeMessage.setSentDate(new Date());
    mimeMessage.setText(this.mailBody);

    // ★添付ファイル処理★
    if (this.attachmentFilePath != null) {
      Multipart multipart = new MimeMultipart();
      MimeBodyPart mimeBodyPart = new MimeBodyPart();
      FileDataSource fileDataSource = new FileDataSource(this.attachmentFilePath);
      DataHandler dataHandler = new DataHandler(fileDataSource);
      mimeBodyPart.setDataHandler(dataHandler);
      mimeBodyPart.setFileName(MimeUtility.encodeWord(dataHandler.getName()));
      multipart.addBodyPart(mimeBodyPart);
      mimeMessage.setContent(multipart);
    }
    
    Transport.send(mimeMessage);
  }

http://stackoverflow.com/questions/14547435/body-message-does-not-appear-when-sending-attachments

// より抜粋

// Create the message part
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText(body);
messageBodyPart.setContent(body, "text/html");

Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
//Add the bodypart for the attachment(s)
// Send the complete message parts
message.setContent(multipart); //message is of type - MimeMessage

参考文献

http://seiic.blog.so-net.ne.jp/2012-05-19
http://d.hatena.ne.jp/ttshrk/20110405/1301998708

関連記事

JavaでEmail ~ JavaMail / Text ~
https://dk521123.hatenablog.com/entry/2016/07/16/222422