[Java] メール(javax.mail)を発送する方法
こんにちは。明月です。
この投稿はJavaでメール(javax.mail)を発送する方法に関する説明です。
プログラム上で我々がメール発送することは様々のところで使えることができます。会員登録する時に登録認証やパスワード探すことなどがあるし、システム上で様々なアラームメッセージをメール発送することもできます。
最近はsnsがたくさんあるのでsnsでメッセージを発送する方法もよく使いますが、それでもまだ、メール発送機能はなくならないでしょう。
私はgoogle mail(gmail)を通ってメールを発送する例です。
Google mail - https://support.google.com/a/answer/176600?hl=ja
先にクロームに接続して右上のアカウント管理に行きましょう。(ログインができなかった状況なら先にログインしてから。)
アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。
安全性の低いアプリの許可を有効にします。
このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。
Javaでメールを発送するソースを作成するためにpom.xmlでメールライブラリを登録しなければならないです。
レポジトリ - https://mvnrepository.com/artifact/javax.mail/mail
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
メール発送はconsoleに作成しても問題ないので、consoleで作成しましょう。
import java.io.File;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
// 開始関数は下にあります。
public class Program implements Runnable {
// mainからrun関数を呼び出すとメール発送を開始します。
@Override
public void run() {
try {
// メール環境変数設定する。
Properties props = new Properties();
// メールプロトコールはgmailを利用することなのでsmtpを使用する。
props.setProperty("mail.transport.protocol", "smtp");
// メールホストのアドレスを設定する。
props.setProperty("mail.host", "smtp.gmail.com");
// ID, Password設定が必要だ。
props.put("mail.smtp.auth", "true");
// portは465だ。
props.put("mail.smtp.port", "465");
// sslを使う場合、設定する。
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
// idとpasswordを設定してsessionを生成する。
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("id", "password");
}
});
// デバックモード
session.setDebug(true);
// メールメッセージを作るためにメッセージクラスを生成する。
MimeMessage message = new MimeMessage(session);
// 送信者設定
message.setFrom(getAddress("nowonbun@gmail.com"));
// 宛先設定
message.addRecipients(Message.RecipientType.TO, getAddresses("nowonbun@gmail.com,nowonbun@gmail.com"));
// CC設定
message.addRecipients(Message.RecipientType.CC, getAddresses("nowonbun@gmail.com"));
// BCC設定
message.addRecipients(Message.RecipientType.BCC, getAddresses("nowonbun@gmail.com"));
// メールタイトルを設定する。
message.setSubject("Test Mail");
// メール内容を設定するためにMimeクラスを設定する。
message.setContent(new MimeMultipart());
// メール内容を作成するためにMultipartクラスを受け取る。(上のnew MimeMultipart()で割り当てしたクラス)
Multipart mp = (Multipart) message.getContent();
// html形式で本文を作成してバウンダリーに入れる。
mp.addBodyPart(getContents("<html><head></head><body>Hello Test<br><img src=\"cid:image\" ></body></html>"));
// 添付ファイルを追加する。
mp.addBodyPart(getFileAttachment("test.xlsx"));
// イメージファイルを追加してcontextIdを設定する。contextIdは上の本文内容のcidでリンクの設定が可能。
mp.addBodyPart(getImage("capture.png", "image"));
// メールを送信する。
Transport.send(message);
} catch (Throwable e) {
e.printStackTrace();
}
}
// イメージをローカルから読み込んでBodyPartクラスに生成する。(バウンダリー変換)
private BodyPart getImage(String filename, String contextId) throws MessagingException {
// ファイルを読み込んでBodyPartで受け取る。
BodyPart mbp = getFileAttachment(filename);
if (contextId != null) {
// ContextId設定
mbp.setHeader("Content-ID", "<" + contextId + ">");
}
return mbp;
}
// ファイルをローカルから読み込んでBodyPartクラスを生成する。(バウンダリー変換)
private BodyPart getFileAttachment(String filename) throws MessagingException {
// BodyPart生成
BodyPart mbp = new MimeBodyPart();
// ファイルから読み込んでBodyPartに設定(バウンダリー変換)
File file = new File(filename);
DataSource source = new FileDataSource(file);
mbp.setDataHandler(new DataHandler(source));
mbp.setDisposition(Part.ATTACHMENT);
mbp.setFileName(file.getName());
return mbp;
}
// メールの本文内容設定
private BodyPart getContents(String html) throws MessagingException {
BodyPart mbp = new MimeBodyPart();
// setTextを利用する場合、一般テキスト内容で設定する。
// mbp.setText(html);
// html形式に設定する。
mbp.setContent(html, "text/html; charset=utf-8");
return mbp;
}
// StringになっているメールアドレスをAddressクラスに変換する。
private Address getAddress(String address) throws AddressException {
return new InternetAddress(address);
}
// Stringで複数のメールアドレスをコンマ(,)の区切りでAddress array形に変換
private Address[] getAddresses(String addresses) throws AddressException {
String[] array = addresses.split(",");
Address[] ret = new Address[array.length];
for (int i = 0; i < ret.length; i++) {
ret[i] = getAddress(array[i]);
}
return ret;
}
// 開始関数Programを生成してrun関数を実装する。
public static void main(String[] args) {
Program p = new Program();
p.run();
}
}
私がsessionのデバックモードに設定しましたのでメールサーバと送受信されるメッセージの状態が表示されます。もし、プロトコールで追加する内容があればこのログを見て追加すればよいです。
メールを発送しましたので、自分のメールトレイにメールがあるかどうか確認しましょう。
メールの送信がよくできました。
ここまでJavaでメール(javax.mail)を発送する方法に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [Java] JSPのSpring環境でschedulerのcronを使う方法2020/03/18 00:24:32
- [Java] POIを利用してExcelを扱う方法2020/03/17 01:48:00
- [Java] PDFを出力する方法(itextpdf)2020/03/13 00:47:31
- [Java] ログライブラリ(log4j)を使う方法2020/03/12 00:54:39
- [Java] Jsonタイプのデータを使う方法(Gsonライブラリ)2020/03/11 00:30:15
- [Java] Base64をエンコード、デコードする方法2020/03/09 10:24:01
- [Java] cmdコマンドを実行するための方法2020/03/06 18:01:10
- [Java] メール(javax.mail)を発送する方法2020/03/05 20:07:49
- [Java] クラス複製(Clonable, Reflection)2020/03/05 00:03:19
- [Java] シリアライズ(直列化: Serializable)2020/03/03 00:03:33
- [Java] StringBuilderとStringBufferの差異2020/03/02 07:52:22
- [Java] Compare関数を使う方法2020/02/29 03:00:00
- [Java] 数字フォーマット(お金表示及び小数点以下表示)2020/02/28 03:00:00
- [Java] サーブレット環境で現在の実行ディレクトリを取得する方法2020/02/27 03:00:00
- [Java] 日本語をユニコードに変換して、ユニコードから日本語に変換する方法2020/02/26 03:00:00
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07