2010-03-15 12 views
5

ile uyumlu olarak kodlamaz. Nesnenin ASCII aralığının dışında karakterler içerebileceği bir e-posta göndermek için .NET SmtpClient kullanıyorum. RFC 2047, özel karakterler içerdiğinde e-posta metninin nasıl kodlanması gerektiğini tanımlar.SmtpClient (.NET), posta üstbilgisini RFC 2047

Subject: =?iso-8859-1?Q?Votre=20enregistrement=20num=E9ro=20123?=

:

Subject: Votre enregistrement numéro 123

Bu haline gelmelidir ISO-8859-1 kodlama sonra, ortalama: E-posta başlığında bir öznenin bir örnektir ?, = (ve diğerleri) ve diğerleri dahil olmak üzere tüm özel karakterler için

Boş yer, =xx çıkış sırasını kullanarak kodlanır. Ben SmtpClient ürettiğinin baktığımızda

Ancak, ben posta istemcisi bu başlığı aldığı anlamına gelir, beyaz boşluk kaçmak olmadığını keşfediyorlar:

Subject: =?iso-8859-1?Q?Votre enregistrement num=E9ro 123?=

anlamı o kodlama RFC 2047'ye göre bozulur. Bazı e-posta istemcileri bu yanlış kodlamadan (Outlook ve Gmail de dahil olmak üzere çoğu) mükemmel bir şekilde memnun olur, ancak bir (wanadoo.fr) görüntülenir. Ham biçiminde başlık. Bu kullanıcı

bu sorun için bilinen herhangi bir çözüm var mı :-(görmek almalısınız ne değildir

Not:? SmtpClient ait .NET 4.0 uygulaması beklendiği gibi konuyu kodlar, bu çıktıyı veren hangi doğrudur:

Subject: =?Windows-1252?Q?Votre_enregistrement_num=E9ro_123?=

+0

ama RFC 2047 nasıl yorumluyorsunuz, özellikle bölüm 4.2 teyit edecektir (3): "Özellikle, SPACE ve SEKME kodlanmış kelimeler içinde kendileriyle temsil edilmemelidir". (= 20 yerine bir alt çizgi de kullanabilirsiniz) büyük soru/yükseltilen sorun için – Joe

+0

+1 ve aslında ilgili RFC'den alıntı yaptığınız, ödevlerinizi tamamladınız ve yine de – curtisk

+0

çözümünü çözmeniz gereken bir sorun var mı? Mesaj kodlaması mı yoksa SmtpClient'in varsayılan şekilde çalışmasına izin veriyor musunuz? – Timores

cevap

3

sorun SMTP gönderen jenerik alıntı-yazdırılabilir enc kullanmasıdır Başlıklar için özel mod hakkında hiçbir şey bilmeyen oder, bu yüzden basit bir çözüm olmayacağından şüpheleniyorum.

Yapacağım şey, ASCII olmayan karakterler olup olmadığına bakılmaksızın nesnenin kodlanacağı ve eğer öyleyse alt çizgilere sahip alanların (ASCII 95) değiştirilip değiştirilmediğini kontrol etmektir. Bu, alt çizgi karakterinin posta okuyucusu tarafından bir alan olarak yorumlanması gerektiği, ancak naif kodlayıcı tarafından kodlanmaması gerektiğinden çalışmalıdır. Belki bu kod çalışır:

string FixSubject(string subject) 
{ 
    foreach (char ch in subject) 
     if (ch > '\x007f') 
      return subject.Replace(" ", "_"); 
    return subject; 
} 

diğer olasılık yerine alıntılanan-yazdırılabilir ait başlıkların Base64 kodlama tetikler gözükmektedir çünkü Unicode veya UTF-8 e-postanızın kodlamayı ayarlamaktır. Farklı bir kodlayıcı kullanmak, hatayı tamamen ortadan kaldırmalıdır.

+0

Gerçekten de, konunun alt çizgi ile yer değiştirmesi doğru bir başlık üretir. –

+1

Bu hack artık .NET 4.0 ile gerekli değildir. –

1

Bu, SmtpClient'un NET 4.0 uygulamasında giderilmiştir.Doğru olan bu çıktıyı, verimli, beklendiği gibi konuyu kodlar: Sana bir çözüm yok

Subject: =?Windows-1252?Q?Votre_enregistrement_num=E9ro_123?=

İlgili konular