NonSoft

メール送信(SMTP認証/POP認証)
のサンプル(VB.NET)


 サンプル(ソース/コード)
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