「Javaでユーザー登録の確認メールを送りたいけど、どうすればいいんだろう…」
「JavaMail APIの使い方がいまいち分からない…」
「Gmailを使ってメールを送信しようとしたら、認証エラーが出て先に進めない!」
現役でJavaを使ったWebアプリケーション開発に携わっている筆者です。これまでメールや、業務システムの通知機能など、数多くのメール送信機能をJavaで実装してきました。
Javaでのメール送信は、ライブラリの使い方やサーバー設定など、初心者がつまずきやすいポイントがいくつかあります。私も駆け出しのころは、文字化けや認証エラーに何時間も頭を悩ませた経験があります。
そこでこの記事では、かつての私と同じように悩んでいる方に向けて、Javaでのメール送信方法を徹底的に解説します。
この記事を読み終えるころには、あなたもJavaMail APIを使ったメール送信の基本をマスターし、Gmailアカウントを使ったメール送信も実装できるようになっているはずです。
Javaでメール送信を行う方法とは?

Javaアプリケーションからメールを送信するには、一般的にJavaMail APIという仕組みを利用します。これは、メールを送受信するための標準的なAPIで、これを使うことで比較的簡単にメール送信機能を実装可能です。
JavaMail APIとは何か
JavaMail APIは、Javaプログラム上でメールを扱うための便利な道具箱のようなものです。このAPIが提供するクラスやメソッドを使うことで、私たちはメールサーバーとの複雑なプロトコルを意識することなく、「宛先」「件名」「本文」などを設定するだけでメールを送信できます。
以前は手動でライブラリをダウンロードする必要がありましたが、現在はMavenやGradleといったビルドツールを使えば、簡単プロジェクトに導入できます。
メール送信に必要なライブラリと環境準備
Javaでメール送信を実装するには、主に2つのライブラリが必要です。
- Jakarta Mail : メール送信の本体となるライブラリです。
- Jakarta Activation : メールのデータ(テキスト、添付ファイルなど)を扱うためのライブラリです。
Mavenを利用しているプロジェクトであれば、pom.xml
ファイルに以下の依存関係を追加するだけで準備は完了します。
<dependencies>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
バージョンは最新のものは適宜確認してください。
SMTPサーバーとの関係
JavaMail APIはあくまでメールを作成し、送信を指示するだけです。実際にメールを相手に届ける役割は、SMTP サーバーが担います。
私たちが書いたプログラムは、このSMTPサーバーに対して「この内容のメールを、この宛先に送ってください」とお願いするクライアントとして動作します。
利用するSMTPサーバーは、契約しているプロバイダのものや、Gmail、Outlookといったフリーメールサービスが提供しているものを利用するのが一般的です。
JavaMailを使ったメール送信の基本コード例

それでは、実際にJavaMail APIを使ったメール送信の基本的なコードを見ていきましょう。ここでは、ごくシンプルなテキストメールを送信する例を紹介します。
送信者・宛先・件名・本文の設定方法
メール送信の処理は、大きく分けて以下の4つのステップで構成されます。
- セッションの確立: SMTPサーバーへの接続情報を設定します。
- メッセージの作成: 送信者、宛先、件名、本文などを設定します。
- トランスポートの準備: メールを送信する準備をします。
- メールの送信: 作成したメッセージを送信します。
以下が具体的なサンプルコードです。
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class SimpleMailSender {
public static void main(String[] args) {
// 1. SMTPサーバーの設定
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.example.com"); // SMTPサーバー名
props.put("mail.smtp.port", "587"); // SMTPポート番号
props.put("mail.smtp.auth", "true"); // 認証を行う
props.put("mail.smtp.starttls.enable", "true"); // TLSを使用する
// 送信元のメールアドレスとパスワード
final String fromEmail = "your_email@example.com";
final String password = "your_password";
// 2. セッションの取得
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, password);
}
});
try {
// 3. メッセージの作成
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromEmail)); // 送信元
message.addRecipient(Message.RecipientType.TO, new InternetAddress("to_email@example.com")); // 宛先
message.setSubject("Javaからのテストメール", "UTF-8"); // 件名
message.setText("これはJavaMailAPIを利用して送信されたテストメールです。", "UTF-8"); // 本文
// 4. メールの送信
Transport.send(message);
System.out.println("メールの送信に成功しました。");
} catch (MessagingException e) {
e.printStackTrace();
System.out.println("メールの送信に失敗しました。");
}
}
}
このコードでは、Properties
オブジェクトにSMTPサーバーのホスト名やポート番号を設定しています。your_email
やpassword
の部分は、実際に利用するSMTPサーバーの情報に適宜書き換えてください。
添付ファイルを付ける場合の書き方
ファイルを添付してメールを送信するには、MimeBodyPart
とMimeMultipart
クラスを利用します。本文と添付ファイルをそれぞれ別のパーツとして作成し、それらを1つのメールとしてまとめるイメージです。
// (セッションの取得までは同じ)
try {
// 3. メッセージの作成
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(fromEmail));
message.addRecipient(Message.RecipientType.TO, new InternetAddress("to_email@example.com"));
message.setSubject("【添付ファイルあり】テストメール", "UTF-8");
// 本文パートの作成
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText("添付ファイルを確認してください。", "UTF-8");
// 添付ファイルパートの作成
MimeBodyPart filePart = new MimeBodyPart();
String filePath = "/path/to/your/file.pdf";
filePart.attachFile(filePath);
// 本文と添付ファイルをまとめる
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
message.setContent(multipart);
// 4. メールの送信
Transport.send(message);
System.out.println("添付ファイル付きメールの送信に成功しました。");
} catch (Exception e) { // IOExceptionも考慮
e.printStackTrace();
}
このように、MimeMultipart
を使うことで、複数の要素(本文、ファイル)を組み合わせたメールを簡単に作成できます。
HTMLメールを送信する方法
ユーザーへの通知メールなどでは、文字の装飾や画像の埋め込みが可能なHTML形式のメールを送りたい場面も多いでしょう。HTMLメールを送信するには、メッセージの本文を設定する際に、コンテンツタイプをtext/html
として指定します。
// ... 省略 ...
// 3. メッセージの作成
MimeMessage message = new MimeMessage(session);
// ... (送信元、宛先、件名の設定は同じ) ...
// HTML形式の本文を設定
String htmlContent = "<h1>こんにちは!</h1><p>これは<font color='red'>HTML形式</font>のテストメールです。</p>";
message.setContent(htmlContent, "text/html; charset=UTF-8");
// 4. メールの送信
Transport.send(message);
// ... 省略 ...
setContent
メソッドの第2引数でコンテンツタイプを明示的に指定する点がポイントです。受信者のメールクライアントは本文をHTMLとして解釈して表示してくれます。
Gmailを使ってJavaからメール送信する方法

開発中のテストなどで、手軽に利用できるGmailのSMTPサーバーを使いたい、と考える方は多いのではないでしょうか。ここでは、GmailをSMTPサーバーとして利用するための手順を解説します。
Gmail SMTPサーバーの設定手順
GmailのSMTPサーバーを利用する場合、Properties
に設定する値は以下のようになります。
そして最も重要なのが、認証情報の設定です。通常のGoogleアカウントのパスワードは、セキュリティの観点からそのままでは利用できません。代わりに「アプリパスワード」を生成して利用する必要があります。
アプリパスワードは以下の手順で取得できます。
- Googleアカウントにログインし、「セキュリティ」のページに移動する。
- 「Googleへのログイン」セクションにある「2段階認証プロセス」を有効にする。
- 「2段階認証プロセス」のページ下部にある「アプリパスワード」を選択する。
- アプリ選択で「メール」、デバイス選択で「その他(名前を入力)」を選び、任意の名前(例: JavaMailApp)を入力して「生成」をクリックする。
- 表示された16桁のパスワードをコピーし、コード内の
password
変数に設定します。
このアプリパスワードは一度しか表示されないため、必ず控えておきましょう。
OAuth2認証を使う場合のポイント
アプリパスワードよりもさらにセキュアな方法として、OAuth2による認証があります。OAuth2を利用すると、ユーザーが自分のGoogleアカウントの認証情報をアプリケーションに直接渡すことなく、安全にAPIアクセスを許可できます。
ただし、OAuth2の実装はアプリパスワード方式に比べて複雑になります。Google API Client Library for Java
などのライブラリを使い、認証フロー(同意画面の表示、アクセストークンの取得など)を実装しなければなりません。
個人開発や小規模なツールであればアプリパスワードで十分な場合が多いですが、不特定多数のユーザーが利用するサービスを開発する場合は、OAuth2の導入を検討すべきです。
よくあるエラーと解決方法

Javaでメール送信を実装していると、いくつかの典型的なエラーに遭遇することがあります。ここでは、代表的なエラーとその解決策を紹介します。
「認証に失敗しました」と出るときの原因
javax.mail.AuthenticationFailedException
というエラーは、最もよく見られるエラーの1つです。原因は主に以下の3つが考えられます。
SSL/TLSエラーが出たときの対処法
javax.mail.MessagingException: Could not connect to SMTP host
といったエラーメッセージと共に、SSLやTLSに関する例外が出た場合は、暗号化通信の設定を見直す必要があります。
- ポート番号の確認: 利用するプロトコル(TLS/SSL)に対応した正しいポート番号(例: 587, 465)が設定されているか確認してください。
- プロパティの確認:
props.put("mail.smtp.starttls.enable", "true");
のような、暗号化を有効にするためのプロパティが正しく設定されているか確認します。SSLを利用する場合はprops.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
といった設定が必要になることもあります。
日本語の文字化け対策
送信したメールの件名や本文が「?????」のように文字化けしてしまう問題も、初心者が陥りやすい罠です。これは、文字コードの設定が原因です。
Javaの内部処理と、メールとして送信される際の文字コードが一致していないために発生します。これを解決するには、メッセージを作成する際に文字コードをUTF-8に明示的に指定します。
// 件名
message.setSubject("日本語の件名", "UTF-8");
// 本文 (テキストの場合)
message.setText("日本語の本文です。", "UTF-8");
// 本文 (HTMLの場合)
message.setContent(htmlContent, "text/html; charset=UTF-8");
このように、UTF-8
を指定することで、ほとんどの文字化けは解消されるはずです。
Javaでのメール送信の活用例

Javaによるメール送信機能は、さまざまなアプリケーションで活用されています。ここでは、具体的な3つの活用例を紹介します。
ユーザー登録時の確認メール
Webサービスで新規ユーザーが登録した際に、「登録を完了するには、以下のリンクをクリックしてください」といった内容の確認メールを自動送信する機能です。ユーザーが入力したメールアドレスが有効であることを確認できます。
パスワードリセットメール
ユーザーがパスワードを忘れてしまった場合に、パスワードを再設定するためのリンクを記載したメールを送信する機能です。セキュアなアプリケーションには必須の機能といえるでしょう。
バッチ処理での定期レポート送信
夜間のバッチ処理で、その日の売上データやシステムの稼働状況を集計し、結果をレポートとして関係者にメールで自動送信する、といった活用方法です。手動での報告作業を自動化し、業務効率を大幅に向上させられます。
まとめ
最後に、この記事の内容を振り返りましょう。
Javaでのメール送信の流れをおさらい
Javaでメールを送信するための基本的な流れは、以下の3ステップです。
- 環境準備: MavenなどでJakarta Mailライブラリをプロジェクトに追加する。
- サーバー設定と認証:
Properties
オブジェクトにSMTPサーバーの情報を設定し、Session
を確立する。Gmailの場合はアプリパスワードを取得する。 - メッセージ作成と送信:
MimeMessage
で宛先や件名、本文(テキスト、HTML、添付ファイル)を作成し、Transport.send()
で送信する。
この流れと、よくあるエラー対処法を覚えておけば、大抵のメール送信は問題なく実装できるでしょう。