tkxmailによるメール送信の方法(4)
マルチスレッドでの送信

前回まで、tkxmailのJavaSEでの使い方を説明しました。パラメータをそろえて、クラスメソッドを呼び出すだけで、HTMLメールやファイル添付メールを送信できることが分かったと思います。

ただ、実際の開発で使用するには、あと少し工夫が必要です。メール送信は数秒程度かかる「重い処理」なので、普通はマルチスレッドで使用します。そこで、JavaEEでの使い方は次回説明することにして、今回は、マルチスレッドでの使い方を解説します。

あ、それから、「その1」に掲載したtkxmailですが、バージョンアップしました。これ以降の解説では、新版のtkxmailが必要ですから、よろしければ、再度ダウンロードをお願いします。

マルチスレッドでのメール送信

マルチスレッドというと、難しいと思われがちですが、それは考え方を理解するのに骨が折れるだけで、実際に使うのは案外簡単です。

JavaSEでは、コンカレントユーティリティを使うと、簡単にマルチスレッドを利用できます。手順は簡単で、次の2つです。

1.Runnableインタフェースを実装したメール送信を行うクラスを作成する

2.mainメソッドでメール送信を行うクラスを生成し、コンカレントユーティリティで実行する

なお、この解説のNetBeans用プロジェクトファイルを以下からダウンロードできます。

http://k-webs.jp/download/mailsample_1_concurrent.zip

Runnableインタフェースを実装したメール送信クラス

次のSendmail.javaがRunnableインタフェースを実装したメール送信クラスです。このクラスは、送信のためのパラメータをフィールド変数に持ち、それらを受け取るためのコンストラクタも持つ必要があります。

単純なテキストだけのメールを送信しますが、前回までの解説を読んでいれば、ファイル添付やHTMLメールを送信するクラスも、パラメータを追加するだけで簡単に作成できるはずです。

Sendmail.java

package mailsample_1;

import java.util.Properties;
import net.tkxtools.Mail;

public class Sendmail implements Runnable{
    // フィールド変数
    private  final Properties  prop; // サーバー情報
    private  final String to;        // 相手のメールアドレス
    private  final String from;      // 自分のメールアドレス
    private  final String subject;   // メールタイトル
    private  final String body;      // メール本文
  // コンストラクタ
    public  Sendmail(Properties prop, String to, 
             String from, String subject,String body){
        this.prop       =   prop;
        this.to         =   to;
        this.from       =   from;
        this.subject    =   subject;
        this.body       =   body;
    }
    // 送信処理
    @Override
    public void run() {
        Mail.sendHtml(prop, to, from, subject, body);
    }
}

注目するのは最後のrunメソッドです。

マルチスレッドで実行する内容は、rumメソッドの中に書く必要があります。というのも、runメソッドに書いた内容が、生成したスレッドの中で実行されるからです。そこで、前回までお話ししたMailクラスのメソッド呼び出し、Mail.send(~)をここへ書いています。

なお、パラメータが前回までと少し違うことに注意してください。

メールID、メールパスワード、サーバー名、ポート番号の4つは、プロパティ(Properties)にセットして受け渡しするように変更しました。やはり、ID、パスワードなどをコードの中にハードコーディングするのは、好ましくないという判断からです。

このPropertiesオブジェクトを作成するのはとても簡単です(次項で解説)。

おかげで、メール送信クラスでは、パラメータの数が減って書きやすくなりました(従来の方法もメソッドとしては残してあります)。

送信を行うmainメソッド

これは、mainメソッドの中で、前項のSendmailクラスのオブジェクトを生成し、それを使ってメールを送るだけの簡単な処理です。送信パラメータなども、mainメソッドの中で指定します。

Exec.java

package mailsample_1;

import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import net.tkxtools.Mail;

public class Exec {
    public  static void main(String[] args){
        Properties prop =   Mail.createProp("mail.xml");  // サーバー情報
        String to      = "tanaka@mail.com";  // 送り先メールアドレス
        String from    = "student@webs.jp";  // 送信元メールアドレス
        String subject = "送信テスト";          // メール表題
        String body    = "こんにちは";          // メール本文   
        
        Sendmail sendmail 
          = new Sendmail(prop, to, from, subject, body);// オブジェクトを作成
        ExecutorService es = Executors.newSingleThreadExecutor(); // スレッドプール作成
        es.execute(sendmail);       // マルチスレッドで実行    
        es.shutdown();              // スレッドプールを閉じる
        System.out.println("送信終了");
    }
}

mainメソッドの最初の行は、Propertiesオブジェクトを作成する処理です。

 Properties prop = Mail.createProp(“mail.xml”);

createPropメソッドは、tkxmaiライブラリのMailクラスが持っているメソッドです。また、mail.xmlはメールパスワードなどを書いたテキストファイルで、XMLの形式で作成しておきます。次のような内容で、この形式は、Propertiesクラスで規定されています。赤字のところだけがそれぞれの状況に合わせて変更する部分です。他はいつもこのまま使ってください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
   <entry key="smtpUser">**メールID**</entry>
   <entry key="smtpPassword">**メールパスワード**</entry>
   <entry key="port">587</entry>
   <entry key="host">**メールサーバー名**</entry>
</properties>

なお、mail.xmlファイル名には、ドライブ・フォルダ名を含めて次のように書いて構いません。つまり、好きなところに置いていて構わない、ということです。

Mail.createProp(“D:\info\mail.xml”);

※ダウンロードしたプロジェクトファイルをNetBeansで開き、左上の[プロジェクト]の横にある[ファイル]をクリックしてっプロジェクトを構成するファイルを見ると、web.xmlがあります。[プロジェクト]には表示されないので注意してください。

最後に、マルチスレッドで実行する下段の3行は、おきまりの書き方で、いつも、このように書きます。マルチスレッドで実行したいオブジェクト、ここではsendmailですが、それをexecuteメソッドの引数に渡してやるだけです。簡単ですね。

※マルチスレッドの詳細は「わかりやすいJava オブジェクト指向入門偏」の 374ページを見てください。

まとめ

実行してみると、アッという間に「送信終了」という表示がコンソールに現れます。これがマルチスレッドの効果です。メール送信は他のスレッドでまだ作業中のはずですが、メインのスレッドはすぐに終わってしまいます。つまり、送信完了を待たずに次の作業ができる、ということです。

その5へ

読者になる

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。