新米プログラマーで、会社が作るゴルフ場向け顧客管理システムの
「メール送信」部分を担当することになりました。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に対して指定すればよいものなのでしょうか?
よろしくご指導下さい。
ツイート | ![]() |