- PR -

JavaMailで大量送信

1
投稿者投稿内容
未記入
会議室デビュー日: 2008/04/19
投稿数: 4
投稿日時: 2008-04-19 18:11
JavaMailを使用して大量(50万件)メールの一斉配信を考えております。

<処理概要>
・メール1000件毎にメールサーバにコネクトする。
・随時ループでtransport.sendMessage⇒DB更新を行う。
・DB更新は1件ずつのDELETE-commit
・処理が終わったらCloseして、次の1000件に

上記処理で送信処理を実装していたのですが、250件/分と処理時間にとても時間がかかっております。
これでは15000件/時間なので、すべて完了するのに丸一日以上かかってしまいます。

DB更新処理に時間がかかっているのかsendMessageに時間がかかっているのか
切り分けを行うために、sendMessageをコメントアウトして試したところ、
処理速度は、2000件/分(120000万/時間)出ているため、DB更新自体は害は無いと考えています。メールサーバへアクセスする部分に問題があるのではないかと思われますが、原因がつかめておりません。

やはりループ内で1件1件sendMessageを行う事は、速度的に大幅な遅延をするのでしょうか。
sendMessageにアドレスのリストをまとめてセットする事も試みましたが、
・宛先に送信先のアドレスを指定できない。(undisclosed-recipients:となってしまう)
・受け取った側のメールサーバが処理しきれない
・送信済フラグを更新できない
・アドレスリストのひとつでも不正なアドレスだった場合、すべて送信できなくなる
等の問題により、一件ずつ送信を行う実装にしています。

また、送信遅延の現象は、ロードバランサ経由の場合にしか発生せず、開発側でWEBサーバと同じサーバに存在するSMTPサーバ上では問題ない速度で送信処理が行う事が出来ています。
環境に起因する面もあるのかもしれませんが、確認する手段がわからず困っております。

問題点・解決策等アドバイスがあれば、教えていただけると助かります。
よろしくお願いします。

下記は送信処理を行っているソースを抜粋したものです。
********************************************************************

for (int i = 0; i < cnt; i++) {
try {
//メールサーバコネクト
Transport transport = session.getTransport("smtp");
transport.connect();
//送信用アドレスが1件以上あれば送信処理を行う
for (int idx = 0; idx < SEND_MAX_CNT; idx++) {
// 送信準備
String sendAddr = 送信先アドレス(idx);
//送信
try {
//送信先メールアドレスを指定
message.setRecipients(Message.RecipientType.TO, sendAddr);
transport.sendMessage(message, InternetAddress.parse(sendAddr));
//送信済みのレコードを削除
(DB更新)
} catch (Exception e) {
// 送信失敗
e.printStackTrace();
//エラーのあったレコードを更新する
・・・
}
}
//送信後処理
transport.close();
transport = null;
} catch (Exception e) {
// その他エラー
throw e;
}
}

***************
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-04-19 18:15
これって解答したらスパムメールのほう助罪とかに問われそうですね。
未記入
会議室デビュー日: 2008/04/19
投稿数: 4
投稿日時: 2008-04-19 18:23
某サイトのメールマガジン機能をJavaMailに実装する事になりました。
悪質業者などではございません。
確かに誤解をされる方もいらっしゃるかもしれませんね。

JavaMailは一斉配信するシステムには向かないという噂もちらほら聞いた事があるのですが、実際のところはどうなんでしょう。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-04-19 20:28
複数のサーバを自分でチューニングして自分で動かすべき規模の仕事だと思うなー。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-04-19 23:41
JavaMailはメールサーバじゃないので、
大量送信が得意不得意というのは関係ないですよ。
SMTPサーバのチューニングの話しです。

遅延しているのは外に実際に送った場合だけですか?
未記入
会議室デビュー日: 2008/04/19
投稿数: 4
投稿日時: 2008-04-20 00:15
SMTPのチューニングというのは、メールサーバの設定を何か変え無ければならないという事でしょうか。
その辺の知識は疎いのと、顧客環境の都合上こちらでメールサーバの詳細は聞かされておりませんでした。

実際に送信処理を行った場合に、遅延が発生します。
ただ、環境によって送信速度に差異が発生するのは、メールサーバの設定なのかTomcatの設定なのか、環境上の問題だとしたらどこを修正したらよいのか、問題となる部分が特定できず行き詰っていたところです。

ロジック上で問題がありそうな部分があれば修正が必要であるかと思われますが、ロジックを修正しても限界があるのではないかとも思っています。
(ちなみにこれマルチスレッドで起動してます)

transport.sendMessage
上記部分をはずすと速度がアップするする事から、おそらく通信時に問題があるのではと思っているのですが。
上記メソッドは、メールサーバの状態によって、応答時間が遅くなる等の現象が起きえたりするのでしょうか。
(メール送信要求が溜まっている場合・SMTP設定が○○の場合等)
1

スキルアップ/キャリアアップ(JOB@IT)