Javaでメールを送ってみた

#はじめに
MAツールに携わった関係で、メール配信について調べたので
googleのsmtpサーバ利用して、簡易的なメール配信用(htmlメール)のプログラムを作ってみた。

######使用言語・使用するもの
・Java
・mail.jar: [download link](https://www.oracle.com/technetwork/java/index-138643.html) 
・activation.jar: [download link](https://www.oracle.com/technetwork/jp/java/javaee/tech/index-135046.html)
・googleのsmtpサーバ

#処理の流れ


大まかな処理の流れとして

smtp認証　→　配信コンテンツ、送信先、送信元の設定 →　送信

というようなまあいたってシンプルというか普通の流れになる。

#コーディング

####import

```java:import処理
import javax.mail.Address;
import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
import java.io.UnsupportedEncodingException;
import java.util.Date;

```

まず前提としてこいつらをimportする必要がある。

####smtp認証
```java:
Properties props = new Properties();
//SMTPサーバの設定。ここではgoogleのSMTPサーバーを設定
props.setProperty("mail.smtp.host","smtp.gmail.com"); 
//SSL用にポート番号を変更
props.setProperty("mail.smtp.port", "465");
//タイムアウト設定
props.setProperty("mail.smtp.connectiontimeout", "60000");
props.setProperty("mail.smtp.timeout", "60000");

//認証
props.setProperty("mail.smtp.auth", "true");
//SSLを使用するとこはこの設定が必要
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port","465");

//propsに設定した情報を使用して、sessionの作成
final Session session = Session.getInstance(props, new Authenticator() {
	protected PasswordAuthentication getPasswordAuthentication() {
        //ここで自分のgmailアカウントとパスワードを設定する
		return new PasswordAuthentication("XXXX@gmail.com","your password");
	}
});
```
このようにして、Propertiesに認証情報を設定して、sessionを作成し
Session型の変数、sessionに認証情報を割り当てる。


####配信コンテンツ、送信先、送信元の設定
```java:
//先ほどの変数sessionを設定する
MimeMessage contentMessage = new MimeMessage(session);
//メールのコンテンツ情報
String mailContents = "<html><body><h1>hello</h1></body></html>"
try {
    //送信元アドレス、表示名、文字コードを設定
	Address addFrom = new InternetAddress("xxx@gmail.com", "Aさん", "UTF-8");
	contentMessage.setFrom(addFrom);
    //送信先アドレス、表示名、文字コードを設定
	Address addTo = new InternetAddress("xxxx@gmail.com","Bさん","UTF-8");
	contentMessage.addRecipient(Message.RecipientType.TO, addTo);
    //件名を設定
	contentMessage.setSubject("こんにちは！！","UTF-8");
    //メールのコンテンツタイプを指定している。この場合はHTMLメールになる
	contentMessage.setHeader("Content-Type", "text/html; charset=UTF-8");
    //メールのコンテンツを設定している
	contentMessage.setContent(mailContents, "text/html; charset=UTF-8");
    //日付等の設定
	contentMessage.setSentDate(new Date());
} catch (MessagingException e) {
	e.printStackTrace();
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
}
```
配信コンテンツ、送信先、送信元の設定を行い
それをMimeMessage型のcontentMessageという変数に割り当てる。
ちなみにコンテンツタイプをtextにすればテキストメールを配信できる。

####送信

```java:
//メール送信
try {
    //先ほどのcontentMessageを設定する
	Transport.send(contentMessage);
} catch (AuthenticationFailedException e) {	
    //認証失敗
	e.printStackTrace();
} catch (MessagingException e) {
	//smtpサーバへの接続失敗
	e.printStackTrace();
}
```

これでメールが送信される。

#まとめ

Javaでの基本的なメール配信は基本的にはこのようになっていると思われる。
これをさらに高速化するために、スレッドを使ったり、コンテンツに文字を差し込んだりなど
色々できるので面白い。実際のコードは下記のgithubから、もしよろしければどうぞ。


ソース: [github](https://github.com/teessan/sendmail)