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

Java入門

Javaのメール送信!基本からGmail連携まで徹底解説

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

「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つのライブラリが必要です。

  1. Jakarta Mail : メール送信の本体となるライブラリです。
  2. 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つのステップで構成されます。

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

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

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_emailpasswordの部分は、実際に利用するSMTPサーバーの情報に適宜書き換えてください。

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

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

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に設定する値は以下のようになります。

ポイント

  • ホスト名 (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変数に設定します。

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

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

アプリパスワードよりもさらにセキュアな方法として、OAuth2による認証があります。OAuth2を利用すると、ユーザーが自分のGoogleアカウントの認証情報をアプリケーションに直接渡すことなく、安全にAPIアクセスを許可できます。

ただし、OAuth2の実装はアプリパスワード方式に比べて複雑になります。Google API Client Library for Javaなどのライブラリを使い、認証フロー(同意画面の表示、アクセストークンの取得など)を実装しなければなりません。

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

よくあるエラーと解決方法

Javaでメール送信を実装していると、いくつかの典型的なエラーに遭遇することがあります。ここでは、代表的なエラーとその解決策を紹介します。

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

javax.mail.AuthenticationFailedException というエラーは、最もよく見られるエラーの1つです。原因は主に以下の3つが考えられます。

ポイント

  1. メールアドレスまたはパスワードが間違っている:最も基本的な原因です。特に、前述のGmailの例のように、通常のパスワードではなくアプリパスワードを使う必要があるケースを見落としがちです。設定した認証情報が正しいか、もう一度確認しましょう。
  2. Googleアカウントの「安全性の低いアプリのアクセス」が無効:(非推奨ですが)もしアプリパスワードではなく、2段階認証を無効にした上で通常のパスワードを使おうとしている場合、Googleアカウント側で「安全性の低いアプリのアクセス」を許可する必要があります。ただし、セキュリティリスクが高まるため、アプリパスワードの利用を強く推奨します。
  3. SMTPサーバー側のセキュリティ設定:企業のネットワーク内など、特定のIPアドレスからのアクセスしか許可していないSMTPサーバーもあります。環境を確認してみましょう。

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ステップです。

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

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

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

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

-Java入門