• 締切済み

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

  • basp21を利用した送信

    basp21を利用した送信 エクセル2002使用です。 VBAを利用してbasp21.dll(Proではない)を使ってメール送信ををしたいのですが、 フリーソフト版のbasp21.dllで、(POP before SMTP)は利用できるのでしょうか? sub test() dim bobj as Object dim kekka as string, strkk as string, strjikan as string dim mailServer as string, mailFrom as string, mailTo as string, MailSubject as string, mailBody as string, mailFiles as string Set bobj = CreateObject("basp21") mailServer = "mail.***.com"    ’←(POP before SMTP)にしたいのです。 mailFrom = "***@***.com" mailTo = "***@***.com" MailSubject = "タイトル" mailBody = "本文" mailFiles = "d:\autocsv\wddc\" & strkk & strjikan & ".doc" kekka = bobj.SendMail(mailServer, mailTo, mailFrom, MailSubject, mailBody, mailFiles) end sub よろしくお願いします。

  • VBAのデバックをどうかお助けください。

    ネットなどで調べたコードをつなぎ合わせ、なんとか下記のようなコードを作成しました。 Sub TEST2() ActiveSheet.Protect UserInterfaceOnly:=True Dim fname As String fname = Range("C3").Text ActiveSheet.Select ActiveSheet.Copy Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False Range("A1").Select ActiveWorkbook.SaveAs _ Filename:="C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls", FileFormat:=xlNormal Dim MailSmtpServer As String Dim MailFrom As String Dim MailTo As String Dim MailSubject As String Dim MailBody As String Dim MailAddFile As Variant Dim strMSG As String ' 添付ファイルの選択 MailAddFile = "C:\Documents and Settings\***\My Documents\ファイル\" & fname & ".xls" ' 送信確認 If MsgBox("メールを送信します。" & vbCr & _ "SMTP,発信者,宛先等は正しいですか?", vbYesNo) <> vbYes Then Exit Sub MailSmtpServer = "mail.***.co.jp" ' SMTPサーバ MailFrom = "***@***.co.jp" ' 発信者 MailTo = "***@***.co.jp" ' 宛先 MailSubject = fname ' 件名 MailBody = "" ' 本文 ' メール送信(CC,BCCはブランク) strMSG = SendMailByCDO(MailSmtpServer, MailFrom, MailTo, "", "", _ MailSubject, MailBody, MailAddFile) ' 文字コードを任意に指定する場合は以下のようにします。 ' strMSG = SendMailByCDO(MailSmtpServer, MailFrom, MailTo, "", "", _ MailSubject, MailBody, MailAddFile, cdoISO_2022_JP) If strMSG <> "OK" Then MsgBox Mid(strMSG, 3) End Sub しかし、このようなエラーがでました。’宛先等は正しいですか?’のメッセージのあとです。 ’2147024864プロセスはファイルにアクセスできません’。 ところで私がやりたいことは、(1)作成したエクセルの("C3").Textをファイル名にして、アクティブシートを(値のみ貼り付けして)保存し、(2)その作成されたファイルを添付してメールで送付する。ということです。 (2)のどこかで失敗しているものと思われますが、どこを直したらいいのかわかりません。 ここまで自分でできただけでも奇跡的なので、これ以上、どうしてよいか全くわからず。。 不足の情報があれば補足いたしますのでどうぞお願いいたします。

  • BASP21を使ってEXCELからメールの送信

    BASP21を使ってEXCELからメールの送信をしたいのですが、できません。 自分なりに調べた結果、下記のコードになったのですが、どこかおかしいのでしょうか? エラー表示は次になります。 530 5.7.1 client was not authenticated from メールアドレス よろしくお願いいたします。 Sub ボタン2_Click() ''[送信]ボタン Dim bobj, msg As String, i As Long Dim Server As String, Mailto As String, MailFrom As String Dim Subject As String, Attach As String, Body As String On Error Resume Next Set bobj = CreateObject("basp21") ''BASP21オブジェクト ''BASP21がインストールされているかどうかを判定する If Err = 429 Then MsgBox "BASP21がインストールされていません。", vbCritical Exit Sub End If ''必須データのチェック Server = "mail.○○○.com:587:60" ''SMTPサーバー Mailto = "○○○@hotmail.co.jp" ''宛先 MailFrom = "△△△@×××.co.jp" ''差出し人 Subject = "更新連絡" ''タイトル Body = "システムが更新しました" ''本文 msg = bobj.SendMail(Server, Mailto, MailFrom, Subject, Body, Attach) Set bobj = Nothing If msg <> "" Then MsgBox msg, vbExclamation Else MsgBox "メールを送信しました。", vbInformation End If End Sub

  • メールの送信について

    ASPを使ってwebアプリ見たいなのを作ろうとしています。 データの登録時に予め登録されてているユーザに登録された旨を伝える メールを送信したいです。 いろいろ試した結果、直でbsap21を呼び出すのではなく、bsmtp.dllを 呼び出して送信するほうが動きがいい(というか、basp21のほうはSMTPサーバに接続しない)ので、その方向で行きたいのですが。。。 見つけたコードが以下です。 ------------------------------------------------------------ Private Declare Function SendMail Lib "bsmtp"_ (strServer As String, strTo As String, strFrom As String, _ strSubject As String, strBody As String, strFile As String) As String Public Function SendViaBASP() As String Dim strMailServer As String: strMailServer = "***.***" Dim strFrom As String: strFrom = "hoge@hoge.com" Dim strTo As String: strTo = "hoge@hoge.com" Dim strBcc As String: strBcc = "" Dim strToBcc As String: strToBcc = "" Dim fHTML As Boolean: fHTML = False Dim strSubject As String Dim strBody As String Dim strAttachments As String: strAttachments = "" Dim strRet As String strSubject = "BASP21" strBody = "このメールは、BASP21経由で送信しました." If Len(strTo) Then strToBcc = strTo Else strToBcc = strBcc End If If fHTML Then strToBcc = ">Content-Type: text/html; charset=iso-2022-jp" _ & vbTab & strToBcc End If strRet = SendMail(strMailServer, _ strToBcc, strFrom, strSubject, strBody, _ strAttachments) SendViaBASP = strRet End Function --------------------------------------------------------------- で、これをACCESSのモジュールに登録し、実行したところ問題なく 動くのですが、これをASPに組み込む方法がわかりません。 ACCESSはデータの登録先ではありますが、常に起動しているわけでは ないので、おそらくモジュールとした場合、動かないですよね? ASPから上記のコードを動かすには、どうしたらいいでしょうか。 普通にASPの中(<%~%>)に入れると「ステートメントの末尾が不正」 とのメッセージがでてしまいます。 どうかよろしくお願いします。

  • VB 2008: 文字サイズの指定要領が判りません!

    指定秒だけメッセージを表示する関数を作成しています。 しかし、文字サイズの設定要領が判りません。 VB.NET 学習40日余という初学者です。 宜しくお願いします。   Sub PauseMsg2(ByVal Msg As String, ByVal PauseTime As Double, ByVal aColor As Color, ByVal iFontSize AS Integer)     Dim frm As New Form     Dim lbl As New Label()     With lbl       .Text = Msg       .BorderStyle = BorderStyle.None       .Location = New Point(10, 10)       .ForeColor = aColor       .Size = XXXXX       .Width = 478     End With     With frm       .HelpButton = False       .FormBorderStyle = FormBorderStyle.FixedDialog       .ControlBox = False       .MaximizeBox = False       .MinimizeBox = False       .Text = ""       .Width = 500       .Height = 20       .StartPosition = FormStartPosition.CenterScreen       .Controls.Add(lbl)       .Show()       Pause(PauseTime)       .Close()     End With   End Sub   ' ------------   ' ポーズ関数   ' ------------   Sub Pause(ByVal PauseTime As Double)     Dim Finish As Double = DateAndTime.Timer + PauseTime     Do       DoEvents()     Loop Until DateAndTime.Timer > Finish   End Sub

  • VB.net 2008 でメールを送信するには。

    初めて質問します。 VB.net初心者です。 使用環境はVisual Studio2008でVB.netを使いフォームを作成し、その中にメール送付という ボタンを作り、それに下記のプログラムを書きました。 Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click Dim senderMail As String = "katsumi@aaa.bz"<--変更しています。 '宛先 Dim recipientMail As String = "katsumi@aaa.bz" '件名 Dim subject As String = "こんにちは" '本文 Dim body As String = "こんにちは。" Dim sc As New System.Net.Mail.SmtpClient() 'SMTPサーバーを指定する sc.Host = "smtp.aaa.bz" 'メールを送信する sc.Send(senderMail, recipientMail, subject, body) <---ここで止まる End Sub デバックを押すとホームまでは立ち上がります。 Button10をクリックすると sc.Send(senderMail, recipientMail, subject, body) の所で SmtpExceptionはハンドルされませんでした。 メールは送信されませんでした。 として黄色のバックカラーになります。 原因が判りません。 参照設定などに問題があるのでしょうか。 ご存知の方教えてください。

  • Accessから複数アドレスにメール送信

    かなり初歩的な質問なのかもしれませんが、どうしても進まないのでどなたかご教授お願い致します。 access2003からBasp21を使用してメール送信フォームを作ってます。複数アドレスに一括で送れるように、宛名フォームから氏名を選択(例として3件)すると、メール送信フォームの「bcc」ボックスに、 "bcc" & vbTab & "abc@xx.com" & vbTab & "def@xx.jp" & vbTab & "ghi@xx.com" と入るようにし、送信ボタンクリックで下記のようなコードを書いてます。 Dim bobj As Object Dim svname As String Dim ID As String Dim Mailto As String Dim MailFrom As String Dim subj As String Dim Body As String Dim pass As String Dim msg As Variant '送信チェック用 'SMTPサーバ名:ポート番号:タイムアウト秒 svname = Me.[smtpサーバー] & ":" & Me.[ポート番号] & ":" & Me.[タイムアウト秒] 'ログインID ID = Me.[ログインID] 'パスワード pass = Me.[パスワード] 'オブジェクトを作成 Set bobj = CreateObject("basp21") '宛先 Mailto = Me.[bcc] '送信者 MailFrom = Me.[送信者] & "<" & ID & ">" & vbTab & ID & ":" & pass '件名 subj = Me.[件名]   '本文 Body = Me.[テキスト169] 'メッセージの送信 msg = bobj.SendMail(svname, Mailto, MailFrom, subj, Body) ' 送信チェック If msg <> "" Then MsgBox "送信できませんでした。" & vbCrLf & msg, vbOKOnly + vbCritical, "エラー" Else MsgBox "送信しました", vbOKOnly + vbInformation, "完了" End If これを実行すると、 「送信できませんでした。 555 5.5.4 Unsupported option: & to "bcc" & vbTab & "abc@xx.com" & vb」 というようなメッセージが出て送信できません。 Mailto = Me.[bcc] の所を、 Mailto ="bcc" & vbTab & "abc@xx.com" & vbTab & "def@xx.jp" & vbTab & "fhi@xx.com" にすれば送信できるのですが、送信先は毎回変わるので Me.[bbc] にアドレスを代入して送信できるようにするにはどうすればいいのでしょうか?

  • 順列のプログラムについて(VB)

    下記が、組み合わせを求めるプログラムです。 これのどこを変更すれば、順列を列挙するプログラムになりますか(ただし、重複順列でない。例、5P2=5*4=20通り)?教えていただけませんか? Public Class Form1 Dim w0, w1, count As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "コンビネーションサーチ" Label1.Text = "個の中から" Label2.Text = "個とる組リスト" Button1.Text = "計算" TextBox1.Text = "6" TextBox2.Text = "3" TextBox3.Text = "" TextBox3.ScrollBars = ScrollBars.Vertical count = 0 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n, m As Integer n = TextBox1.Text m = TextBox2.Text w1 = " }" w0 = "{ " TextBox3.Text = "" count = 0 combisearch(1, n, m) MsgBox("組み合わせ個数は、" & count & "個です。") End Sub Sub combisearch(ByVal st, ByVal ed, ByVal depth) Dim i, temp If depth - 1 < 1 Then For i = st To ed TextBox3.Text &= w0 & i & w1 & vbCrLf count += 1 Next Else For i = st To ed temp = w0 w0 &= i & " " combisearch(i + 1, ed, depth - 1) w0 = temp Next End If End Sub End Class

  • Excel VBA basp21でメール送信エラー

    メール送信エラーとなってしまいます。 ”Cant connect Server 11004” 同アカウントでメーラーからの送受信は成功しております。 原因はSMTP設定の関係だと思うのですが、どのようにコードを書き足せば良いのでしょうか。 また参照設定は完了しています。 ご存知のかたご回答をよろしくお願いします。 コードは以下です。 Private Sub cmd送信_Click() Dim bobj As Object Dim svname As String Dim id As String Dim pass As String Dim msg As Variant '送信チェック用 Dim strMLadr As String Dim strDPadr As String Dim strPW As String 'SMTPサーバ名:ポート番号:タイムアウト秒 svname = "サーバー:587:60" 'ログインID id = "" 'パスワード pass = "" 'オブジェクトを作成 Set bobj = CreateObject("basp21") '宛先 mailto = "" '送信者 strMLadr = "" '(送信者のメールアドレス' strDPadr = "テスト" '(送信者の表示文字列) strPW = "" '(送信者メールアドレスのパスワード) mailfrom = strDPadr & "<" & strMLadr & ">" & vbTab & id & ":" & strPW '件名 subj = "送信テスト" '本文 改行はvbCrLf body = "おはようございます。" & vbCrLf & "今日は良い天気ですね。" 'メール送信 msg = bobj.SendMail(svname, mailto, mailfrom, subj, body, "") ' 送信チェック If msg <> "" Then MsgBox "送信できませんでした。" & vbCrLf & msg, vbOKOnly + vbCritical, "エラー" Else MsgBox "送信に成功しました。", vbOKOnly + vbInformation, "完了" End If End Sub

  • VBのプログラムの質問です。

    VBのプログラムの質問です。 100点満点のテストで10人分の点数を一次元配列で読み込み、各人の偏差値を含めて表示するプログラムを作りなさい。 知恵袋で一度同じような質問をしましたが、似たようなエラーが出てきてしまうために 今一度力をお貸しください、 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Integer = CInt(TextBox3.Text)  ←ここ Dim p(n) As Integer 'データの取得と平均計算 Dim s As Double = 0 For i As Integer = 0 To n - 1 p(i) = CInt(TextBox1.Lines(i)) s = s + p(i) Next Dim m As Double = s / n '標準偏差の計算 Dim sx As Double = 0 For i As Integer = 0 To n - 1 sx = sx + (p(i) - m) ^ 2 Next Dim sd As Double = (sx / n) ^ (1 / 2) '偏差値の表示 For i As Integer = 0 To n - 1 Dim dv As Double = 50 + 10 * (p(i) - m) / sd TextBox2.Text = TextBox2.Text & Format(dv, "##.#0") & vbCrLf Next End Sub String "" から型 'Integer' への変換は無効です。 と Dim n As Integer = CInt(TextBox3.Text)からでてしまいます。 詳しい方よろしくお願いします

専門家に質問してみよう