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

わんくま同盟

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

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


(過去ログ 110 を表示中)
■65151 / )  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構文を仕掛け、例外となった場合はログ出力して処理自体は止めないようにしているのですが、
この方法で問題ないか、評価する必要があります。

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

返信 編集キー/


管理者用

- Child Tree -