本ページはプロモーションが含まれています

Java入門

Java メール送信の実装方法とサンプルコード【Gmail対応】

CATEGORY
REV.
DRAWN BY
TOM
SHEETS
7枚
JavaMail(Gmailでメールを送る)

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

JavaでGmailを使ってメール送信するコードは、このページのサンプルをコピペするだけで動きます。

扱うのは(1)JavaMail API(現Jakarta Mail)の基本設定(2)Gmail SMTP連携(3)添付ファイル・HTMLメール送信の3つです。

「認証に失敗する」「件名や本文が文字化けする」といった、初心者がつまずきやすいポイントも原因と解決策をあわせて紹介します。

はじめてJavaでメールを送る方も、このページだけで実装を完了できます。

この記事でわかること

  • JavaMail API(Jakarta Mail)でメールを送信する基本コード
  • GmailをSMTPサーバーとして使う設定手順(アプリパスワード取得含む)
  • 添付ファイル・HTMLメール送信のコード例と、よくあるエラーの解決方法

PARTS LIST /目次

Javaでメール送信するための基礎知識

Javaアプリケーションからメールを送るには、JavaMail APIという仕組みを使います。

現在は名称がJakarta Mailに変わり、Eclipse Foundationが開発を引き継いでいます。

JavaMail APIとは何か

JavaMail APIとは、Javaプログラムからメールの作成・送信・受信を行うための標準的なAPIです。

Javaでメールを扱うための道具箱と考えるとわかりやすいです。

JavaMail APIが提供するクラスやメソッドを使えば、メールサーバーとの複雑なプロトコルを意識する必要はありません。

「宛先」「件名」「本文」などを設定するだけでメールを送信できます。

以前はライブラリを手動でダウンロードしていました。今はMavenやGradleに依存関係を追加するだけで導入できます。

javax.mailとjakarta.mailの違い

JavaMail APIは、以前はjavax.mailというパッケージ名で提供されていました。

その後、JavaのエンタープライズAPI群(Java EE)がOracleからEclipse Foundationへ移管され、Jakarta EEに名前が変わりました。

この移管に合わせて、パッケージ名もjakarta.mailに変わっています。

新規プロジェクトではjakarta.mailパッケージを使用してください。

本記事のサンプルコードは、すべてjakarta.mailパッケージで書いています。古い書籍やネット記事のjavax.mailのコードを流用する場合は、import文を読み替えてください。

既存プロジェクトでjavax.mailのimport文が使われている場合、jakarta.mail 2.x系にバージョンを揃えるだけではコンパイルエラーになります。

import文をjakarta.mailへ一括置換するか、互換性を優先するなら旧アーティファクトcom.sun.mail:javax.mail(1.6.x系)を使い続ける必要があります。

メール送信に必要なライブラリと環境準備

Javaでメール送信を実装するには、主に2つのライブラリが必要です。

  1. Jakarta Mail: メール送信の本体となるライブラリです。APIと実装(Eclipse Angus Mail)に分かれています。
  2. Jakarta Activation: メールのデータ(テキスト、添付ファイルなど)を扱うためのライブラリです。

Mavenなら、pom.xmlにangus-mailを1つ追加するだけで準備が終わります。Jakarta Mail APIとJakarta Activationは自動で一緒に入ります。

あわせて読む
<dependencies>
    <!-- Jakarta Mailの実装(Jakarta Mail APIとJakarta Activationも自動で入る) -->
    <dependency>
        <groupId>org.eclipse.angus</groupId>
        <artifactId>angus-mail</artifactId>
        <version>2.0.5</version>
    </dependency>
</dependencies>
2026年9月時点の最新安定版です。Maven Repositoryで最新バージョンを確認してください。

古い記事でよく見るcom.sun.mail:jakarta.mail(2.0.x)はJakarta Mail 2.0時代の実装です。2.1系からは実装がAngus Mailに引き継がれたため、新規プロジェクトではangus-mailを選んでください。

SMTPサーバーとの関係

JavaMail APIはあくまでメールを作成し、送信を指示するだけです。実際にメールを相手に届ける役割は、SMTPサーバーが担います。

Javaのプログラムは、SMTPサーバーに「この内容のメールを、この宛先に送ってください」と依頼するクライアントとして動きます。

SMTPサーバーは、契約しているプロバイダのものか、GmailやOutlookなどのメールサービスが提供するものを使うのが一般的です。

Transport.send()を呼んでから相手に届くまでの流れを図にすると、次のようになります。

Transport.send() から受信箱に届くまでの流れ
1
JAVA → SMTPSMTPサーバーに接続mail.smtp.host / port(例:smtp.gmail.com:587)
2
JAVA → SMTPSTARTTLSで通信を暗号化
3
JAVA → SMTPAUTH(認証)アプリパスワード or OAuth2トークン。失敗すると AuthenticationFailedException
4
JAVA → SMTP送信元・宛先・本文を送るTransport.send
5
SMTP → 宛先のメールサーバーメールを転送
6
宛先のメールサーバー → 受信者受信箱に配送
NOTEJavaのプログラムが担うのは1〜4(SMTPサーバーへの依頼)まで。5・6はSMTPサーバー側の仕事です。

JavaMailを使ったメール送信の基本コード例

まずは、テキストだけのシンプルなメールを送るコードから始めます。

基本的なテキストメールを送信するサンプルコード

メール送信の処理は、大きく分けて以下の4つのステップで構成されます。

  1. SMTPサーバーの設定: ホスト名・ポート番号・認証の有無などをPropertiesに設定します。
  2. セッションの取得: Propertiesと認証情報からSessionを作ります。
  3. メッセージの作成: 送信者、宛先、件名、本文などを設定します。
  4. メールの送信: 作成したメッセージを送信します。

サンプルコードは、先ほど追加したAngus Mail(Jakarta Mail)のjakarta.mailパッケージを使っています。

import java.util.Properties;
import jakarta.mail.*;
import jakarta.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 = "[email protected]";
        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("[email protected]")); // 宛先
            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サーバーの情報に適宜書き換えてください。

実務では、パスワードをソースコードに直書きするのはセキュリティ上NGです。環境変数や設定ファイルから読み込むようにしましょう。

System.getenv("MAIL_PASSWORD")で環境変数から取得するのが最もシンプルな方法です。

添付ファイルを付ける場合の書き方

ファイルを添付してメールを送信するには、MimeBodyPartとMimeMultipartクラスを利用します。

本文と添付ファイルをそれぞれ別のパーツとして作成し、それらを1つのメールとしてまとめるイメージです。

// (セッションの取得までは同じ)

try {
    // 3. メッセージの作成
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(fromEmail));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
    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を使うことで、複数の要素(本文、ファイル)を組み合わせたメールを簡単に作成できます。

添付ファイル付きメールの組み立て順
1
MimeBodyPart ×2本文パートと添付パートを作るtextPart.setText(...)(本文:添付ファイルを確認…)/filePart.attachFile(filePath)(添付:file.pdf)
2
MimeMultipart(multipart)1つの入れ物にまとめるmultipart.addBodyPart(textPart) → multipart.addBodyPart(filePart)
3
MimeMessage(message)メッセージの中身に設定するmessage.setContent(multipart)。From / To / 件名「【添付ファイルあり】テストメール」は先に設定済み
4
TRANSPORT送信 → SMTPサーバーへTransport.send(message)
NOTE上のサンプルコードの処理順。本文と添付ファイルを別のパーツにして1通にまとめます。

添付ファイルを送信する際は、ファイルサイズに注意が必要です。

多くのメールサーバーでは1通あたり25MB程度の制限があり、それを超えるとMessagingExceptionが発生します。

大きなファイルはクラウドストレージに置き、リンクを本文に書いて共有してください。

あわせて読む

HTMLメールを送信する方法

ユーザーへの通知メールでは、文字の装飾や画像を入れられるHTML形式で送りたい場面があります。

HTMLメールを送信するには、メッセージの本文を設定する際に、コンテンツタイプをtext/htmlとして指定します。

// ... 省略 ...

// 3. メッセージの作成
MimeMessage message = new MimeMessage(session);
// ... (送信元、宛先、件名の設定は同じ) ...

// HTML形式の本文を設定
String htmlContent = "<h1>こんにちは!</h1><p>これは<span style='color:red'>HTML形式</span>のテストメールです。</p>";
message.setContent(htmlContent, "text/html; charset=UTF-8");

// 4. メールの送信
Transport.send(message);

// ... 省略 ...

setContentメソッドの第2引数でコンテンツタイプを明示的に指定する点がポイントです。

受信者のメールクライアントは本文をHTMLとして解釈して表示してくれます。

CC・BCCでメールを送信する方法

複数の宛先にメールを送信する場合、CC(カーボンコピー)やBCC(ブラインドカーボンコピー)を使います。

CCは全員にアドレスが見える形で共有し、BCCは他の受信者にアドレスを隠して送信します。

設定方法は、TOの場合と同じくaddRecipientメソッドの第1引数を変えるだけです。

// CC(カーボンコピー)
message.addRecipient(Message.RecipientType.CC, new InternetAddress("[email protected]"));

// BCC(ブラインドカーボンコピー)
message.addRecipient(Message.RecipientType.BCC, new InternetAddress("[email protected]"));

複数人に送る場合はaddRecipientを宛先の数だけ呼び出すか、addRecipientsメソッドでInternetAddressの配列を渡す方法もあります。

メール送信のタイムアウト設定

SMTPサーバーの応答が遅いときや、ネットワーク障害で応答が返ってこないときがあります。タイムアウトを設定していないと、プログラムはそのまま待ち続けて止まってしまいます。

実務では以下のプロパティを必ず設定しておきましょう。

props.put("mail.smtp.connectiontimeout", "5000"); // 接続確立のタイムアウト(ミリ秒)
props.put("mail.smtp.timeout", "5000"); // レスポンス待機のタイムアウト(ミリ秒)
props.put("mail.smtp.writetimeout", "5000"); // 書き込みのタイムアウト(ミリ秒)

いずれも既定値は無制限(タイムアウトなし)です。未設定のままだと、応答が返らないときに待ち続けることになり、バッチ処理などで後続処理が長時間止まる原因になります。

5秒前後を目安に設定しておくと安全です。

Gmailを使ってJavaからメール送信する方法

個人開発やテストでは、Googleアカウントがあればすぐ使えるGmailのSMTPサーバーが手軽です。

設定値、アプリパスワードの取得、OAuth2認証の順に説明します。

Gmail SMTPサーバーの設定手順

GmailのSMTPサーバーを利用する場合、Propertiesに設定する値は以下のようになります。

ポイント

  • ホスト名 (mail.smtp.host): smtp.gmail.com
  • ポート番号 (mail.smtp.port): 587 (STARTTLSの場合) または 465 (SSLの場合。mail.smtp.ssl.enableをtrueにする)
  • 認証 (mail.smtp.auth): true
  • TLS利用 (mail.smtp.starttls.enable): true

Gmailでつまずきやすいのが認証情報です。Googleアカウントの通常のパスワードでは、SMTP認証が通りません。

代わりに「アプリパスワード」を作って使います。

アプリパスワードは以下の手順で取得できます。

  1. Googleアカウントにログインし、「セキュリティ」のページに移動する。
  2. 「2段階認証プロセス」を有効にする(アプリパスワードの作成に必須)。
  3. アカウント画面上部の検索欄で「アプリパスワード」と検索するか、https://myaccount.google.com/apppasswordsを直接開く。
  4. 「アプリパスワード」ページでアプリ名(例: JavaMailApp)を入力し、「作成」をクリックする。
  5. 表示された16文字のパスワードをコピーし、コード内のpassword変数(または環境変数)に設定する。

アプリパスワードは作成時に一度しか表示されません。必ず控えておきましょう。

Googleの公式ヘルプによると、次のケースではアプリパスワードを使えません。

  • 2段階認証をセキュリティキーのみで設定している
  • 「高度な保護機能プログラム」に登録している
  • 職場や学校など組織のアカウントを使っている(管理者の設定しだいで使えない)

また、Googleアカウントのパスワードを変更すると、発行済みのアプリパスワードは自動で無効になります。急に認証エラーが出始めたら、まず作り直してみてください。

Gmail OAuth2認証を使う場合のポイント

アプリパスワードよりもさらにセキュアな方法として、OAuth2による認証があります。

OAuth2を利用すると、ユーザーが自分のGoogleアカウントの認証情報をアプリケーションに直接渡すことなく、安全にAPIアクセスを許可できます。

あわせて読む

Google Workspaceのアカウントでは、2025年5月1日(当初予定の3月14日から延期)にパスワードだけで接続する「安全性の低いアプリ」のアクセスが止まりました。Googleの管理者ヘルプでも、アプリパスワードを除きOAuthへの移行が求められています。

送信部分はシンプルです。Jakarta Mail(Angus Mail)はXOAUTH2方式に標準で対応しています。mail.smtp.auth.mechanismsにXOAUTH2を指定し、パスワードの代わりにアクセストークンを渡すだけで送れます。

Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.auth.mechanisms", "XOAUTH2"); // OAuth2で認証する

Session session = Session.getInstance(props);
// ... MimeMessageの作成は同じ ...

// パスワードの代わりに、Googleから取得したアクセストークンを渡す
String accessToken = System.getenv("GMAIL_ACCESS_TOKEN");
try (Transport transport = session.getTransport("smtp")) {
    transport.connect("[email protected]", accessToken);
    transport.sendMessage(message, message.getAllRecipients());
}

アクセストークンはBase64に変換せず、そのまま渡してOKです。変換はAngus Mailが内部で行います(Angus Mail公式のOAuth2解説)。

難しいのはトークンを取る側です。Google API Client Library for Javaなどを使い、同意画面の表示、アクセストークンの取得、期限切れ時のリフレッシュを実装する必要があります。

個人開発や小規模なツールであればアプリパスワードで十分です。不特定多数のユーザーが利用するサービスを開発する場合は、OAuth2を導入してください。

Spring Bootでメール送信する場合

実務では、Spring Boot(3.x/4.x)のプロジェクトでメール送信を作ることがよくあります。

spring-boot-starter-mailを使えば、ここまで紹介したJakarta Mailの設定をさらに簡潔に書けます。

Mavenの場合、pom.xmlに以下を追加します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

application.propertiesでSMTPサーバーの設定を行います。

spring.mail.host=smtp.gmail.com
spring.mail.port=587
[email protected]
spring.mail.password=your_app_password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

残りは、JavaMailSenderをDIで受け取って使うだけです。

Jakarta Mailを直接使う場合と比べて、設定の外部化やDI対応が標準で備わっている点がメリットです。

Spring Bootプロジェクトで開発しているなら、こちらの方法を優先しましょう。

「Jakarta Mailを直接使うか、Spring Mailを使うか」で迷う場合の判断基準は次の通りです。

フレームワークに依存させたくない小規模な用途、たとえば単発のバッチ処理やCLIツールなら、依存関係が少なく軽量なJakarta Mail直利用の方が適しています。

一方、Webアプリケーションの一部としてメール送信機能を組み込むのであれば、Spring Mailを最初から選ぶべきです。

DIによるテスト容易性や設定の外部化の恩恵が大きいためです。

開発・テスト用SMTPサーバーの活用

開発中に本番のGmail SMTPサーバーを使い続けると、送信制限に引っかかったり、テストメールが実際の宛先に届いてしまうリスクがあります。

そこで、ローカル環境で動く開発用SMTPサーバーを使うのがおすすめです。

MailpitはDockerで簡単に起動できます。

MailHogは2020年から開発が停止しており、Web UIに既知のXSS脆弱性(Exploit-DB ID 50971)が報告されています。

後継のMailpit(MailHogと互換性のあるAPI・同じポート番号)への移行が推奨されており、Laravel SailやDDEVもMailHogからMailpitへ切り替え済みです。

docker run -d -p 1025:1025 -p 8025:8025 axllent/mailpit

起動後、SMTPホストをlocalhost、ポートを1025に変えるだけです。送ったメールはhttp://localhost:8025のWeb UIで確認できます。

ポート番号はMailHogと同じなので、MailHogを使っていた環境からもそのまま切り替えられます。

本番SMTPへの切り替え前に、まずローカルで動作確認する習慣をつけておくと安全です。

Javaメール送信でよくあるエラーと解決方法

Javaでメール送信を実装すると、認証エラー・SSL/TLSエラー・文字化けの3種類のエラーによく遭遇します。

「認証に失敗しました」と出るときの原因

jakarta.mail.AuthenticationFailedException(javax.mail系ライブラリを使っている場合はjavax.mail.AuthenticationFailedException)というエラーは、最もよく見られるエラーの1つです。

原因は主に以下の3つが考えられます。

ポイント

  1. メールアドレス・パスワードの誤り: 最も基本的な原因です。特に、前述のGmailの例のように、通常のパスワードではなくアプリパスワードを使う必要があるケースを見落としがちです。設定した認証情報が正しいか、もう一度確認しましょう。
  2. 安全性の低いアプリのアクセスの廃止: 以前はGoogleアカウントの「安全性の低いアプリのアクセス」を有効にする方法もありました。しかし個人アカウントでは2022年5月30日に、Google Workspaceでは2025年5月1日(当初予定は3月14日)に、パスワードだけで接続する方式は使えなくなりました。現在Gmail SMTPで認証する方法は、アプリパスワードかOAuth2(XOAUTH2)のどちらかです。
  3. SMTPサーバー側のセキュリティ設定: 企業のネットワーク内など、特定のIPアドレスからのアクセスしか許可していないSMTPサーバーもあります。環境を確認してみましょう。

SSL/TLSエラーが出たときの対処法

jakarta.mail.MessagingException: Could not connect to SMTP host(javax.mail系ライブラリの場合はjavax.mail.MessagingException)と一緒に、SSLやTLSの例外が出ることがあります。

この場合は、暗号化通信の設定を次の3点で見直してください。

  • ポート番号の確認: 利用するプロトコル(TLS/SSL)に対応した正しいポート番号(例: 587, 465)が設定されているか確認してください。
  • プロパティの確認: props.put("mail.smtp.starttls.enable", "true"); のような、暗号化を有効にするためのプロパティが正しく設定されているか確認します。
  • SSL利用時の追加設定: ポート465でSSLを使う場合は props.put("mail.smtp.ssl.enable", "true"); を追加します。古い記事にあるmail.smtp.socketFactory.classの指定は、現在のJakarta Mailでは不要です。
あわせて読む

日本語の文字化け対策

件名や本文が「?????」のように化けるのも、初心者がつまずきやすいポイントです。

原因は文字コードです。Javaが扱う文字列と、メールとして送るときの文字コードが一致していないと化けます。

メッセージを作るときに、文字コードをUTF-8と明示すれば解決します。

// 件名
message.setSubject("日本語の件名", "UTF-8");

// 本文 (テキストの場合)
message.setText("日本語の本文です。", "UTF-8");

// 本文 (HTMLの場合)
message.setContent(htmlContent, "text/html; charset=UTF-8");

UTF-8 を指定することで、ほとんどの文字化けは解消できます。

ただし、古い携帯キャリアメールなど、UTF-8に対応していない受信環境もまれにあります。

そうした相手に送る業務メールでは、文字コードにISO-2022-JPを指定する方法もあります。

送信したメールが迷惑メール判定されないための注意点

コードが正しく動作していても、送信したメールが受信者に届かない、あるいは迷惑メールフォルダに振り分けられてしまうケースがあります。

原因の多くは、Gmailの送信者ガイドラインが定める送信者認証の要件を満たしていないことにあります。

  • Fromのドメインを認証済みのドメインとそろえる: message.setFrom()で指定するメールアドレスのドメインが、SPF・DKIMで認証されたドメイン(Gmail SMTPで送るなら、SMTP認証に使っているGmailアカウントのドメイン)と一致していないと、なりすましを疑われ迷惑メール判定を受けやすくなります。ガイドラインで一致(アライメント)が必須とされているのは1日5,000通を超える一括送信者ですが、すべての送信者にSPFまたはDKIMの設定が求められています。
  • 個人開発では認証アカウントと同じアドレスをFromに使うのが最も手軽な回避策: 本記事のサンプルコードのように、Gmail SMTPで認証しているアカウント自身のアドレスをFromに設定していれば、この問題は基本的に発生しません。
  • 自社ドメインで送信する場合はSPF・DKIMの設定が事実上必須: 独自ドメインのメールアドレスをFromに使う場合は、そのドメインのDNSにSPF・DKIMレコードを設定し、DMARCとの整合性を取っておく必要があります。設定が無いと、コード側にバグが無くても宛先に届かないことがあります。

Javaメール送信の実務での活用例3選

Javaのメール送信は、Webサービスから社内バッチまで幅広く使われています。代表的なのは次の3つです。

ユーザー登録時の確認メール

Webサービスで新規ユーザーが登録した際に、「登録を完了するには、以下のリンクをクリックしてください」といった内容の確認メールを自動送信する機能です。

ユーザーが入力したメールアドレスが有効であることを確認できます。

あわせて読む

パスワードリセットメール

ユーザーがパスワードを忘れてしまった場合に、パスワードを再設定するためのリンクを記載したメールを送信する機能です。

ログイン機能を持つアプリケーションには、ほぼ必須の機能です。

バッチ処理での定期レポート送信

夜間のバッチ処理で、その日の売上データやシステムの稼働状況を集計し、結果をレポートとして関係者にメールで自動送信する、といった活用方法です。

毎日の手作業での報告がなくなり、集計ミスも防げます。

あわせて読む

よくある質問

Q1. Javaでメールを送信するには何のライブラリが必要ですか?

A1. Javaでメールを送信するには、Jakarta Mail(旧JavaMail、javax.mail)とJakarta Activationが必要です。Mavenなら実装ライブラリのangus-mail(org.eclipse.angus)を1つ追加すれば、両方まとめて導入できます。

Q2. JavaMailとJakarta Mailの違いは何ですか?

A2. JavaMailは旧名称で、パッケージ名がjavax.mailでした。Jakarta EEへの移行に伴いjakarta.mailパッケージへ改称されたものがJakarta Mailです。新規プロジェクトではjakarta.mailを使用してください。

Q3. GmailのSMTPサーバーをJavaから使うにはどう設定しますか?

A3. ホスト名にsmtp.gmail.com、ポート番号に587(TLS)または465(SSL)を指定します。認証には通常のパスワードではなく、Googleアカウントで生成した「アプリパスワード」を使用します。

Q4. Javaでメールに添付ファイルを付けるにはどうすればいいですか?

A4. MimeBodyPartで本文パートと添付ファイルパートを別々に作成し、MimeMultipartでまとめてmessage.setContent()に設定します。添付ファイルは1通あたり25MB程度のサイズ制限に注意してください。

Q5. 「認証に失敗しました」というエラーが出る原因は何ですか?

A5. 最も多い原因は、通常のGoogleアカウントのパスワードを使っていることです。Gmailはパスワードだけで接続する方式を廃止した(個人アカウントは2022年5月、Google Workspaceは2025年5月)ため、2段階認証を有効にしてアプリパスワードを使うか、OAuth2(XOAUTH2)で認証してください。

Q6. Javaで送信したメールの件名や本文が文字化けする場合はどうすればいいですか?

A6. message.setSubject()やmessage.setText()の第2引数に明示的に"UTF-8"を指定してください。多くの場合、これだけで文字化けは解消します。

Q7. Javaで送信したメールが迷惑メール判定される場合はどうすればいいですか?

A7. Fromヘッダーのドメインを、SPF・DKIMで認証されるドメインと一致させてください(Gmail SMTPで送るなら、SMTP認証に使っているGmailアカウントのアドレスをFromに使うのが確実です)。独自ドメインで送信する場合は、そのドメインのSPF・DKIMレコードの設定も必要です。

まとめ

Javaでのメール送信の流れをおさらい

Javaでメールを送信するための基本的な流れは、以下の3ステップです。

  1. 環境準備: MavenなどでJakarta Mailライブラリをプロジェクトに追加する。
  2. サーバー設定と認証: PropertiesオブジェクトにSMTPサーバーの情報を設定し、Sessionを確立する。Gmailの場合はアプリパスワードを取得する。
  3. メッセージ作成と送信: MimeMessageで宛先や件名、本文(テキスト、HTML、添付ファイル)を作成し、Transport.send()で送信する。

この流れとよくあるエラーの対処法を押さえれば、テキスト・HTML・添付ファイル付きのメール送信はひととおり実装できます。

REVISIONS / 改訂履歴
REV.DATE内容
62026-10-15図解を描き直し(図面のデザインにそろえた)
52026-10-14雰囲気だけの挿絵を外した
42026-10-04記載内容の事実確認と修正
32026-08-222026年8月時点の情報で全体を見直し(古い記述を8件更新)
… ほか1回の改訂
12025-09-17初版
NEXT READ本棚から1本

AIで開発を組み直すなら、まずこの5冊から

入門・実践・設計まで、Claude Codeの本をレベル別に5冊選んで比べました。

→ おすすめ5冊を見る

  • この記事を書いた人
  • 最新記事

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

Java入門