- PR -

javaMailのリスナークラスの使用について(補足)

1
投稿者投稿内容
優子
常連さん
会議室デビュー日: 2004/03/26
投稿数: 39
投稿日時: 2004-12-24 11:47
#情報を補足します。

今日は、優子です。
javaMailを使用しているのですが、MimeMessage#setRecipients()メソッドで送信先をしていして送信した時、
そのアドレスが無効な場合(fadfgagasggagg@yahoooo.co.jp等)、別処理をしたいと思っています。
その際、メッセージが正しく送れていない事をハンドルするリスナークラスがあり(TransportAdapter#messageNotDelivered())、このメソッドをオーバーライドしてみたのですが、
実行しても呼ばれず、MimeMessage#setFromで指定した送信元アドレスにメールが送れなかったという通知戻ってきました。

メールアドレスが無効な時というのはそもそもリスナー対象外なのでしょうか?

あと例外(Exceptionでtry/catchしても)でハンドルしても無理でした。

ご存知の方いらっしゃいましたらご返答をお願い致します。
以上です。


開発環境
WIN2000
Eclipse 2.1
Tomcat 4.1
ホッシー
会議室デビュー日: 2004/10/22
投稿数: 13
投稿日時: 2004-12-24 12:35
JavaMailで正しく送れていないという通知は、指定しているメールサーバが処理できないって言うときに有効になるかと思います。

たとえば、fadfgagasggagg@yahoooo.co.jpにメールを送るとき、
JavaMailClient --> 自社メールサーバ(abc.co.jp) --> 相手メールサーバ(yahoooo.co.jp)
と転送されていきます。

ここで自社メールサーバはfadfgagasggagg@yahoooo.co.jpが存在するしないにかかわらず、自社宛メールじゃないので転送を試みるよってな感じで一度受け取ります。
この時点でJavaMailClientの処理は正常に終了してしまいます。
(そうしないといつ届くかわからないメールにたいして非常に長い待ちが発生してしまいます。)

ちなみに、自社メールあての存在しないアドレスfadfgagasggagg@abc.co.jpに送信を試みると、自社メールサーバはエラーを返してくれ、JavaMailClientでハンドリングできます。

これは自分のメーラーでも確認できると思いますよ。
(あて先のない自社ドメインのメールを打つと即座にエラーが表示されます。Thunderbirdでは・・・)


na2fusi
会議室デビュー日: 2003/06/08
投稿数: 16
投稿日時: 2004-12-24 12:40
送信時の無効なアドレスが取得したい場合
javax.mail.event.TransportListenerを実装して
messageNotDeliveredとmessagePartiallyDeliveredにしたい処理を書きましょう。

ちなみにこれが有効なのは
「接続先のSMTPサーバが受け取りを拒否した」場合であって
「送信したメールアドレスが存在しなかった」場合ではありませんので念のため。

コード:

public class SendMail implements TransportListener {
(省略)
Session session;//セッション取得
Transport trans = session.getTransport("smtp");//トランスポート取得
trans.addTransportListener(this);//リスナーに追加
trans.connect();//SMTPサーバに接続
trans.sendMessage(msg, addrs);//メッセージを送る。
(省略)
/*
* 送信成功したアドレスを取得
*/
public void messageDelivered(TransportEvent e) {
Address[] valid = e.getValidSentAddresses();

}

/*
* 送信失敗したアドレスを取得
*/
public void messageNotDelivered(TransportEvent e) {
Address[] invalid = e.getInvalidAddresses();
Address[] unsentAddrs = e.getValidUnsentAddresses();

}

/*
* 送信成功と失敗が混在
*/
public void messagePartiallyDelivered(TransportEvent e) {
Address[] validAddrs = e.getValidSentAddresses();
Address[] invalidAddrs = e.getInvalidAddresses();
Address[] unsentAddrs = e.getValidUnsentAddresses();

}
}




[ メッセージ編集済み 編集者: na2fusi 編集日時 2004-12-24 12:45 ]
優子
常連さん
会議室デビュー日: 2004/03/26
投稿数: 39
投稿日時: 2004-12-24 14:47
ホッシーさん、na2fusiさん、お返事ありがとうございました。
「受け取りを拒否するかどうか」という所はSMTPサーバに依存しているという事ですね。

javaMailの仕組みがよく分かりました。ありがとうございました。
1

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