4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Javaでメールを送ってみた

Posted at

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

######使用言語・使用するもの
・Java
・mail.jar: download link
・activation.jar: download link
・googleのsmtpサーバ

#処理の流れ

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

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

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

#コーディング

####import

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

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?