Java

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メソッドで実行できるようにしてあります。

SMTPSTest.java

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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, UnsupportedEncodingException, 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 (Exception e) {
				}
			}
			if (transport != null) {
				try {
					transport.close();
				}
				catch (Exception e) {
				}
			}
		}
	}
}

動作確認

$ javac SMTPSTest.java
$ java SMTPSTest

送られてきたメールを見てみます。
無題.png
指定した通りの

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

が表示されています。

添付ファイルを開いてみます。
無題2.png

環境

  • 開発
    • Windows 10 Pro
    • JDK 1.8.0_74
    • NetBeans IDE 8.1
  • 動作検証
    • CentOS Linux release 7.2
    • JDK 1.8.0_74

Webツールも公開しています。
Web便利ツール@ツールタロウ

スポンサーリンク