Java SMTPSで認証・暗号化してメール送信(本文＋添付ファイル)

## はじめに
SMTPSでメールアカウントを認証してから暗号化してメール送信します。
ついでに本文と添付ファイルの構成例とします。

事前に以下のライブラリを用意します。

- JavaMail API
    - http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.7-oth-JPR
    - ※"javamail1_4_7.zip"のリンクからダウンロード

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:SMTPSTest.java
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
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;
import javax.mail.util.ByteArrayDataSource;

/**
 *
 * @author tool-taro.com
 */
public class SMTPSTest {

	public static void main(String[] args) throws MessagingException, IOException {

		String from = "差出人メールアドレス";
		String fromName = "差出人名を指定します";
		String subject = "件名を指定します";
		String to = "宛先メールアドレス";
		String toName = "宛名を指定します";
		String body = "これは本文です。\n\n\n\n\n\n\n\n\n\n以上。";
		String attachmentFileName = "添付ファイル名.txt";
		String attachmentFileType = "text/plain; charset=UTF-8";
		byte[] attachmentFileBody = "これは添付ファイルです。\n\n\n\n\n\n\n\n\n\n以上。".getBytes("UTF-8");

		String host = "メール送信サーバホスト";
		String user = "メール送信アカウント";
		String password = "メール送信アカウントパスワード";

		Properties properties;
		Session session;
		Store store = null;
		Transport transport = null;
		MimeMessage mimeMessage;
		MimeBodyPart messageBody;
		MimeMultipart multipart;
		InternetAddress[] address;

		try {
			properties = System.getProperties();
			properties.setProperty("mail.transport.protocol", "smtps");
			properties.setProperty("mail.smtp.port", "465");
			properties.setProperty("mail.smtp.auth", "true");
			properties.setProperty("mail.smtp.starttls.enable", "true");
			properties.setProperty("mail.smtp.starttls.required", "true");
			properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
			properties.setProperty("mail.smtp.socketFactory.fallback", "true");

			session = Session.getInstance(properties);

			mimeMessage = new MimeMessage(session);
			//件名は(一応)JISで
			mimeMessage.setSubject(MimeUtility.encodeText(subject, "iso-2022-jp", "B"), "iso-2022-jp");
			mimeMessage.setSentDate(new Date());

			address = new InternetAddress[1];
			address[0] = new InternetAddress(from);
			//差出人名は設定しなくても問題ない
			if (fromName != null) {
				//差出人名は(一応)JISで
				address[0].setPersonal(MimeUtility.encodeText(fromName, "iso-2022-jp", "B"));
			}
			mimeMessage.setFrom(address[0]);

			address[0] = new InternetAddress(to);
			//宛名は設定しなくても問題ない
			if (toName != null) {
				//宛名は(一応)JISで
				address[0].setPersonal(MimeUtility.encodeText(toName, "iso-2022-jp", "B"));
			}
			mimeMessage.setRecipients(Message.RecipientType.TO, address);

			/*
				マルチパートのメッセージを作成する
				構造
					パート1: 本文
					パート2: 添付ファイル
			 */
			multipart = new MimeMultipart();
			mimeMessage.setContent(multipart);

			//パート1: 本文
			messageBody = new MimeBodyPart();
			//本文のテキストは(一応)JISで
			messageBody.setText(body, "iso-2022-jp");
			messageBody.setHeader("Content-Transfer-Encoding", "7bit");
			multipart.addBodyPart(messageBody);

			//パート2: 添付ファイル
			messageBody = new MimeBodyPart();
			//添付ファイル名は(一応)JISで
			messageBody.setFileName(MimeUtility.encodeText(attachmentFileName, "iso-2022-jp", "B"));
			messageBody.setDataHandler(new DataHandler(new ByteArrayDataSource(new ByteArrayInputStream(attachmentFileBody), attachmentFileType)));
			multipart.addBodyPart(messageBody);

			transport = session.getTransport();
			transport.connect(host, user, password);
			transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
		}
		finally {
			if (store != null) {
				try {
					store.close();
				}
				catch (MessagingException e) {
				}
			}
			if (transport != null) {
				try {
					transport.close();
				}
				catch (MessagingException e) {
				}
			}
		}
	}
}
```
## 動作確認

```
$ javac SMTPSTest.java
$ java SMTPSTest
```
送られてきたメールを見てみます。
<img width="458" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/eff53e40-6994-48eb-d368-5dac6ba17fd7.png">
指定した通りの

- 差出人名
- 宛名
- 件名
- 本文
- 添付ファイル名

が表示されています。

添付ファイルを開いてみます。
<img width="340" alt="無題2.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/24021dad-89e5-5873-353c-968ed47946e4.png">
<<<<<<< HEAD
## 環境
=======

## 環境
>>>>>>> YOUR_EDITION
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)