#はじめに
MAツールに携わった関係で、メール配信について調べたので
googleのsmtpサーバ利用して、簡易的なメール配信用(htmlメール)のプログラムを作ってみた。
######使用言語・使用するもの
・Java
・mail.jar: download link
・activation.jar: download link
・googleのsmtpサーバ
#処理の流れ
大まかな処理の流れとして
smtp認証 → 配信コンテンツ、送信先、送信元の設定 → 送信
というようなまあいたってシンプルというか普通の流れになる。
#コーディング
####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認証
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に認証情報を割り当てる。
####配信コンテンツ、送信先、送信元の設定
//先ほどの変数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にすればテキストメールを配信できる。
####送信
//メール送信
try {
//先ほどのcontentMessageを設定する
Transport.send(contentMessage);
} catch (AuthenticationFailedException e) {
//認証失敗
e.printStackTrace();
} catch (MessagingException e) {
//smtpサーバへの接続失敗
e.printStackTrace();
}
これでメールが送信される。
#まとめ
Javaでの基本的なメール配信は基本的にはこのようになっていると思われる。
これをさらに高速化するために、スレッドを使ったり、コンテンツに文字を差し込んだりなど
色々できるので面白い。実際のコードは下記のgithubから、もしよろしければどうぞ。
ソース: github