當下面的代碼中的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。
我有三個例子:
送達:
mailFromName = "xxx xxxxxxxxx xxxx - xxxxxxxxxx xxxxxxx xxxxxxxxx"
未送達:
mailFromName = "xxx xxxxxxxxx xxxx - xxxxxxxxxx xxxxxxx xxxxxxæxx"
送達:
mailFromName = "æxx xxxxxxxxx xxxx - xxxxxxxxxx xxxxxxx xxxxxxxxx"
似乎很明顯,這是一個編碼問題。至少通過[這個Q + A]工作(http://stackoverflow.com/questions/20604551/mandrill-reject-reason-invalid-sender)。如果這樣做沒有幫助,那麼就要明確地知道你的地址被拒絕了。 –
感謝您的評論,我翻閱了您的鏈接,但並未真正與我們的問題相關 - 請參閱我更新的問題以獲取更多詳細信息。 – Muleskinner
「SmtpClient」上有一個名爲'DeliveryFormat'的設置。如果將此設置爲「國際」,會發生什麼情況? 'SmtpClient.DeliveryFormat = SmtpDeliveryFormat.International' – GTHvidsten