C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: メール送信機能 宛先が有効でない場合の判断


(過去ログ 110 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■65147 / inTopicNo.1)  メール送信機能 宛先が有効でない場合の判断
  
□投稿者/ Ante (23回)-(2013/02/07(Thu) 17:35:02)

分類:[.NET 全般] 

◆環境
IDE:VS2010
言語:VB.NET

お世話になります

VB.NETでメール送信のアプリケーションを作成しています。
メールアドレスが有効でない場合の判断ってどのようにしますか?

例外が出たら有効でないという判断にしか出来なそうです。

みなさんどのように有効・無効を判断してらっしゃいますか。

よろしくお願いします。

引用返信 編集キー/
■65149 / inTopicNo.2)  Re[1]: メール送信機能 宛先が有効でない場合の判断
□投稿者/ 774RR (53回)-(2013/02/07(Thu) 18:13:15)
答えにあらず。

宛先が有効とはどういう意味で使っているのかな?
hogehoge は有効なメールアドレスか?
root@localhost は ry)
nonexistentuser@examyple.com は?
受信側が迷惑メール防止で受け取らない場合は?
受信側のメールボックスがいっぱいで戻ってきたら?

質問の意図は RFC2822 違反かどうか?ってことかな?
引用返信 編集キー/
■65151 / inTopicNo.3)  Re[2]: メール送信機能 宛先が有効でない場合の判断
□投稿者/ Ante (24回)-(2013/02/07(Thu) 18:34:10)
2013/02/07(Thu) 18:36:24 編集(投稿者)
774RR 様

仰るとおり、送信できないという、定義にもいろいろありますね。
稚拙で申し訳ございません。

ここで言う送信できないというのは、送信先メールアドレスが存在しない場合を指します。

そこで、詳細を書くと、メールアドレス存在しないにもいろいろあるようで、
たとえば、hoge@softbank.ne.jp というメールアドレスが存在しないとしましょう。

そうだと、送信プログラムとしては例外は発生せずにそのまま動作します。
ただし、メールサーバーには、送信できなかった旨のメールを受信しますが。

で、完全に存在しないデタラメなメールアドレス、sahjh@sahdja.ne.jp とかを送信した場合、以下のエラーが、
例外値として返却されます。
↓↓
エラー:System.Net.Mail.SmtpException: パラメーターまたは引数に構文エラーがあります。 サーバーの応答: 5.1.8 Domain of recipient address sahjh<@sahdja.ne.jp> does not exist

これはドメインが存在しないと言っているように見受けられるのですが、
このようにデタラメなメールアドレスを人為的に入れようと思えば、入れられる仕組みとなっているため、
その場合の回避策を検討しております。

具体的なロジックの一部を書きますと以下のようになっています。

'◆対象ユーザー分メール送信
For i As Integer = 0 To _dtUser.Rows.Count - 1
    '◆【宛先:TO】
    sendTO = _dtUser.Rows(i).Item("MAILADRS").ToString
    '◆【宛先:CC】
    'sendCC = _dtUser.Rows(i).Item("MAILADRS").ToString
    ''◆【タイトル】
    'sendTitle = _MailTitle
    '◆【添付ファイル】
    sendTemp = _dtUser.Rows(i).Item("MAILTEMP_PATH").ToString
    '◆【本文】
    sendText = CreateMailText(_dtUser.Rows(i).Item("TEST1").ToString, _dtUser.Rows(i).Item("TEST2").ToString)
    '◆【タイトル】
    sendTitle = _MailTitle

    Try
        '◆メール送信
        Using SysMail As New DLLMail.UniMail(_DataBaseHost, _DataBaseName, _DataBaseUser, _DataBasePassword)
            SysMail.MailSend(sendTO, sendCC, sendTitle, sendText, sendTemp)
        End Using
    Catch ex As Exception
        '▲:ファイル【システムエラーメッセージ】
        Call ErrorFileWriteMessage(ex.ToString, String.Empty)
        '▲:ファイル【ユーザー】[ユーザーID][ユーザー名称][メールアドレス]
        Dim strErrUserInfo As New System.Text.StringBuilder
        strErrUserInfo.Append("送信不能:")
        strErrUserInfo.Append("[ユーザーID]:" & _dtUser.Rows(i).Item("USERID").ToString & Space(1))
        strErrUserInfo.Append("[ユーザー名称]:" & _dtUser.Rows(i).Item("USERNM").ToString & Space(1))
        strErrUserInfo.Append("[ユーザーメールアドレス]:" & _dtUser.Rows(i).Item("MAILADRS").ToString)

        Call ErrorFileWriteMessage(strErrUserInfo.ToString, String.Empty)
    End Try
Next

ここで言う、「_dtUser」はdatatable 形式でユーザー情報が格納されています。
それをループで回してメールを送信するような仕組みなのですが、
現在ですと、'◆メール送信 部にTry構文を仕掛け、例外となった場合はログ出力して処理自体は止めないようにしているのですが、
この方法で問題ないか、評価する必要があります。

例外となっても、ループは最後まで回す必要があるのが前提です。

引用返信 編集キー/
■65152 / inTopicNo.4)  Re[3]: メール送信機能 宛先が有効でない場合の判断
□投稿者/ Azulean (93回)-(2013/02/07(Thu) 22:52:46)
2013/02/07(Thu) 22:55:42 編集(投稿者)

No65151 (Ante さん) に返信
> で、完全に存在しないデタラメなメールアドレス、sahjh@sahdja.ne.jp とかを送信した場合、以下のエラーが、
> 例外値として返却されます。

クライアントで何かしたところで完全に防げるわけではありません。
ドメインが存在しないということなら名前解決を試すと言うことも考えられますが、クライアントと SMTP サーバーが見ている DNS が違って結果が一致しない恐れもありますし、完全にはならないのに対して手間がかかるだけで益はないかと。


> 現在ですと、'◆メール送信 部にTry構文を仕掛け、例外となった場合はログ出力して処理自体は止めないようにしているのですが、
> この方法で問題ないか、評価する必要があります。

評価するしかないでしょう。

今の話はその評価を避けるために、責任を転嫁できる何かをお探しなのかもしれませんが、完璧なソリューションは世の中に存在し得ないので、結局は何らかの評価をしなければなりません。
そうであれば、今の状態で異常ケースをいろいろと洗い出して、評価していく方がよいのでは。
引用返信 編集キー/
■65163 / inTopicNo.5)  Re[4]: メール送信機能 宛先が有効でない場合の判断
□投稿者/ ウィドゥ (2回)-(2013/02/08(Fri) 12:38:03)
例えば、

・メール送信時smtpエラーが発生した場合、とりあえず、どのメアドに対してエラーとなったかが分かればよい
・メール送信エラーがない場合で、(対象メアドが存在せず)エラーメールが返ってきた場合は、人的運用で対応する

ということであれば、今の方法で問題はないと思います。
もし、対象メアドが存在しないメアドに対して、smtpエラーの有無に関わらず自動でなんらかのアクションをしたい、
というのであれば話は別ですが、そこまで対応するのは非常に難しいでしょう。
引用返信 編集キー/
■65165 / inTopicNo.6)  Re[3]: メール送信機能 宛先が有効でない場合の判断
□投稿者/ shu (175回)-(2013/02/08(Fri) 14:20:23)
No65151 (Ante さん) に返信

> エラー:System.Net.Mail.SmtpException: パラメーターまたは引数に構文エラーがあります。 サーバーの応答: 5.1.8 Domain of recipient address sahjh<@sahdja.ne.jp> does not exist

CatchするExceptionの型が分かっている場合

Try

Catch ex As System.Net.Mail.SmtpException

Catch ex As Exception

End Try

のようにCatchする例外を明確に指定した方がよいです。



引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -