2009年4月16日木曜日

.NET System.Net.Mailを使用してメールを送信するには

MailMessageオブジェクトを作成し、System.Net.Mail.SmtpClientを使用してメールを送信する方法です。

PopBefore認証


PopBefore認証が設定されている場合はSystem.Net.Sockets.TcpClientを使用して、メール送信前にPop認証を行います
'PopBefore認証が設定されている場合、Pop認証を行います。
'認証に失敗した場合はSystem.Net.Sockets.SocketExceptionが発生します。
Using tcp As New System.Net.Sockets.TcpClient
Dim sPopServer As String = "POPサーバー"
Dim iPopPortNo As Integer = 110 'POPポート番号
Dim sPopUserName As String = "POPユーザーID"
Dim sPopPassword As String = "POPパスワード"

tcp.Connect(sPopServer, iPopPortNo)
Try
Using sw As New System.IO.StreamWriter(tcp.GetStream)
sw.Write("USER " + sPopUserName + "\nPASS " + sPopPassword + "\nQUIT\n")
End Using
Finally
tcp.Close()
End Try
End Using


メールの文字化け対策


以下のページが丁寧に説明されており、大変参考になりました。
株式会社アジルテック:開発者の談話室:System.Net.MailでTo,Fromフィールドをiso-2022-jp Bエンコード

参考ページによるとメールの文字化けは以下の対策が必要だそうです。
・差出人(To)やタイトル(Subject)のエンコードは自前で行う。
・本文(Body)はAlternateViewを利用し、7bitエンコーディングにする。AlternateViewを利用するためにはNet Framework 2.0 SP1以降であること。


サンプルコード


'エンコード
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("iso-2022-jp")

Using mailMsg As New System.Net.Mail.MailMessage

'あて先
mailMsg.To.Add("あて先アドレス")

'差出人
mailMsg.From = New System.Net.Mail.MailAddress("差出人アドレス")
'※displayNameを指定する場合は、displayNameは自前でエンコードする。
'Dim sDisplayName As String = String.Format("=?{0}?B?{1}?=", enc.HeaderName, Convert.ToBase64String(enc.GetBytes("表示名"), Base64FormattingOptions.None))
'mailMsg.From = New System.Net.Mail.MailAddress("差出人アドレス", sDisplayName)

'CC
mailMsg.CC.Add("CCアドレス")

'タイトル
'※iso-2022-jpに指定しても、Qエンコードされてしまうため未設定にする。
'mailMsg.SubjectEncoding = enc
'mailMsg.Subject = "メールタイトル"
'※タイトルは自前でエンコードする。
mailMsg.Subject = String.Format("=?{0}?B?{1}?=", enc.HeaderName, Convert.ToBase64String(enc.GetBytes("メールタイトル"), Base64FormattingOptions.None))

'本文
'※iso-2022-jpに指定しても、8bitエンコーディングされてしまうため未設定にする。
'mailMsg.BodyEncoding = enc 
'mailMsg.Body = "メール本文"
'※本文を7bitエンコーディングにするには、mailMsg.HeadersにAddしても追加されないため、AlternateViewを利用する。
'※AlternateViewを利用するためにはNet Framework 2.0 SP1以降であること。
'--追加されない
'mailMsg.Headers.Add("Content-Transfer-Encoding", "7bit")
'--AlternateViewを利用する 
Dim altmsg As New System.Net.Mail.AlternateView(New System.IO.MemoryStream(enc.GetBytes("メール本文")), New System.Net.Mime.ContentType("text/plain; charset=" + enc.BodyName))
altmsg.TransferEncoding = Net.Mime.TransferEncoding.SevenBit
mailMsg.AlternateViews.Add(altmsg)
mailMsg.IsBodyHtml = False

'添付ファイル
Dim sbAttachmentBuf As New System.Text.StringBuilder
sbAttachmentBuf.AppendLine("添付ファイル本文")
Dim bytes() As Byte = System.Text.Encoding.GetEncoding("Shift_Jis").GetBytes(sbAttachmentBuf.ToString)
mailMsg.Attachments.Add(New System.Net.Mail.Attachment(New System.IO.MemoryStream(bytes), "添付ファイル.txt"))


'PopBefore認証が設定されている場合、Pop認証を行います。
'認証に失敗した場合はSystem.Net.Sockets.SocketExceptionが発生します。
Using tcp As New System.Net.Sockets.TcpClient
Dim sPopServer As String = "POPサーバー"
Dim iPopPortNo As Integer = 110 'POPポート番号
Dim sPopUserName As String = "POPユーザーID"
Dim sPopPassword As String = "POPパスワード"

tcp.Connect(sPopServer, iPopPortNo)
Try
Using sw As New System.IO.StreamWriter(tcp.GetStream)
sw.Write("USER " + sPopUserName + "\nPASS " + sPopPassword + "\nQUIT\n")
End Using
Finally
tcp.Close()
End Try
End Using

'SMTPクライアントを作成します。
Dim sSmtpServer As String = "SMTPサーバー"
Dim iSmtpPortNo As Integer = 25 'SMTPポート番号
Dim smtp As New System.Net.Mail.SmtpClient(sSmtpServer, iSmtpPortNo)
smtp.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.Network

'SMTP認証が設定されている場合は資格情報を設定します。
Dim sSmtpUserName As String = "SMTPユーザーID"
Dim sSmtpPassword As String = "SMTPパスワード"
smtp.Credentials = New System.Net.NetworkCredential(sSmtpUserName, sSmtpPassword)

'Mailを送信します。
smtp.Send(mailMsg)

End Using

0 件のコメント: