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 件のコメント:
コメントを投稿