2017-05-19 33 views
4

當下面的代碼中的mailFromName包含「æ」,「ø」或「å」時,我們正面臨通過Mandrill發送郵件的困難問題。當我們使用另一個SMTP時,郵件發送完美。使用SmtpClient與Mandrill SMTP發送.NET失敗

Mail.ReplyToList.Add(New MailAddress(mailFromAddress, mailFromName, System.Text.Encoding.UTF8)) 

我們使用.NET smtpClient類。

Dim SmtpClient As New System.Net.Mail.SmtpClient 
SmtpClient.Send(Mail) 
SmtpClient.Dispose() 

UPDATE

正如評論所說,我同意這看起來像一個編碼的問題,但不能看看我能做些什麼就在我們身邊。

這似乎是隻連接到RepleyToList含有℃,O和a和不Mail.To,這是我在類似的方式定義是這樣的:

Dim mTo As New MailAddress(mailToAddress, mailToName, System.Text.Encoding.UTF8) 
Mail.To.Add(mTo) 

mailToName可以包含℃,O和a和被髮送完全沒問題。

很難證明某些事情沒有發生,但我確信郵件不會發送,並且我確信它已連接到replyToList中的sendername。

我怎麼知道?

我在發送之前記錄郵件。包含相關字符的郵件將被記錄,但在https://mandrillapp.com/activity中永遠不會顯示,並且永遠不會收到收件人。我刪除了æ,ø或å - 所有這些都可以在Mandrill Overview中看到,並且都可以。

想看看我的完整代碼嗎?

在這裏,請注意發送失敗的郵件不會產生異常。

Public Sub sendMail(ByVal mailFromAddress As String, ByVal mailFromName As String, _ 
         ByVal mailToAddress As String, ByVal mailToName As String, ByVal mailCcAddress As String, ByVal mailBCcAddress As String, _ 
         ByVal mailPriority As Net.Mail.MailPriority, ByVal IsBodyHtml As Boolean, ByVal mailSubject As String, _ 
         ByVal bodyPlain As String, ByVal bodyHTML As String) 
    Const maxtry As Integer = 3 
    Dim tries As Integer = 0 
    Dim failed As Boolean = False 

    ' mailFromName = mailFromName.Replace("æ", "ae") 

    Do 
     tries += 1 

     Try 

     failed = False 
     Dim Mail As New MailMessage 


     If mailFromAddress <> String.Empty Then 
      'Mail.ReplyTo = New MailAddress(mailFromAddress, mailFromName, System.Text.Encoding.UTF8) 
      Mail.ReplyToList.Add(New MailAddress(mailFromAddress, mailFromName, System.Text.Encoding.UTF8)) 
     Else 
      'Mail.ReplyTo = New MailAddress(Me.MailAddressFrom, Me.MailAddressDisplayName, System.Text.Encoding.UTF8) 
      Mail.ReplyToList.Add(New MailAddress(Me.MailAddressFrom, Me.MailAddressDisplayName, System.Text.Encoding.UTF8)) 
     End If 
     Mail.From = New MailAddress(Me.MailAddressFrom, Me.MailAddressDisplayName, System.Text.Encoding.UTF8) 
     Mail.Sender = New MailAddress(Me.MailAddressFrom, Me.MailAddressDisplayName, System.Text.Encoding.UTF8) 

     If mailToAddress <> String.Empty Then 
      Dim mTo As New MailAddress(mailToAddress, mailToName, System.Text.Encoding.UTF8) 'UTF8 
      Mail.To.Add(mTo) 
     End If 
     If mailCcAddress <> String.Empty Then 
      Dim mCc As New MailAddress(mailCcAddress) 
      Mail.CC.Add(mCc) 
     End If 
     If mailBCcAddress <> String.Empty Then 
      Dim mBCc As New MailAddress(mailBCcAddress) 
      Mail.Bcc.Add(mBCc) 
     End If 

     Mail.Priority = mailPriority 

     Mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure 

     Mail.IsBodyHtml = IsBodyHtml 
     Mail.HeadersEncoding = Encoding.GetEncoding("utf-8") 

     Mail.Subject = mailSubject 
     Mail.SubjectEncoding = Encoding.GetEncoding("utf-8") ' = System.Text.Encoding.Default 'UTF8 'Default ' Test on all possible encodings 

     If IsBodyHtml Then 
      Mail.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(bodyHTML, System.Text.Encoding.Default, "text/html")) 
     End If 
     Mail.BodyEncoding = Encoding.GetEncoding("utf-8") 
     Mail.Body = bodyPlain 

     ' Add to log 
     addToMailLog(mailToAddress, mailCcAddress, mailSubject, bodyPlain) 

     ' Send 
     Dim SmtpClient As New System.Net.Mail.SmtpClient 
     'SmtpClient.ServicePoint.MaxIdleTime = 1 
     SmtpClient.Send(Mail) 
     Me._status = EMailStatus.EOkay 
     SmtpClient.Dispose() 

     Catch ex As Exception 
     Dim debugInfo As New CDebug("sendMail", "Try: " & tries.ToString & ", UserId: " & Me.UserId, ex.ToString, Me.UserId, String.Empty) 
     Me._status = EMailStatus.EMailSendError 
     failed = True 
     End Try 

    Loop Until (failed = False Or tries >= maxtry) 

    End Sub 

UPDATE II

我現在已經跟蹤使用的是Wireshark的SMTP通信。查看截圖,其中顯示了未送達郵件的通信,並且未顯示在Mandrill活動列表中 - 即使我們獲得SMTP響應確定和排隊ID。

smtp capture

我有三個例子:

送達:

mailFromName = "xxx xxxxxxxxx xxxx - xxxxxxxxxx xxxxxxx xxxxxxxxx" 

未送達:

mailFromName = "xxx xxxxxxxxx xxxx - xxxxxxxxxx xxxxxxx xxxxxxæxx" 

送達:

mailFromName = "æxx xxxxxxxxx xxxx - xxxxxxxxxx xxxxxxx xxxxxxxxx" 
+0

似乎很明顯,這是一個編碼問題。至少通過[這個Q + A]工作(http://stackoverflow.com/questions/20604551/mandrill-reject-reason-invalid-sender)。如果這樣做沒有幫助,那麼就要明確地知道你的地址被拒絕了。 –

+0

感謝您的評論,我翻閱了您的鏈接,但並未真正與我們的問題相關 - 請參閱我更新的問題以獲取更多詳細信息。 – Muleskinner

+0

「SmtpClient」上有一個名爲'DeliveryFormat'的設置。如果將此設置爲「國際」,會發生什麼情況? 'SmtpClient.DeliveryFormat = SmtpDeliveryFormat.International' – GTHvidsten

回答

3

我相信我已經找到了解釋。似乎smtpclient在主題和回覆顯示名稱的約72個字符後添加一個新行。問題是,這似乎發生在字符串編碼後。因此,在某些情況下,在編碼字符中間添加一個新行字符,該字符非法。

我不確定爲什麼Mandrill SMTP服務器失敗而沒有返回錯誤,而其他SMTP服務器處理的情況就好了。

現在,我明白髮生了什麼,我必須找出解決辦法 - 最好的建議可以得到賞金。