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

Java入門

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

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

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

JavaMail API(Jakarta Mail)の基本設定からGmail SMTP連携、添付ファイル・HTMLメール送信まで、実装に必要な手順をこの記事1本にまとめました。

具体的には(1)JavaMail APIの基本設定(2)Gmail SMTP連携(3)添付ファイル・HTMLメール送信、の3つを解説します。

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

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

この記事でわかること

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

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

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

Javaアプリケーションからメールを送信するには、一般的にJavaMail APIという仕組みを利用します。

JavaMail APIはメールを送受信するための標準的なAPIで、比較的簡単にメール送信機能を実装できます。

JavaMail APIとは何か

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

Javaプログラム上でメールを扱うための便利な道具箱のようなものだと考えるとイメージしやすいでしょう。

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

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

以前は手動でライブラリをダウンロードする必要がありましたが、MavenやGradleといったビルドツールを使えば、依存関係の追加だけで簡単にプロジェクトに導入できます。

javax.mailとjakarta.mailの違い

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

しかし、JavaのエンタープライズAPI群がOracleからEclipse Foundationへ移管された経緯(Jakarta EEへの移行)に伴い、パッケージ名がjakarta.mailに変更されています。

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

本記事の基本コード例では、古い書籍やネット記事との互換性を優先してjavax.mail表記を使っていますが、Jakarta Mail 2.x系のライブラリを導入した場合、実体はjakarta.mailパッケージです。

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

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

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

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

  1. Jakarta Mail : メール送信の本体となるライブラリです。
  2. Jakarta Activation : メールのデータ(テキスト、添付ファイルなど)を扱うためのライブラリです。

Mavenを利用しているプロジェクトであれば、pom.xmlファイルに以下の依存関係を追加するだけで準備は完了します。

あわせて読む
<dependencies>
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>jakarta.mail</artifactId>
        <version>2.0.2</version>
    </dependency>
</dependencies>

2026年8月時点のバージョンです。Maven Repositoryで最新バージョンを確認してください。

SMTPサーバーとの関係

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

私たちが書いたプログラムは、このSMTPサーバーに対して「この内容のメールを、この宛先に送ってください」とお願いするクライアントとして動作します。

利用するSMTPサーバーは、契約しているプロバイダのものや、Gmail、Outlookといったフリーメールサービスが提供しているものを利用するのが一般的です。

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

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

それでは、実際にJavaMail APIを使ったメール送信の基本的なコードを見ていきましょう。

ここでは、ごくシンプルなテキストメールを送信する例を紹介します。

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

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

  1. セッションの確立: SMTPサーバーへの接続情報を設定します。
  2. メッセージの作成: 送信者、宛先、件名、本文などを設定します。
  3. トランスポートの準備: メールを送信する準備をします。
  4. メールの送信: 作成したメッセージを送信します。

以下が具体的なサンプルコードです。

上記で追加したJakarta Mail 2.x系の依存関係に対応する、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 = "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_emailpasswordの部分は、実際に利用するSMTPサーバーの情報に適宜書き換えてください。

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

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

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

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

本文と添付ファイルをそれぞれ別のパーツとして作成し、それらを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を使うことで、複数の要素(本文、ファイル)を組み合わせたメールを簡単に作成できます。

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

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

大きなファイルはクラウドストレージに置いてリンクを共有する方法を検討しましょう。

あわせて読む

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として解釈して表示してくれます。

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

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

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

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

// CC(カーボンコピー)
message.addRecipient(Message.RecipientType.CC, new InternetAddress("cc@example.com"));

// BCC(ブラインドカーボンコピー)
message.addRecipient(Message.RecipientType.BCC, new InternetAddress("bcc@example.com"));

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

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

SMTPサーバーの応答が遅い、あるいはネットワーク障害で応答が返ってこない場合、タイムアウトを設定していないとプログラムが無期限にブロックされてしまいます。

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

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

いずれも未設定だとOS標準のタイムアウト(数分単位)まで待つことになり、バッチ処理などで後続処理が長時間止まる原因になります。

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

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

GmailをSMTPサーバーとして利用してJavaからメール送信する方法を示す図解

開発中のテストなどで、手軽に利用できるGmailのSMTPサーバーを使いたい、と考える方は多いのではないでしょうか。

ここでは、GmailをSMTPサーバーとして利用するための手順を解説します。

Gmail SMTPサーバーの設定手順

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

ポイント

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

そして最も重要なのが、認証情報の設定です。通常のGoogleアカウントのパスワードは、セキュリティの観点からそのままでは利用できません。

代わりに「アプリパスワード」を生成して利用する必要があります。

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

  1. Googleアカウントにログインし、「セキュリティ」のページに移動する。
  2. 「Googleへのログイン」セクションにある「2段階認証プロセス」を有効にする。
  3. 「2段階認証プロセス」のページ下部にある「アプリパスワード」を選択する。
  4. 「アプリパスワード」ページでアプリ名(例: JavaMailApp)を入力し、「作成」をクリックする。
  5. 表示された16桁のパスワードをコピーし、コード内のpassword変数に設定します。

このアプリパスワードは一度しか表示されないため、必ず控えておきましょう。

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

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

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

ただし、OAuth2の実装はアプリパスワード方式に比べて複雑になります。

Google API Client Library for Javaなどのライブラリを使い、認証フロー(同意画面の表示、アクセストークンの取得など)を実装しなければなりません。

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

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

実務ではSpring Boot(3.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
spring.mail.username=your_email@gmail.com
spring.mail.password=your_app_password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

あとはJavaMailSenderをインジェクションして使うだけです。

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で確認できます(Mailpitはポート番号がMailHogと同一のため、既存のMailHog利用箇所からの切り替えも容易です)。

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

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

Javaメール送信でよくあるエラーとその解決方法を示す図解

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

ここでは、それぞれの原因と解決策を紹介します。

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

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

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

ポイント

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

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

jakarta.mail.MessagingException: Could not connect to SMTP host(javax.mail系ライブラリの場合はjavax.mail.MessagingException)といったエラーメッセージと共に、SSLやTLSに関する例外が出た場合は、暗号化通信の設定を見直す必要があります。

  • ポート番号の確認: 利用するプロトコル(TLS/SSL)に対応した正しいポート番号(例: 587, 465)が設定されているか確認してください。
  • プロパティの確認: props.put("mail.smtp.starttls.enable", "true"); のような、暗号化を有効にするためのプロパティが正しく設定されているか確認します。
  • SSL利用時の追加設定: 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 を指定することで、ほとんどの文字化けは解消できます。

ただし、一部のメールクライアント(古い携帯電話キャリアメール等)はUTF-8に対応していません。

受信先が限定できない業務メールでは、エンコードにISO-2022-JPを指定してください。

あわせて読む

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

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

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

  • Fromヘッダーの詐称禁止: message.setFrom()で指定するメールアドレスのドメインが、SMTP認証に使っているアカウントのドメインと一致していないと、Gmail側でなりすましと疑われ迷惑メール判定を受けやすくなります。
  • 個人開発では認証アカウントと同じアドレスをFromに使うのが最も手軽な回避策: 本記事のサンプルコードのように、Gmail SMTPで認証しているアカウント自身のアドレスをFromに設定していれば、この問題は基本的に発生しません。
  • 自社ドメインで送信する場合はSPF・DKIMの設定が事実上必須: 独自ドメインのメールアドレスをFromに使う場合は、そのドメインのDNSにSPF・DKIMレコードを設定し、DMARCとの整合性を取っておく必要があります。設定が無いと、コード側にバグが無くても宛先に届きません。

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

Javaメール送信の実務での活用例3選を示す図解

Javaによるメール送信機能は、さまざまなアプリケーションで活用されています。ここでは、具体的な3つの活用例を紹介します。

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

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

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

あわせて読む

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

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

セキュアなアプリケーションには必須の機能といえるでしょう。

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

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

手動での報告作業を自動化し、業務効率を大幅に向上させられます。

あわせて読む

よくある質問

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

A1. Javaでメールを送信するには、Jakarta Mail(旧javax.mail)とJakarta Activationの2つのライブラリが必要です。Mavenを使う場合はpom.xmlに依存関係を追加するだけで導入できます。

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は2024年9月にセキュリティの低いアクセス方法を廃止したため、2段階認証を有効にしたうえでアプリパスワードを生成して使用する必要があります。

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

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

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

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

まとめ

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

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

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

この流れと、よくあるエラー対処法を覚えておけば、大抵のメール送信は問題なく実装できるでしょう。

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

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

-Java入門