SMTP認証するには


タマチャン危篤  2009-08-14 18:21:42  No: 142394

新米プログラマーで、会社が作るゴルフ場向け顧客管理システムの
「メール送信」部分を担当することになりました。VB2005.
このソフトはパッケージソフトですので、いろいろなプロバイダや
レンタルサーバに対応する必要があります。

ユーザーが使用するプロバイダやレンタルサーバのSMTPを使って
メールを送信するのですが、
http://msdn.microsoft.com/ja-jp/library/cc720828.aspx
を参考に作ったのですが、事はそんなに簡単ではありませんでした。

最近は迷惑メールを防止するためにいろいろな工夫がこれされているようで、
SMTPにいろいろな認証の仕組みが設けられているようです。

調べてみたところ、

①SMTP-AUTH  認証なし
②SMTP-AUTH  PLAIN
③SMTP-AUTH  LOGIN
④SMTP-AUTH  CRAM-MD5
⑤POPbeforeSMTP
⑥Outbound Port 25 Blocking
⑦サブミッションポート(port 587)

などがあって、何がなんだかわからずパニック状態になりました。
その後調べた結果、⑤POPbeforeSMTP  はSMTPに接続する前にPOPの認証を
問う仕組みで、
どこかのサイトを参考にして以下のようにコードを書いたら、何とか乗り切れました。

            'POP Before SMTP サーバのため、一度POPサーバにログインにて認証を得る
            Dim r_Client As New System.Net.Sockets.TcpClient

            Dim userName As String = returnMailAccount.UserName
            Dim password As String = returnMailAccount.PassWord

            r_Client.SendTimeout = 10000
            r_Client.ReceiveTimeout = 10000

            r_Client.Connect(returnMailAccount.PopHost, 110)

            Dim sw As New IO.StreamWriter(r_Client.GetStream())
            Dim sr As New IO.StreamReader(r_Client.GetStream())

            sw.AutoFlush = True
            'MsgBox("1  " & sr.ReadLine)

            'sw.WriteLine("USER " & userName & "PASS " & password & "QUIT")

            sw.WriteLine("USER " & userName)    '念ため1コマンドずつ実行した
            'MsgBox("2  " & sr.ReadLine)

            sw.WriteLine("PASS " & password)
            'MsgBox("3  " & sr.ReadLine)

            sw.WriteLine("QUIT")
            'MsgBox("4  " & sr.ReadLine)

            r_Client.Close()

            'SMTPクライアント
            Dim s_client As New System.Net.Mail.SmtpClient(returnMailAccount.SmtpHost, CInt(returnMailAccount.PortNo))   'SMTPアカウントとポート番号(通常は25。サブミッションポート(Port587)に対応しているので#587番を指定)

            '送信
            s_client.Send(message)

            MessageBox.Show("メールを送信しました。", "送信終了")
            'ToとBccに送信して終了。

        Catch ex As Exception
            MessageBox.Show("送信できませんでした。", "エラー")

⑥Outbound Port 25 Blockingと⑦サブミッションポート(port 587)についても
25番でまずければ587番を指定できる(returnMailAccount.PortNo)ようにすれば
対応できることがわかりました。

長々と前置きが長くてスミマセン。
①〜⑦までを並列に並べることがおかしかったのかもしれませんが、
問題は
①SMTP-AUTH  認証なし
②SMTP-AUTH  PLAIN
③SMTP-AUTH  LOGIN
④SMTP-AUTH  CRAM-MD5
なんですけど、何をどのようにコードに表現したらよいものかがわかりません。
これらは、各プロバイダやレンタルカーバによって指定されているものなんでしょうか。
それとも、メールを送信する側が、SMTPに対して指定すればよいものなのでしょうか?

よろしくご指導下さい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加