Emailを送信するには(JavaMode編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:Web・通信

Emailを送信するには(JavaMode編)

【概要】

Email(電子メール)は、もはや私達の仕事には欠かせないツールとなりました。そんなEmailをPROCESSINGから手軽に送る方法を紹介したいと思います。

とはいえPROCESSINGは、標準の命令だけではEMailを送ることができません。そこでPROCESSINGにJavaのEmail送信ライブラリを追加する事で、これを実現します。※

※本記事はJavaMode(PCで動作するプログラム)用です。PROCESSINGを使ってAndroidでメールを送る方法については、「Emailを送信するには(AndroidMode編)」を参照してください

JavaのEmail送信ライブラリは幾つか存在しますが、今回は使い方がシンプルな Apache Commons Email を利用したいと思います。

PROCESSINGから Apache Common Email を利用するには、以下の手順にしたがって準備を行います。

 

【準備】

ライブラリを入手する

まずは、公式サイトからライブラリを入手しましょう。

Apache Commons Email から最新版のライブラリをダウンロードして下さい。2018/07 月時点の最新版は Ver1.5 になります。

ダウンロードすると「commons-email-1.5.jar」のような名前のファイルができあがると思います。

Apache Common Email が動作するためには、以下のライブラリも必要です。

JavaMailは、公式サイト の「Download JavaMail Release」からダウンロードします。2018/07 月時点の最新版は Ver1.6.1 になります。


ダウンロードすると「javax.mail.jar」のような名前のファイルができあがると思います。

 

ライブラリをPROCESSINGに認識させる

入手したライブラリをPROCESSINGに認識させます。以下の手順で作業をしてください。

1.スケッチ格納フォルダ配下のlibraries配下にフォルダ作成

スケッチ格納フォルダ配下にlibraries フォルダがあると思いますので、その中に移動して、適当な名前のフォルダ(例えばcommonsemail など)を作成します。

スケッチ格納フォルダは、標準エディタの「ファイル→設定」で、スケッチブックの場所に指定しているフォルダです。


上記例なら D:\processing-3.3.6\src\libraries に適当な名前のフォルダ(例えばcommonsemail など)を作成します。


2.上記フォルダの中に、さらに library フォルダを作成します

3.library フォルダに、ダウンロードしたファイルを格納します

4.Apache Common Email の jar ファイルをリネームします
commons-email-1.5.jar を(スケッチ格納フォルダ)\libraries に作成したフォルダ名と同じ名前にリネームします。

本例であれば、commons-email-1.5.jar を commonsemail .jar に変更します。


以上で準備完了です。

もしも標準エディタを起動済みの場合は、一度標準エディタを終了して再起動してください。

Email送信プログラムの作成では、SSLやらTSL、SMTPなどの技術用語が登場します。

各用語について「あまりよくわからない」と思う方は、下記コラムに最小限の用語解説をまとめておきましたので、よろしければ参考としてください。

 

【詳細】

メール送信オブジェクト生成

送信オブジェクト生成Email se = new SimpleEmail();
MultiPartEmail me = new MultiPartEmail();
HtmlEmail he = new HtmlEmail();

se : SimpleEmailインスタンス
me : MultiPartEmailインスタンス
he : HtmlEmailインスタンス

SimpleEmailクラスはテキストだけのメールを送る場合に利用します。文字通りシンプルなEmail送信用ですので、ファイルを添付したり、HTMLメールを送ることはできません。

テキストメールにファイルを添付したい場合は、MultiPartEmailクラスを利用します。

また HTML形式のメールを送りたい場合は、HtmlEmailクラスを利用します。HtmlEmailクラスはMultiPartEmailクラスを継承しているので、ファイルを添付することも可能です。

 

送信パラメータの設定

メールサーバ指定void email.setHostName(String hostName);

hostName : メールサーバ名。Gmail(Google)なら smtp.gmail.com
email : SimpleEmail、MultiPartEmail、HtmlEmailのインスタンス

送信先のメールサーバを指定します。メールサーバのIPがわかっている場合は、IPアドレス指定でもOKなようです。

例えば上記例であれば、送信先に Gmail(Google)を指定しています。

 

各種設定Email em = email.setFrom(String fromName);  //送信元アドレス
Email em = email.setSubject(String subject);   //タイトル

fromName : 送信元のメールアドレス(通常は自分のメールアドレス)
subject : メールタイトル
email : SimpleEmail、MultiPartEmail、HtmlEmailのインスタンス
em : Emailインスタンス

setFrom()とsetSubject()メソッドで、自分のメールアドレスと、メールタイトルを設定します。

こんな感じです。簡単ですね。

 

各種設定Email em =  email.setSSLOnConnect(boolean ssl);  //SSL/TSL通信
void email.setSslSmtpPort(String sslSmtpPort);  //SSL/TSLポート番号
void email.setSmtpPort(int aPortNumber);  //SMTPポート番号

ssl : SSL/TSL利用指定。trueなら使用する
sslSmtpPort : SSL/TSLで利用するポート番号。なぜか文字列指定
aPortNumber : SSL/TSLを利用しない場合のポート番号
email : SimpleEmail、MultiPartEmail、HtmlEmailのインスタンス
em : Emailインスタンス

setSSLOnConnect()メソッドで、メール送信時にSSL/TSLを利用するかどうかを指定します。今どきのメールサーバに送信するなら、通常は true にしておきます。

SSL/TSLを利用する場合は、setSslSmtpPort()メソッドでポート番号を指定します。Gmail(Google)の場合なら、465か587になります。

SSL/TSLを利用しないノーマルなSMTP通信なら、setSmtpPort()メソッドでポート番号を指定します。通常は25になりますが、今どきド・ノーマルなSMTP通信を受け付けるメールサーバは無いでしょう・・・。

.

各種設定void email.setAuthentication(String userName,String password);  //認証情報
void email.setHeaders(Map<String,String> header);  //メールヘッダ
void email.setCharset(String newCharset);  //文字コード

newCharset : 文字コード指定
userName : 認証用ユーザ名
password : 認証用パスワード
header : メールヘッダ文字列
email : SimpleEmail、MultiPartEmail、HtmlEmailのインスタンス
em : Emailインスタンス

setAuthentication()メソッドでは、認証用のユーザ名とパスワードを指定します。送信先となるメールサーバが SMTP AUTH などで認証を要求する場合に指定します。

認証は、Gmail(Google)の場合は必須です。Gmail(Google)なら、あなたのGmailアカウントを設定します。

Googleへのログインに2段階認証を利用している場合は、通常のパスワードではなく、別途アプリケーション用のパスワードを発行して、それを設定します。

アプリケーション用パスワードの発行については、以下のサイト様などが参考となります。

メールにファイルを添付する場合は、setHeaders()メソッドを使ってメールヘッダに base64 などを指定すると良いでしょう。

上記はメールヘッダに「Content-Transfer-Encoding」指定として「base64」を指定した例です。

setCharset()メソッドでは、メールに使う文字コードが指定可能です。最近はいろいろな文字コードに対応したプログラムが整備されてきていますが、電子メールでは  ISO-2022-JP を使うのが基本となります。

 

送信先の設定

送信先指定Email em = email.addTo(String toName);
Email em = email.Email setTo(Collection<InternetAddress> aCollection);

toName : 送信先のメールアドレス(相手のメールアドレス)
aCollection : 送信先のメールアドレスリスト
email : SimpleEmail、MultiPartEmail、HtmlEmailのインスタンス
em : Emailインスタンス

宛先が1つの場合はaddTo()メソッドで、相手のメールアドレスを指定します。

宛先が複数ある場合は、setTo()メソッドにInternetAddressクラスのリスト(相手先メールアドレスのリスト)を渡します。

上記は複数の宛先(toAddress1とtoAddress2)へメールを送信する例です。

 

ファイルを添付する

添付インスタンス生成EmailAttachment attachment = new EmailAttachment();
void attachment.setDisposition(EmailAttachment.ATTACHMENT);

attachment : Email添付用インスタンス

ファイルを添付するには、まずは添付情報を管理するEmailAttachmentクラスのインスタンスを生成します。

その上で、ファイルを添付する事をsetDisposition()メソッドで明示します。setDisposition()の引数にはEmailAttachment.ATTACHMENTを指定します。

 

添付パス指定void attachment.setPath(String aPath);
void attachment.setName(String aName)

aPath : 添付ファイルへのパス
aName : 添付した際の名前
attachment : Email添付用インスタンス

setPath()で添付するファイルパスを指定します。setName()を使うと、添付した際のファイルの名前を変更する事が可能です。

例えば girl.jpg ファイルを添付した上で、setName(“boy”); とすると、添付されたファイル名が “boy” になります。

ただし setName()に日本語を使うと、メールを受信したアプリケーションによっては文字化けを起こすことがあるので注意してください。

名前を指定しなかった場合は、添付ファイル名がそのまま渡されます。

 

添付するMultiPartEmail me = email.attach(EmailAttachment attachment);

attachment : Email添付用インスタンス
email : MultiPartEmail、HtmlEmailのインスタンス

MultiPartEmailやHtmlEmailの場合は、attach()メソッドにて上記で作成した添付情報を与える事で、ファイルを添付することが可能です。

上記の例では、スケッチ格納フォルダの data フォルダ配下にある girl.jpg 画像をメールに添付しています。

SimpleEmailにはファイルは添付できません。

またHtmlEmailの場合は、 以下に紹介するembed()メソッドで、HTML内に画像を埋め込む事も可能です。

 

画像を埋め込むString cid = email.embed(File file);
String cid = email.append(File file, String cid);

file : 添付するファイルインスタンス
cid : Content-ID。embed(File file)の場合はランダムなCIDが戻される
email : HtmlEmailのインスタンス

HTMLメールの場合は、画像を直接メールの中に埋め込むことができます。

例えば上記のような感じです。

 

メールを送信する

送信するString mime = email.send();

mime : Message-IDヘッダの内容
email : SimpleEmail、MultiPartEmail、HtmlEmailのインスタンス

send() メソッドでメールの送信要求を行います。送信に失敗すると、EmailException例外かIllegalStateException例外が発生します。

送信エラーは、命令を発行してから数秒後に発生する事があるので注意してください。

 

【関連記事】

 


サンプルプログラム

シンプルなメール送信例:

Googleのメールサーバに電子メールを送信します。

実際に利用する際には、ユーザ名、パスワード、宛先アドレスなどは、ちゃんと正しいものに書き換えてから利用して下さい。

当たり前ですが、不正利用(迷惑メールをなげるなどに利用)してはいけません。

<出力サンプル>

ファイル添付送信例:

ファイルを添付して送信する例です。また送信先に複数の宛先を指定しています。

<出力サンプル>

(画像URL:illust-AC 様:神林空 さん)

 

HTMLメール送信例:

HTML形式のメールを送信します。

このメールは、普通のテキストパート、HTMLパート、添付ファイルパートの3部構成になっています。

画像はCIDにより、HTMLメール内に埋め込んでいます。

<出力サンプル>

(画像URL:illust-AC 様:神林空 さん)


コラム:電子メール送信に関する予備知識

SMTPとPOP3

電子メールを送信するには、SMTP(Simple Mail Transfer Protocol)と呼ばれるプロトコル(通信手順)が利用されます。

メールを送りたいプログラムやスマホ上のアプリが、メールサーバと呼ばれるコンピュータに、SMTPと呼ばれる手順に従って電子メールを送ります。

送られた電子メールを、メールサーバから自分のプログラムやアプリに取り出すには、POP3(Post Office Protocol Version3)と呼ばれる手順が利用されます。

電子メールの送信手順がSMTPで、受信手順がPOP3ですね。

(画像URL:illust-AC 様:minokikakuさん、8marchさん)

SMTPで電子メールを送るポート番号には、25番がよく使われます。ポート番号とは、サーバがいろいろな要求を受け付けるための「要求ごとに割り当てられた番号」の事です。

サーバを巨大な市民病院と考えて下さい。この病院にはサービス(内科、外科、耳鼻科、胃腸科、心療内科などなど)ごとに専用の窓口があります。この窓口1つ1つにつけられた番号がポート番号です。

電子メールを送るには、メールサーバという病院の25番窓口(25番ポート)に、SMTPという手順に従って書類を準備して届ける必要があるのです。

(画像URL:illust-AC 様:猫島商会さん、8marchさん)

SMTPの問題点

ところがこのSMTPという手順はあまりにもシンプル過ぎたため、インターネットが普及するにしたがって問題点が指摘されるようになりました。

それは、SMTPの手順に従えば「だれでもメールサーバに要求ができる」という点でした。SMTPには、そもそも認証機能(正規ユーザかどうか確かめる機能)が存在していなかったのです。

あなたが契約している(あるいは、あなたが建てた)メールサーバに、誰でもメールの送信要求が行えたのです。・・・ちょっと困りますよね?。


(画像URL:illust-AC 様:minokikakuさん、麦さん、shinya さん)

 

POP before SMTP

そこで考え出されたのが、POP before SMTP という手順でした。

これは簡単に言えば、SMTPでメールを送信する前に、該当メールサーバにPOP3手順で認証を行ってから、送信要求を行うというものです。

POP3には元々、ユーザ名とパスワードで正規ユーザかどうかを確認する手順が備わっていました。

あなた宛の電子メールを誰でも見る事ができたら嫌ですよね?。だからメールを受信する(見る)POP3手順には、最初から「あなたはXXXさんですよね?」と確認する機能が備わっていたのです。


(画像URL:illust-AC 様:minokikakuさん、麦さん)

これで安心・・・といけば良かったのですが、そうは問屋がおろしませんでした。実はPOP3にもセキュリティ上の重大な欠点があったのです。

それはPOP3でユーザ認証を行うためにユーザ名とパスワードを送信する際、これらが平文(つまり誰でも読める状態)で通知されていた事でした。

だれかがインターネットを盗聴していると、平文のユーザ名とパスワードは簡単に漏洩してしまいます。

(画像URL:illust-AC 様:minokikakuさん、麦さん、shinya さん)

 

APOP

それダメじゃん・・・という事で、POP3で認証する際に送られるユーザ名とパスワードを暗号化する手順が考え出されました。

これがAPOP(Authenticated Post Office Protocol )です。

よし、これで完璧・・・なら良かったのですが、さらに「残念くん」は続きます。

APOPが暗号化に利用しているMD5という関数は、いろいろな欠点が発見されており、もはや暗号化の意味を失いつつあります。

おまけにAPOPで暗号化されるのは、あくまでユーザ名とパスワードだけ。つまりメール本文は、あいかわらず平文で送信されるという落ちがついていました。

秘密のムフフな文章を送信すると、メール本文がダダ漏れになる。。。という事ですね。これはイケていません。

つまりPOP before SMTPもAPOPも、セキュリティ的には落第というわけです。

セキュリティに甘い業者(通信プロバイダー)の一部では、いまだにこれらの手順が利用可能だったりしますので、注意してください。


(画像URL:illust-AC 様:minokikakuさん、麦さん、shinya さん)

 

SMTP-AUTH

そもそも事の発端は、「SMTPに認証機能がない」事でした。SMTPは性善説に従って作られていたんですね。

だからメールサーバがスパムメール業者の踏み台などにされたわけです。

そこでSMTPにも、まともな認証機能をつけましょうという事で登場したのがSMTP-AUTHです。

SMTP-AUTHではCRAM-MD5やDIGEST-MD5という「それなりに安全性」を確保した方法で、メールを送信する前にユーザ名やパスワードが交換され、正規ユーザであるかどうかが確認されます。

またセキュリティを確保するためには、SMTP-AUTH だけでは十分ではありません。なぜならメール本文が暗号化されていなければ、APOPと同じ問題を抱えることになるからです。

そこで近年では、SMTP-AUTH にSSL を用いた SMTP AUTH over SSL や、SMTP over SSL が使われています。SMTP over SSL については下記を参照してください。

SMTP-AUTHではポート587番が利用されます。

 

SMTP over SSL(SMTPs)

安全にユーザ認証ができたとしても、メール本文が平文で通知されているのでは、セキュリティ的にはザルですね。

そこで登場したのが SMTP over SSLです。

これはSMTPに関する通信手順をSSL(Secure Sockets Layer)で暗号化して行うものです。SSLで、アプリケーションとメールサーバ間の通信内容がすべて暗号化されるため、メールを安全に自分のメールサーバまで届ける事が可能です。

この時に使われる暗号化方式が公開鍵暗号方式なのですが、詳しくは割愛します。

ただし SMTPsで暗号化されるのはアプリケーション(スマホ)と自分のメールサーバ間の通信だけですので、相手にメールが届くまでにあるどこかで通信手順が旧式だと、結局メールが漏洩する可能性があります。

(画像URL:illust-AC 様:minokikakuさん、beepさん)

近年ではこのような理由から、サーバ間の通信にもSSLを利用した https を採用し、さらにメール受信に使うPOP3手順にもSSLを採用したPOP3sが使われるようになってきました。

(画像URL:illust-AC 様:minokikakuさん、beepさん)

SMTPsには465番のポート番号が使われます。

 

TLS

上記で説明したようにSSLは電子メールの送受信に限らず、インターネットを介して通信する際のセキュリティを確保するキモとなる技術でした。

なぜ「でした」かといえば、2014年にSSLに致命的な欠点がある事が判明したからです(こんなんばっかですね・・・)。

そこで現在では、SSLではなくTLS(Transport Layer Security)が利用されるようになっています。TLSの事をSSL/TLSと表記する事もあります。これはTLSがSSLをベースに開発された技術だからです。

セキュリティを重視するのであれば、SSL/TLS(TLS)を利用する必要があります。ちなみに https や POP3s に使われる SSL も、現在では※ TLS となっています。

※古いブラウザやOSを利用している場合は、TLSではなくSSLが使われている可能性があるので注意が必要です

TLSには TLS1.0、1.1、1.2、1.3  という複数のバージョンがあります。

TLSなら完璧・・・かといえば、そうではなく、非常に残念な事に TLS1.0 や 1.1には Heartbleed  や POODLE と呼ばれる攻撃方法がある事が判明しており、現在では非推奨とされています。

このためセキュリティを重視するなら、TLS1.2 以上、可能であれば 1.3 を利用する事が推奨されていますが、まだまだ対応が十分に行き渡っていないというのが現状のようです。

ここまでなが~い説明をしましたが、上記サンプルプログラムで Googleのメールサーバにメールを送る際にも TLS が利用されているのがわかると思います。

上記の記事を書くにあたっては、以下のサイト様を参照させて頂きました。ありがとうございます。

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。