|
|||||
SMTP AUTH認証とPOP BEFORE SMTP認証によるメール送信のサンプルソース(VB.NET)です。 メール送信にはSystem.Net.Mail.SmtpClientを使用しています。 カンマで区切られた複数宛先(TO)に送信する事が可能です。 また、タブで区切られた複数ファイルの添付が可能です。 SMTP AUTH認証はSystem.Net.Mail.SmtpClientでサポートされているために簡単ですが、 POP BEFORE SMTP認証は自作しなければならないので少々面倒だと思います。 SMTP AUTH認証にはAUTH LOGINとAUTH CRAM-MD5とAUTH PLAIN等がありますが、 AUTH LOGINでのみ動作確認しています。 SMTP AUTH認証ではTLS(セキュリティで保護された接続)による暗号化も可能のなで、 参考としてサンプルソース中にコメント記述しています。 通常のPOP BEFORE SMTP認証ではパスワードがそのままネットワークを流れます。 それが不安な場合はAPOP(暗号化)を使用する必要がありますので、 参考としてコメント記述しています。 簡単にメール送受信したい方は、こちらのDLLをオススメします。 メール送信/受信DLL(VB.NET/C#.NET) C#.NET版のサンプルソースはこちらです。 メール送信(SMTP認証/POP認証)のサンプル(C#.NET) メール関係のその他のサンプルはこちらです。 メール送信/メール受信サンプル(VBS/VBA) SMTP(SSL無し)でメール送信(TcpClientソケット通信)サンプル(VB.NET) SMTP(SSL有り)でメール送信(TcpClientソケット通信)サンプル(VB.NET) SMTP(TLS有り)でメール送信(TcpClientソケット通信)サンプル(VB.NET) POP3(SSL無し)でメール受信(TcpClientソケット通信)サンプル(VB.NET) POP3(SSL有り)でメール受信(TcpClientソケット通信)サンプル(VB.NET) IMAP(SSL無し)でメール受信(TcpClientソケット通信)サンプル(VB.NET) IMAP(SSL有り)でメール受信(TcpClientソケット通信)サンプル(VB.NET) メール関係のツールはこちらです。 指令メール実行 受信メールを監視しメールタイトルのキーワードに対応したプログラムを実行するツールです。 ファイル監視人 ファイルやフォルダの更新時にメッセージ表示またはメール送信するツールです。 フォルダ監視人 フォルダ内のファイル更新時に更新通知(差分メール等)、指定プログラム実行するツールです。 PC状況メール通知(PcEvMail) PC起動/PC終了/ログイン/ログアウト/ファイル更新時にメール通知/ログ出力するツールです。 ★クラス(Class1.vb) Public Class Class1 ''' <summary> ''' メール送信 ''' </summary> ''' <param name="serv">SMTPサーバー</param> ''' <param name="port">SMTPポート番号</param> ''' <param name="user">ユーザID</param> ''' <param name="pass">パスワード</param> ''' <param name="fadr">FROMアドレス</param> ''' <param name="tadr">TOアドレス(カンマ区切り)</param> ''' <param name="subj">タイトル</param> ''' <param name="body">本文</param> ''' <param name="fils">添付ファイル(TAB区切り)</param> ''' <remarks></remarks> Public Sub SmtpSend( _ ByVal serv As String, ByVal port As Integer, _ ByVal user As String, ByVal pass As String, _ ByVal fadr As String, ByVal tadr As String, _ ByVal subj As String, ByVal body As String, _ ByVal fils As String) Dim msg As System.Net.Mail.MailMessage = Nothing Try ' MailMessage生成 msg = New System.Net.Mail.MailMessage() ' エンコード指定 Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(50220) ' 件名設定 msg.Subject = subj msg.SubjectEncoding = enc ' 本文設定 msg.Body = body msg.BodyEncoding = enc ' FROMアドレス設定 msg.From = New System.Net.Mail.MailAddress(fadr) ' TOアドレス設定(カンマ区切り) Dim tos As String() = Split(tadr, ",") For i As Integer = 0 To tos.Length - 1 If tos(i) <> "" Then msg.To.Add(New System.Net.Mail.MailAddress(tos(i))) End If Next ' 添付ファイルの設定(TAB区切り) Dim fls As String() = Split(fils, vbTab) Dim attachment As System.Net.Mail.Attachment For i As Integer = 0 To fls.Length - 1 If fls(i) <> "" AndAlso System.IO.File.Exists(fls(i)) Then attachment = New System.Net.Mail.Attachment(fls(i)) attachment.NameEncoding = enc msg.Attachments.Add(attachment) End If Next ' SMTPサーバーとポート番号の設定 Dim sc As New System.Net.Mail.SmtpClient() sc.Host = serv sc.Port = port ' ユーザIDとパスワードの設定 If user <> "" Then sc.Credentials = New System.Net.NetworkCredential(user, pass) End If ' このサーバーはセキュリティで保護された接続(SSL)が必要 'sc.EnableSsl = True ' メール送信 sc.Send(msg) Catch ex As Exception Throw ex Finally If msg Is Nothing = False Then msg.Dispose() End If End Try End Sub ''' <summary> ''' Pop Before Smtp認証のためPOPサーバに接続 ''' </summary> ''' <param name="serv">POPサーバー</param> ''' <param name="port">POPポート番号</param> ''' <param name="user">ユーザID</param> ''' <param name="pass">パスワード</param> ''' <remarks></remarks> Public Sub PopBeforeSmtp( _ ByVal serv As String, ByVal port As Integer, _ ByVal user As String, ByVal pass As String) Dim stream As System.Net.Sockets.NetworkStream = Nothing Dim client As System.Net.Sockets.TcpClient = Nothing Try Dim rstr As String client = New System.Net.Sockets.TcpClient ' POPサーバーに接続 client.Connect(serv, port) stream = client.GetStream() ' POPサーバー接続時のレスポンス受信 rstr = WriteAndRead(stream, "") If rstr.IndexOf("+OK") <> 0 Then Throw New Exception("POPサーバー接続エラー") End If ' ユーザIDの送信 rstr = WriteAndRead(stream, "USER " & user & vbCrLf) If rstr.IndexOf("+OK") <> 0 Then Throw New Exception("ユーザIDエラー") End If ' パスワードの送信 rstr = WriteAndRead(stream, "PASS " & pass & vbCrLf) If rstr.IndexOf("+OK") <> 0 Then Throw New Exception("パスワードエラー") End If '' APOPの場合は[ユーザID送信]と[パスワード送信]の処理を以下のように変更します '' POPサーバー接続時のレスポンスからAPOP用のキー(<>で囲まれた部分)を取得して '' パスワードと連結(例:"<999.999@mxg999.xxx.com>PASS")してMD5(HEX)変換して '' "APOP user MD5(HEX)"形式で送信します 'Dim byt As Byte() = System.Text.Encoding.ASCII.GetBytes("<999.999@mxg999.xxx.com>" & pass) 'Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider() 'Dim res As Byte() = md5.ComputeHash(byt) 'Dim aps As String = BitConverter.ToString(res).Replace("-", "").ToLower() 'rstr = WriteAndRead(stream, "APOP " & user & " " & aps & vbCrLf) 'If rstr.IndexOf("+OK") <> 0 Then ' Throw New Exception("ユーザIDまたはパスワードエラー") 'End If ' ステータスの送信 rstr = WriteAndRead(stream, "STAT" & vbCrLf) If rstr.IndexOf("+OK") <> 0 Then Throw New Exception("STATエラー") End If ' 終了の送信 rstr = WriteAndRead(stream, "QUIT" & vbCrLf) Catch ex As Exception Throw ex Finally If stream Is Nothing = False Then stream.Close() stream.Dispose() End If If client Is Nothing = False Then client.Close() End If End Try End Sub ''' <summary> ''' POPサーバ送受信 ''' </summary> ''' <param name="stm">ストリーム</param> ''' <param name="req">リクエスト</param> ''' <returns>レスポンス</returns> ''' <remarks></remarks> Private Function WriteAndRead( _ ByVal stm As System.Net.Sockets.NetworkStream, _ ByVal req As String) As String ' POPサーバへリクエスト送信 If req <> "" Then Dim sdata() As Byte sdata = System.Text.Encoding.ASCII.GetBytes(req) stm.Write(sdata, 0, sdata.Length) End If For i As Integer = 1 To 300 If stm.DataAvailable Then Exit For System.Threading.Thread.Sleep(10) Next ' POPサーバからのレスポンス受信 Dim rtn As String = "" Dim rdata(1023) As Byte Do While (stm.DataAvailable) Dim l As Integer = stm.Read(rdata, 0, rdata.Length) If l > 0 Then ReDim Preserve rdata(l - 1) rtn = rtn & System.Text.Encoding.ASCII.GetString(rdata) End If Loop ' レスポンス返信 Return rtn End Function End Class ★フォーム(Form1.vb) Public Class Form1 ''' <summary> ''' Pop Before Smtp認証でメール送信 ''' </summary> ''' <param name="sender">sender</param> ''' <param name="e">e</param> ''' <remarks></remarks> Private Sub Button1_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim smail As New Class1() ' Pop Before Smtp認証のためPOPサーバに接続 smail.PopBeforeSmtp("pop.xxx.com", 110, "user", "pass") ' Pop Before Smtp認証でメール送信 smail.SmtpSend("smtp.xxx.com", 25, "", "", "from@xxx.com", "to@xxx.com", _ "タイトル", "本文", "c:\temp\a.txt") End Sub ''' <summary> ''' Smtp Auth認証でメール送信 ''' </summary> ''' <param name="sender">sender</param> ''' <param name="e">e</param> ''' <remarks></remarks> Private Sub Button2_Click( _ ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim smail As New Class1() ' Smtp Auth認証でメール送信 smail.SmtpSend("smtp.xxx.com", 25, "user", "pass", "from@xxx.com", "to@xxx.com", _ "タイトル", "本文", "c:\temp\a.txt") End Sub End Class |