2016-02-02 14 views
8

Sử dụng các lớp SmtpClient, MailMessageMailAddress, tôi không thể gửi đến địa chỉ email như å[email protected] Tôi gặp lỗi/ngoại lệ như được hiển thị bên dưới:Không thể gửi email đến các địa chỉ có ký tự Scandinavia

Ký tự không hợp lệ được tìm thấy trong tiêu đề thư: 'å'.

--------------------------- Lỗi gửi email --------------- ------------ System.Net.Mail.SmtpException: Máy khách hoặc máy chủ chỉ được cấu hình cho các địa chỉ E-mail với ASCII các bộ phận địa phương: å[email protected]

tại System.Net.Mail.MailAddress.GetUser (Boolean allowUnicode)

tại System.Net.Mail.MailAddress.GetAddress (Boolean allowUnicode)

tại System.Net.Mail.MailAddress.Encode (Int32 charsConsumed, Boolean allowUnicode)

tại System.Net.Mail.MailAddressCollection.Encode (Int32 charsConsumed, Boolean allowUnicode) tại System.Net.Mail.Message.PrepareHeaders (Boolean sendEnvelope, Boolean allowUnicode) tại System.Net.Mail.Message.Send (BaseWriter nhà văn, Boolean sendEnvelope, Boolean allowUnicode) tại System.Net.Mail.SmtpClient.Send (message MailMessage)

Những nhân vật trong chủ đề của tôi/body là tốt, nhưng không phải trong địa chỉ email.

Tôi đã thử đặt SmtpClient.DeliveryMethod = SmtpDeliveryFormat.International hoặc MailMessage.HeadersEncoding = Encoding.Unicode (hoặc UTF8) và dường như không thay đổi bất cứ điều gì. Đây là những địa chỉ email thực sự của những người chúng ta cần giao tiếp với vì vậy đó là một vấn đề.

Tôi đã tìm hiểu mã nguồn .Net nhưng không thực sự nhận được ở bất kỳ đâu. Tôi đã theo dõi một tài sản ServerSupportsEai và Google cho tôi biết EAI là viết tắt của Địa chỉ email Quốc tế hóa (https://tools.ietf.org/html/rfc5336) nhưng nó không rõ ràng nếu đây là giới hạn trong mã của tôi hoặc nếu máy chủ cụ thể mà tôi đang nói đến không hỗ trợ điều này. .. kể từ khi tôi đang sử dụng một máy chủ thử nghiệm để tránh gửi email cho người Thụy Điển không nghi ngờ!

Ai đó có thể giúp tôi giải quyết vấn đề này không .Net hỗ trợ điều này, nếu vậy điều gì sẽ xảy ra nếu mã khách hàng của tôi làm điều đó?

+0

Tôi nghĩ rằng vấn đề có thể không có trong mã .NET, nhưng trong cấu hình máy chủ email của bạn. Bạn có thể thử sử dụng máy chủ khác không? – Pikoh

+0

(5336 được thay thế bằng 6531/2) Cơ sở này yêu cầu máy chủ SMTP hỗ trợ SMTPUTF8, hãy thử với Gmail, nếu nó hoạt động máy chủ của bạn phát sinh vấn đề. –

+0

Cảm ơn. Sau khi chiến đấu với gmail "ứng dụng của bạn không sử dụng tính năng bảo mật cập nhật và đã bị chặn" Tôi đang thử nghiệm điều này - mặc dù tôi vẫn không thể gửi cho người thực sự một cách lịch sự –

Trả lời

9

Để có thể gửi các ký tự UTF-8 theo RFC6531 cả máy khách và máy chủ đều cần hỗ trợ.

Nếu bạn sử dụng triển khai .NET SmtpClient, bạn sẽ cần nhắm mục tiêu khung phiên bản 4.5 vì triển khai đó hỗ trợ phần mở rộng SMTPUTF8.

Nếu bạn đặt DeliveryFormat tài sản mà bạn đã làm những gì cần thiết cho khách hàng của bạn để hỗ trợ ký tự UTF8:

using (var smtp = new SmtpClient()) 
{ 
    smtp.DeliveryFormat = SmtpDeliveryFormat.International; 

    var message = new MailMessage(
     "[email protected]", 
     "ëçïƒÖ@example.com", 
     "UTF8", 
     "Is UTF8 supported?"); 

    smtp.Send(message); 
} 

Nếu chúng ta thiết kế đối chiếu phương pháp Send chúng ta có thể dễ dàng theo dõi stack-trace từ câu hỏi của bạn .Bạn sẽ tìm thấy thi này:

if (!allowUnicode && !MimeBasePart.IsAscii(this.userName, true)) 
{ 
    throw new SmtpException(SR.GetString("SmtpNonAsciiUserNotSupported", new object[] 
    { 
     this.Address 
    })); 
} 

Đó allowUnicode boolean đang được cung cấp từ các phương pháp Send:

if (this.DeliveryMethod == SmtpDeliveryMethod.Network) 
{ 
    return this.ServerSupportsEai && this.DeliveryFormat == SmtpDeliveryFormat.International; 
} 

Bây giờ ở đây có các máy chủ trong hình. Khi nào boolean riêng ServerSupportsEai trở thành sự thật? Nó chỉ ra rằng về việc gửi lệnh EHLO các SmptConnection cuộc gọi ParseExtensions:

if (string.Compare(text, 0, "SMTPUTF8", 0, 8, StringComparison.OrdinalIgnoreCase) == 0) 
{ 
    ((SmtpPooledStream)this.pooledStream).serverSupportsEai = true; 
} 

Nếu bạn muốn biết trả trước nếu mail server của bạn được hỗ trợ mà phần mở rộng bạn chỉ có thể kết nối với một máy khách telnet (tôi sử dụng putty) để bạn máy chủ smtp và gửi lệnh EHLO somename và kiểm tra kết quả.

Đang kết nối đến smtp.gmail.com trên cổng 587 mang lại cho tôi kết quả này:

220 smtp.gmail.com ESMTP hx10sm19521922wjb.25 - gsmtp 
EHLO fubar 
250-smtp.gmail.com at your service, [2001:FFF:8bef:1:34d6:a247:FFFF:4620] 
250-SIZE 35882577 
250-8BITMIME 
250-STARTTLS 
250-ENHANCEDSTATUSCODES 
250-PIPELINING 
250-CHUNKING 
250 SMTPUTF8 

Chú ý dòng cuối cùng: nó giữ cần SMTPUTF8 của chúng tôi

tl; dr

Để có thể sử dụng ký tự quốc tế trong emailaddres đảm bảo đặt DeliveryFormat thành SmtpDeliveryFormat.International và sử dụng máy chủ SMTP hỗ trợ phần mở rộng SMTPUTF8 và quảng cáo nó trong lệnh EHLO.

Các vấn đề liên quan