none
[問題]Net mail 一直標頭錯誤 RRS feed

  • 問題

  • 我已經研究好幾天了,還是一直找不到問題錯在哪裡!
    希望瞭解的大大可以協助一下。
    一送出就是  system.formatexception: 郵件標頭中找到無效字元



    Imports System.Net.Mail
    Imports System.Net.Mail.MailMessage
    Imports System.Net.Mail.Attachment
    Imports System.Net.Mail.SmtpClient
    Imports System.IO
    Imports System.Text
    Imports System.Text.Encoding
    Imports System.Threading

    Public Class Form1
      Private setupForm As New NetMail.Form2

      Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
        If e.Button Is btnSend Then
          Dim mailThread As New Thread(New ThreadStart(AddressOf ProcessMail))

          mailThread.Start()
        End If

        ' 處理附件
        If e.Button Is btnAttach Then
          With OpenFileDialog1
            .Filter = "All files (*.*)|*.*"
            .InitialDirectory = Directory.GetCurrentDirectory()
            .Title = "Select Attachment"
          End With

          If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            lstAttachment.Items.Add(OpenFileDialog1.FileName)
          End If
        End If

        If e.Button Is btnClear Then
          txtTo.Clear()
          txtCc.Clear()
          txtBcc.Clear()
          txtSubject.Clear()
          txtMessage.Clear()
          lstAttachment.Items.Clear()
          chkHTML.Checked = False
          cboPriority.SelectedIndex = 0
        End If
      End Sub

      Private Sub mnuProfile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuProfile.Click
        setupForm.ShowDialog()
      End Sub

      Private Sub mnuExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuExit.Click
        End
      End Sub

      Protected Sub ProcessMail()
        Dim mailClient As System.Net.Mail.SmtpClient
        Dim mailmsg As System.Net.Mail.MailMessage
        Dim mailAttach As System.Net.Mail.Attachment
        Dim fromAddress As MailAddress = Nothing
        Dim toAddress As MailAddress = Nothing
        Dim ccAddress As MailAddress = Nothing
        Dim bccAddress As MailAddress = Nothing

        Dim i As Integer

        Try
          ' 設定SMTP郵件伺服器的DNS名稱或IP位址及通訊埠
          mailClient = New SmtpClient(sHost, 25)

          ' 設定寄件者郵件地址
          fromAddress = New MailAddress(sFrom)

          ' 設定收件者郵件地址
          If txtTo.Text <> "" Then
            toAddress = New MailAddress(txtTo.Text)
          End If

          ' 設定副本收件者郵件地址
          If txtCc.Text <> "" Then
            ccAddress = New MailAddress(txtCc.Text)
          End If

          ' 設定密件副本收件者郵件地址
          If txtCc.Text <> "" Then
            bccAddress = New MailAddress(txtBcc.Text)
          End If

          mailmsg = New MailMessage(fromAddress, toAddress)

          mailmsg.CC.Add(ccAddress)
          mailmsg.Bcc.Add(bccAddress)

          ' 設定郵件主旨
          mailmsg.Subject = txtSubject.Text

          ' 設定郵件內文的字元編碼格式
          mailmsg.BodyEncoding = System.Text.Encoding.UTF8

          ' 設定郵件內文
          mailmsg.Body = txtMessage.Text

          ' 設定郵件內文是否為HTML格式
          If chkHTML.Checked Then
            mailmsg.IsBodyHtml = True
          Else
            mailmsg.IsBodyHtml = False
          End If

          ' 處理附件
          For i = 0 To lstAttachment.Items.Count - 1
            mailAttach = New Attachment(lstAttachment.Items(i))
            mailmsg.Attachments.Add(mailAttach)
          Next

          ' 優先處理順序
          Select Case cboPriority.SelectedIndex
            Case 0
              mailmsg.Priority = System.Net.Mail.MailPriority.Normal
            Case 1
              mailmsg.Priority = System.Net.Mail.MailPriority.Low
            Case 2
              mailmsg.Priority = System.Net.Mail.MailPriority.High
          End Select

          Dim CurThread As Thread

          CurThread = System.Threading.Thread.CurrentThread

          SyncLock CurThread
            ' 郵件傳送
            mailClient.Send(mailmsg)
          End SyncLock

          mailmsg = Nothing

          MessageBox.Show("Send Mail Successfully.", "Net Mail", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)

        Catch ex As Exception
          MessageBox.Show("Send Mail Error: " & ex.ToString, "Net Mail", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
        End Try
      End Sub
    End Class

    2008年6月23日 上午 01:39

解答

  • 你有給 SMTP Server 的 address 嗎?

    我 trace 了一下出現問題的指令,發現它會檢查 domain 中的字元是否有不在 ASCII code 中的字元。

    你可能要看看有沒有打錯,或者輸入的 address 的字元有問題。

     

    另外還有一種可能,就是你的本機電腦名稱是不是中文 (或是非 ASCII 字元) ?

    如果是,它也會導致 SMTP 的傳送出現無效字元的錯誤。
    2008年6月23日 上午 10:50
    版主
  •  小修韓 寫信:


    請問,有辦法解決無法使用中文電腦名稱問題嗎?

     

    目前無解,因為中文名稱無法通過 0xff 的 ASCII code 檢查,所以只有看看未來微軟會不會將 .NET Framework 核心程式修改以支援中文。

    2008年6月24日 上午 02:07
    版主

所有回覆



  • 您好!
    那一篇之前有參考過了,可是還是看不出我的問題!
    不過還是謝謝您!
    2008年6月23日 上午 02:58
  • 你的 mail address 中有沒有包含一些無效的字元 (ex: 中文字) ?

    或者,在寄送多個信箱時,使用的分隔字元不是分號 (";") ?

     

    2008年6月23日 上午 03:43
    版主
  • 感謝小朱引用我的文章 Big Smile

     

    如果是我那篇描述的問題, 你應該是會看到 SmtpException, 而不是 FormatException.

     

    既然你發生的狀況是 FormatException, 你輸入的 email address 格式不正確的可能性比較高.

     

    從你程式看不出來輸入的 email address 格式為何, 建議你把輸入的資訊跟發生 exception 時的 call stack 印出來會清楚很多.

     

    2008年6月23日 上午 07:34
  •  

    找到這篇, 比較接近你描述的問題, 大意是你輸入的 email address 內容包含雙引號的話, 會引發 FormatException.

     

     

    FIX: You receive a FormatException message when you use the System.Net.Mail class to send e-mail in the .NET Framework 2.0

    http://support.microsoft.com/kb/947323/en-us

     

     

    2008年6月23日 上午 07:39
  •  chicken.wu 寫信:

    感謝小朱引用我的文章

     

    好文就要多引用才對。

    只是不要在文章中出現 trace .NET Framework 的 source 比較好 ...

    2008年6月23日 上午 07:58
    版主
  • 他顯示的完整錯誤訊息是:

    System.Net.Mail.SmtpException: 傳送郵件失敗。 ---> System.FormatException: 郵件標頭中找到無效的字元。
       於 System.Net.BufferBuilder.Append(String value, Int32 offset, Int32 count)
       於 System.Net.Mail.EHelloCommand.PrepareCommand(SmtpConnection conn, String domain)
       於 System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
       於 System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
       於 System.Net.Mail.SmtpClient.GetConnection()
       於 System.Net.Mail.SmtpClient.Send(MailMessage message)
       --- 內部例外狀況堆疊追蹤的結尾 ---
       於 System.Net.Mail.SmtpClient.Send(MailMessage message)
       於 NetMail.Form1.ProcessMail() 於 D:\10-1\NetMail\Form1.vb: 行 131

    我有把輸入的mail地址都個別印出來一次沒發現有多數入或是少輸入的地方。
    這程式還有救嗎?
    2008年6月23日 上午 10:25
  • 你有給 SMTP Server 的 address 嗎?

    我 trace 了一下出現問題的指令,發現它會檢查 domain 中的字元是否有不在 ASCII code 中的字元。

    你可能要看看有沒有打錯,或者輸入的 address 的字元有問題。

     

    另外還有一種可能,就是你的本機電腦名稱是不是中文 (或是非 ASCII 字元) ?

    如果是,它也會導致 SMTP 的傳送出現無效字元的錯誤。
    2008年6月23日 上午 10:50
    版主
  •  小朱 寫信:

    你有給 SMTP Server 的 address 嗎?

    我 trace 了一下出現問題的指令,發現它會檢查 domain 中的字元是否有不在 ASCII code 中的字元。

    你可能要看看有沒有打錯,或者輸入的 address 的字元有問題。

     

    另外還有一種可能,就是你的本機電腦名稱是不是中文 (或是非 ASCII 字元) ?

    如果是,它也會導致 SMTP 的傳送出現無效字元的錯誤。

    我有給 host 位子
    使用者名稱也是英文的
    只有一項,PC電腦名稱確實是中文的!
    2008年6月23日 下午 02:28
  •  小修韓 寫信:
     小朱 寫信:

    你有給 SMTP Server 的 address 嗎?

    我 trace 了一下出現問題的指令,發現它會檢查 domain 中的字元是否有不在 ASCII code 中的字元。

    你可能要看看有沒有打錯,或者輸入的 address 的字元有問題。

     

    另外還有一種可能,就是你的本機電腦名稱是不是中文 (或是非 ASCII 字元) ?

    如果是,它也會導致 SMTP 的傳送出現無效字元的錯誤。

    我有給 host 位子
    使用者名稱也是英文的
    只有一項,PC電腦名稱確實是中文的!

    剛剛 Try 了一下,改了電腦名稱。
    還真的是電腦名稱的問題!

    請問,有辦法解決無法使用中文電腦名稱問題嗎?

    2008年6月23日 下午 04:11
  •  小修韓 寫信:


    請問,有辦法解決無法使用中文電腦名稱問題嗎?

     

    目前無解,因為中文名稱無法通過 0xff 的 ASCII code 檢查,所以只有看看未來微軟會不會將 .NET Framework 核心程式修改以支援中文。

    2008年6月24日 上午 02:07
    版主
  • 要養成一個習慣,即使 Windows 支援,電腦名、帳號名永遠不要用英文的。

     

    很多外文的軟體並不支援遠東語系,用中文的很容易出問題。

     

    電腦名中文可能會引起的問題可能是 MessageId 自動產生的問題,你可以試看看強制指定 MessageId 。

    2008年6月24日 下午 02:14
    版主
  •  璉璉 寫信:

    要養成一個習慣,即使 Windows 支援,電腦名、帳號名永遠不要用英文的。

     

    很多外文的軟體並不支援遠東語系,用中文的很容易出問題

     

    那是要還是不要 XD ~

    2008年6月27日 上午 10:24
    版主
  • 抱歉, 看到這裡忍不住笑出來...

     

    hostname 我是都養成好習慣, 就統一用 FQDN, 或是 IP address.

    不過現在 DNS 也開始支援中文網域, hmm.. 越來越麻煩, 真的是只能自己注意不要用

    超過 127 的字元

    2008年6月27日 上午 10:38
  • ㄜ~

    永遠不要用文的~

     

    大家都知道的嘛~就原諒我吧~

     

    抱歉~抱歉~

    2008年6月27日 上午 11:29
    版主
  • 我遇到的問題是這樣

    {"name":"FormatException","message":"標頭名稱中找到無效的字元。","stackTrace":"  

    System.Net.Mime.MailBnfHelper.ValidateHeaderName(String data)\r\n  

    System.Net.Mime.HeaderCollection.Add(String name, String value)\r\n  

    XXXXXXX.SendMail(String mailFrom, ArrayList mailTo, ArrayList mailBCC, ArrayList mailCC, String mailSubject, String mailBody, ArrayList mailAttach)

    XXXXXXX\\MailService.cs: 129\r\n   


    一樣是吐出 FormatException 標頭名稱中找到無效的字元。 的錯誤
    為了要讓smtp要做驗證的動作,我加了這樣的程式碼

    這一行就是129行
    MailMessage.Headers.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); //基本驗證


    下面是我用 Reflector去看的


    ====== 板主修改:由於貼出了在 .NET Framework 中的原始碼,有侵犯版權之虞,故移除此部份 ======

     

     

    s_ftext是個bool[]

     

    到這裡 我還看出不是那裡錯。



    是否有大大可以幫忙


    2008年8月14日 上午 08:21
  • 最後改了寫法

    找了兩種寫法

    CredentialCache myCache = new CredentialCache();
    myCache.Add(ip, 25, "Basic", new NetworkCredential(AuthUserId, AuthPassword));
    smtp.Credentials = myCache;


    and


    NetworkCredential basicAuthenticationInfo = new NetworkCredential(AuthUserId, AuthPassword);
    smtp.Credentials = basicAuthenticationInfo;
    2008年9月1日 上午 05:56
  • 這個問題發生在

    mailmsg.BodyEncoding = System.Text.Encoding.UTF8

     

    不要指定 BodyEncoding 就可以正常發送, 不知道為什麼咧!?

     

    2008年10月16日 上午 01:09