JavaアプリケーションからGmailのメールを送受信する

こんにちは。CData Software Japanエンジニアの浦邊です。 本記事ではCData Gmail JDBC Driverを使ってJavaプログラムやJDBCに対応したアプリケーションからGmailでメールを送受信する方法を紹介します。

CData Gmail JDBC DriverはGmailへのJDBCインタフェースによるアクセスを実現するドライバです。 このドライバを利用することで、JavaプログラムからGmailに接続し、受信メールの取得などを以下のようにSQLで実行することができます。

受信ボックスのメール参照

select [Id], [Date], [Subject], [From] from [INBOX];

Gmailの接続方法にはIMAPプロトコルを利用する方法と、REST APIを利用する方法があります。 機能に大きな違いはありませんが、IMAPではユーザ名、パスワードによる認証、RESTではOAuthによる認証を利用します。 OAuth認証ではユーザによるブラウザ上での認証が必要ですが、コード内にユーザ名とパスワードを指定する必要がありません。

CData Gmail JDBC Driverのインストール

CData Software Japan社のCData Gmail JDBC Driverダウンロードページにアクセスしてください。 ダウンロードページの[ダウンロード 評価版]をクリックすると必要事項入力画面が表示されます。

f:id:urabe_shintaro:20201119115539p:plain

必要事項を入力し、[ダウンロード]をクリックするとCData Gmail JDBC Driver評価版のインストーラがダウンロードされます。 ダウンロードしたファイルをダブルクリックするとインストーラが起動しますので、ウィザードに従ってインストールしてください。 途中、ライセンスサーバーへのオンラインアクティベーションが行われるためネットワーク環境に接続されている必要があります。 ライセンスサーバにアクセス出来ないネットワーク環境の場合は、CData Software Japan テクニカルサポートまでお問い合わせください。

接続

JDBC接続では一般的に以下のようにユーザ名やパスワードなどの接続項目(接続プロパティ)を一つの文字列(接続文字列)で与えます。

jdbc:gmail:接続プロパティ1=値1;接続プロパティ2=値2;...

Javaコードで接続オブジェクトを生成する際には以下のようにgetConnectionの引数に接続文字列を指定します。

Connection conn = DriverManager.getConnection("jdbc:gmail:user=myuseraccount;password=mypassword;");

接続プロパティ

必要な接続プロパティは接続方法によって異なります。 以下にIMAPとRESTの接続プロパティを示します。

IMAP

プロパティ名
Schema "IMAP"
User Gmailメールアドレス
パスワード Gmailパスワード

REST

プロパティ名
Schema "REST"
InitiateOAuth "GETANDREFRESH"
AuthScheme "OAuth"
OAuthClientId OAuthクライアントID
OAuthClientSecret OAuthクライアントシークレット
CallbackUrl コールバックURL

2021年2月 GmailのBasic認証サポート終了

こちらの記事にあるように、Googleは2021年2月から「安全性の低いアプリ」(LSA : Less Secure App)からのアクセスを遮断します。 Gmailはユーザ名とパスワードで認証を行うBasic認証がこれに該当するため、この認証方式を使っているアプリケーションは2021年2月までにOAuth認証に切り替える必要があります。 CData Gmail ドライバはBasic認証、OAuth認証のどちらにも対応しています。OAuth認証を使用する場合はヘルプを参考にしてください。

ドライバの使用

ここからはドライバを利用してメールを送受信する方法を紹介します。

受信メールの参照

受信メールは日付やタイトルなどのヘッダ情報とメッセージ本文を別々のクエリで取得します。 メッセージ本文を取得するにはヘッダ情報のメッセージIdをクエリ条件に指定する必要があります。

ヘッダ情報の取得

受信メールはINBOXビューを参照します。 以下のクエリではId、受信日、タイトル、送信元メールアドレスを取得します。

select [Id], [Date], [Subject], [From] from [INBOX];

Javaコード

//SQLの実行
Statement stat = conn.createStatement();
stat.execute("select [Id], [Date], [Subject], [From] from [INBOX]");

//結果の取得
ResultSet rs=stat.getResultSet();
while(rs.next()) {
  System.out.println("Id = " + rs.getString("Id"));
  System.out.println("Date = " + rs.getString("Date"));
  System.out.println("Subject = " + rs.getString("Subject"));
  System.out.println("From = " + rs.getString("From"));
}

メッセージ本文の取得

以下のクエリでは指定したメッセージIdのメッセージ本文を取得します。

select [MessageBody] from [INBOX] where [Id] = '<メッセージId>'

Javaコード

//SQLの実行
Statement stat = conn.createStatement();
stat.execute("select [MessageBody] from [INBOX] where [Id] = '<メッセージId>'");

//結果の取得
ResultSet rs=stat.getResultSet();
while(rs.next()) {
  System.out.println("MessageBody = " + rs.getString("MessageBody"));
}

メールの送信

メールの送信はSendMailMessageストアドプロシージャを使います。

以下にメールを送信するクエリの例を示します。 パラメータのTo、CC、BCCに宛先のメールアドレスを指定します。 複数のメールアドレスを指定するときはセミコロン「;」で区切ります。 Subjectにメールのタイトル、Contentにメールの本文を指定します。

exec SendMailMessage 
  @To='[email protected]', 
  @CC='[email protected]', 
  @BCC='[email protected]', 
  @Subject='テストメッセージ', 
  @Content='テストメッセージ本文';

Javaコード

CallableStatement cstmt = conn.prepareCall("SendMailMessage");
cstmt.setString("TO", "[email protected]");
cstmt.setString("CC", "[email protected]");
cstmt.setString("BCC", "[email protected]");
cstmt.setString("Subject", "テストメッセージ");
cstmt.setString("Content", "テストメッセージ本文");
cstmt.execute();

添付ファイルの指定

メール送信時に添付ファイルを指定する例を示します。 AttachmentPath#TEMPという一時テーブルに添付ファイルのパスを登録し、それをSendMailMessageのAttachmentPathに指定します。

insert into AttachmentPath#TEMP(AttachmentPath) values('C:\\Temp\\Test1.xlsx');
insert into AttachmentPath#TEMP(AttachmentPath) values('C:\\Temp\\Test2.xlsx');

exec SendMailMessage 
  @To='[email protected]', 
  @CC='[email protected]', 
  @BCC='[email protected]', 
  @Subject='テストメッセージ', 
  @Content='テストメッセージ本文';
  @AttachmentPath=AttachmentPath#TEMP;

Javaコード

Statement stat = conn.createStatement();
stat.executeUpdate("insert into AttachmentPath#TEMP(AttachmentPath) values('C:\\Temp\\Test1.xlsx')");
stat.executeUpdate("insert into AttachmentPath#TEMP(AttachmentPath) values('C:\\Temp\\Test2.xlsx')");

CallableStatement cstmt = conn.prepareCall("SendMailMessage");
cstmt.setString("TO", "[email protected]");
cstmt.setString("CC", "[email protected]");
cstmt.setString("BCC", "[email protected]");
cstmt.setString("Subject", "テストメッセージ");
cstmt.setString("Content", "テストメッセージ本文");
cstmt.setString("AttachmentPath", "AttachmentPath#TEMP");
cstmt.execute();

DBVisualizerでのドライバの利用

データベースツールDBVisualizerでCData Gmail JDBC Driverを使用する方法を紹介します。

ドライバの追加

メニューの[Tools]から[Driver Manager]を開きます。 [+]ボタンをクリックして新しいドライバを追加します。

f:id:urabe_shintaro:20201119115555p:plain

[Name]に任意の名前を入力し、[URL Format]に「jdbc:gmail:」と入力します。

f:id:urabe_shintaro:20201119115605p:plain

続いてドライバファイルを選択します。 右のフォルダアイコンをクリックするとファイル選択画面が開くので、インストールしたドライバファイル「cdata.jdbc.gmail.jar」を選択してください。 デフォルトでは以下のパスにドライバファイルがインストールされています。

C:\Program Files\CData\CData JDBC Driver for Gmail 2020J\lib\cdata.jdbc.gmail.jar

接続の作成

メニューの[Database]から[Create Database Connection]を選択します。 [Driver]に先ほど追加したドライバ名を選択し、[Database URL]に接続文字列を入力します。

f:id:urabe_shintaro:20201119115618p:plain

入力が完了したら[Connect]をクリックして接続します。 接続に成功すると以下のようにテーブルの一覧が参照できます。

f:id:urabe_shintaro:20201119115627p:plain

SQLの実行

メニューの[SQL Commander]から[New SQL Commander]をクリックしSQL実行画面を開きます。 SQLを入力し、実行ボタンを押下またはCtrl+Enterを入力すると入力したSQLを実行できます。

f:id:urabe_shintaro:20201119115638p:plain

おわりに

今回はCData JDBC Gmail Driverを使ってJavaからGmailのメールを送受信する方法を紹介しました。 JDBCインタフェースを利用することで、複雑なAPIへのアクセスを簡単なSQL文で実行することができます。 CData JDBC Gmail Driverは30日間無料でお使いいただけます。 JavaアプリケーションとGmailとの連携をご検討の方はぜひお試しください。

トライアル・お問い合わせ

関連コンテンツ