• 締切済み

VB2005で作ったメール送信プログラムで、メール本文が文字化けしてしまいます。

VB2005でメール送信プログラムを作ったのですが、送信したBODYが文字化けしてしまいます。どう修正すればよいか、教えてください。 以下がそのコードです。 Imports System.Net.mail Public Class Form1 Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim tc As Sockets.TcpClient Dim ns As Sockets.NetworkStream Dim stat As String Dim mailData As String Dim mailFrom As String = "", mailSubject As String = "", mailBody As String = "" Dim r As Regex Dim m As Match Dim mailCount As Integer Try tc = New Sockets.TcpClient() tc.Connect(txtPOP3Server.Text, 110) ns = tc.GetStream Dim buff(tc.ReceiveBufferSize) As Byte ns.Read(buff, 0, tc.ReceiveBufferSize) POP3Transmit(ns, "USER " & txtUserName.Text, False) POP3Transmit(ns, "PASS " & txtPassword.Text, False) stat = POP3Transmit(ns, "STAT", False) r = New Regex("\+OK (.*) (.*)") m = r.Match(stat) mailCount = Val(m.Groups(1).Value) If mailCount = 0 Then MsgBox("メールはありません") Else mailData = POP3Transmit(ns, "RETR " & mailCount, True) ParseMail(mailData, mailFrom, mailSubject, mailBody) txtBody.Text = mailBody txtFrom.Text = mailFrom txtSubject.Text = mailSubject End If Dim smtpClt As New Net.Mail.SmtpClient("smtp.mail.yahoo.co.jp", 25) Dim from As String = "****@yahoo.co.jp" Dim toYou As String = DataGridView1(1, 0).Value Dim subject As String = TextBox2.Text Dim body As String = TextBox1.Text Try smtpClt.Send(from, toYou, subject, body) Timer2.Enabled = True ToolStripStatusLabel2.Text = "送信しました。" Catch ex As Exception MessageBox.Show(ex.Message) End Try POP3Transmit(ns, "QUIT", False) ns.Close() tc.Close() Catch ex As Exception MsgBox("メールの受信に失敗しました") End Try End Sub End Class

みんなの回答

回答No.1

考える前に動作見ようと,貼り付けてみたはいいが, POP3Transmit ParseMail 二つのメソッドが書かれていないので検証不能だ。補足頼む

SA6PSUKE
質問者

補足

申し訳ありません。以下二点補足します。 POP3Transmit ParseMail 検証よろしくお願いします。 Function POP3Transmit(ByVal ns As Sockets.NetworkStream, ByVal data As String, ByVal isMultiLine As Boolean) As String Dim wbuf As Byte() Dim tmpbuf(4096) As Byte Dim rbuf() As Byte Dim rlen As Long Dim tmplen As Integer Dim msg As String ' 送信するデータをバイト配列に変換 wbuf = Encoding.ASCII.GetBytes(data & vbCrLf) ' データを送信する ns.Write(wbuf, 0, wbuf.Length) ' 受信用バッファのサイズを0に初期化 rlen = 0 ' 以下のいずれかの間は繰り返す ' 1.受信データがまだある ' 2.1行で終わるデータで、最後の文字が改行でない ' 3.複数行のデータで、最後が改行+「.」+改行でない Do ' 一時バッファにデータを受信 tmplen = ns.Read(tmpbuf, 0, tmpbuf.Length) ' 受信したデータのサイズに合わせて、受信用バッファのサイズを拡大 ReDim Preserve rbuf(rlen + tmplen) ' 一時バッファから受信用バッファにデータをコピー Array.Copy(tmpbuf, 0, rbuf, rlen, tmplen) rlen += tmplen ' 受信したデータの文字コードを変換する msg = Encoding.GetEncoding(50220).GetString(rbuf, 0, rbuf.Length) ' 受信したデータの最後の1文字を切り取る msg = msg.Substring(0, msg.Length - 1) Loop While ns.DataAvailable Or _ (Not isMultiLine And Not msg.EndsWith(vbCrLf)) Or _ (isMultiLine And Not msg.EndsWith(vbCrLf & "." & vbCrLf)) ' 受信したデータを戻り値として返す POP3Transmit = msg End Function Sub ParseMail(ByVal mailData As String, ByRef mailFrom As String, ByRef mailSubject As String, ByRef mailBody As String) Dim mailHeader As String Dim pos As Long Dim r As Regex Dim m As Match ' メールのデータをヘッダーと本文に分割 pos = mailData.IndexOf(vbCrLf & vbCrLf) mailHeader = mailData.Substring(0, pos) mailBody = mailData.Substring(pos + 4) ' Fromのヘッダーを取り出す r = New Regex("From:(( +?.*?\r\n){1,})") m = r.Match(mailHeader) mailFrom = m.Groups(1).Value mailFrom = DecodeMailHeader(mailFrom) ' Fromに日本語が入っている場合、メールアドレスと名前に分離した後、再度結合する r = New Regex("(.*?)<(.*?)>") m = r.Match(mailFrom) If m.Success Then mailFrom = Trim(m.Groups(1).Value) & " " & "<" & m.Groups(2).Value & ">" End If ' Subjectのヘッダーを取り出す r = New Regex("Subject:(( +?.*?\r\n){1,})") m = r.Match(mailHeader) mailSubject = m.Groups(1).Value mailSubject = DecodeMailHeader(mailSubject) End Sub

関連するQ&A