Проблема с Header-ом в SmtpClient-е

Tural
Дата: 12.05.2006 11:31:38
Недавно столкнулись с одной проблемой. Есть программа, которая рассылает письма клиентам. Недавно письма на один местный почтовый сервер перестали доходить. Позвонили им и выяснили, что они поставили спам фильтр, и теперь она отмечает наши письма как спам из-за того, что в header-е письма слова "Message", "From", "To" полностью пушиться в нижнем регистре. Я посмотрел несколько писем с разных серверов и заметил что действительной, в письме отправленных нашей программе пишется "from", тогда как в других пишутся "From". Например:

Наша программа:
...
from: xxxxxxxxx <xxxxxxx@xxxxxxx.xx>
to: xxxxxxxxxxxxxxxxxx@xxxxx.xxx
date: 11 May 2006 09:40:54 +0500
subject: =?utf-8?Q?Accounts information?=
...

сервер с MDaemon
Received: ...
(MDaemon.PRO.v8.0.1.R)
with ESMTP id md50000110673.msg
...
...
From: ...
To: "xxxx xxxxxxxx" <xxxxxxxxxxxxxxxxxx@xxxxx.xxx>
Subject: ...

Если отправлять с нашего же сервера через Outlook, то там тоже заголовки пишутся с большой буквы. Выходит что, заголовок формирует программа клиент. Программа - сервис написанная на C# 2.0 (VS2005 Pro). Мои вопросы:
1. Если какой нибудь стандарт, соглашение и т.п. в которой говориться что эти слова должны начинаться с большой буквы?
2. Можно ли решить эту проблему не прибегая к компонентам третьих производителей. Если да, то как? Если нет, то какой посоветуете?
Andres 1
Дата: 12.05.2006 15:02:59
Tural

1. Если какой нибудь стандарт, соглашение и т.п. в которой говориться что эти слова должны начинаться с большой буквы?
2. Можно ли решить эту проблему не прибегая к компонентам третьих производителей. Если да, то как? Если нет, то какой посоветуете?


1. Стандарт есть. RFC 2822. Есть ли там что про заглавные буквы - не знаю, почитайте сами.
2. Можно. В том месте вашей программы, где она посылает строку "from:", замените строку на "From:". Аналогично поступите с прочими заголовками.
Tural
Дата: 12.05.2006 15:31:13
Где? Как можно заменить "from" на "From".
                ...
                MailAddress fromma = new MailAddress(FromMailAddress, FromDisplayName);
                MailMessage message = new MailMessage();
                message.From = fromma;
                char[] charSeparators = new char[] { ',', ';', ' ' };
                string[] arToMailAddress = ToMailAddress.Trim().Split(charSeparators, StringSplitOptions.RemoveEmptyEntries);
                foreach (string strTemp in arToMailAddress)
                {
                    message.To.Add(new MailAddress(strTemp));
                }

                message.Subject = Subject;
                ...
                SmtpClient sc = new SmtpClient(SmtpServer);

                if (DoAuthentication)
                {
                    System.Net.NetworkCredential nc = new System.Net.NetworkCredential(AuthUserName, AuthUserPassword, AuthUserDomain);
                    sc.Credentials = nc;
                }
                sc.Send(message);                
Здесь ".From" это property и я не могу его менять. message.Headers только read-only.
Tural
Дата: 12.05.2006 16:08:11
Я попробовал удалить из заголовка письма From: и добавить заново. А также заодно добавил собственный параметр в заголовок - X-Organization:
...
message.Headers.Remove("From");
message.Headers.Add("From", "me@myorg.com");
message.Headers.Add("X-Organization", "MyOrg");
string[] keys = message.Headers.AllKeys;
foreach (string s in keys)
{
    MessageBox.Show(s + ": " +message.Headers[s]);
}
Так вот даже MessageBox выдал мне все имена параметров строчными буквами, тогда как значения оставил не понижая регистра:
from:me@myorg.com
x-organization:MyOrg
Andres 1
Дата: 12.05.2006 16:10:03
Tural
Где? Как можно заменить "from" на "From".

В той сборке, откуда вы берете MailAddress. Уже два сообщения в этой теме, а все еще скрываете, чем именно вы пользуетесь для отправки почты.
Дело в том, что из формулировки первоначального вопроса "не прибегая к компонентам третьих производителей" я сделал (неверный) вывод, что пока вы всю отсылку почты делаете в своей программе сами.
Andres 1
Дата: 12.05.2006 16:11:36
Tural
Я попробовал удалить из заголовка письма From: и добавить заново. А также заодно добавил собственный параметр в заголовок - X-Organization:
...
message.Headers.Remove("From");
message.Headers.Add("From", "me@myorg.com");
message.Headers.Add("X-Organization", "MyOrg");
string[] keys = message.Headers.AllKeys;
foreach (string s in keys)
{
    MessageBox.Show(s + ": " +message.Headers[s]);
}
Так вот даже MessageBox выдал мне все имена параметров строчными буквами, тогда как значения оставил не понижая регистра:
from:me@myorg.com
x-organization:MyOrg

Да покажите же using директивы. Или скажите, чем пользуетесь.
Andres 1
Дата: 12.05.2006 16:13:48
понял :) System.Net.Mail
Tural
Дата: 12.05.2006 16:35:20
Да. System.Net.Mail.
Andres 1
Дата: 12.05.2006 16:51:26
1. System.Web.Mail - хотя и помечен в документации как устаревший - шлет такие заголовки:

From test@------------------- Fri May 12 15:46:44 2006
Return-path: <test@------------------->
Envelope-to: andres@-------------------
Delivery-date: Fri, 12 May 2006 15:46:44 +0300
Received: from [194.126.101.98] (helo=mail.neti.ee)
by zeus.serverglobe.net with esmtp (Exim 4.52)
id 1FeX2Y-0008KV-RK
for andres@-------------------; Fri, 12 May 2006 15:46:43 +0300
Received: from pooh (80-235-75-230-dsl.medium.estpak.ee [80.235.75.230])
by Relayhost1.neti.ee (Postfix) with SMTP id 2B39318273
for <andres@------------------->; Fri, 12 May 2006 15:46:40 +0300 (EEST)
thread-index: AcZ1why0IEZcWMPsQsKZn+6hHpMf4g==
Thread-Topic: Test
From: <test@------------------->
To: <andres@------------------->
Subject: Test
Date: Fri, 12 May 2006 15:46:39 +0300
Message-ID: <000001c675c2$1cbbc210$6400a8c0@pooh>
MIME-Version: 1.0
Content-Type: text/plain;
charset="windows-1257"
Content-Transfer-Encoding: 7bit
X-Mailer: Microsoft CDO for Windows 2000
Content-Class: urn:content-classes:message
Importance: normal
Priority: normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
X-Virus-Scanned: by amavisd-new-2.2.1 (20041222) (Debian) at neti.ee
X-Antivirus-Scanner: Clean mail though you should still use an Antivirus

2. Можно попробовать этот класс
http://www.codeproject.com/csharp/smtpemailer.asp
То, что лежит на codeproject.com можно использовать свободно, проблем с лицензированием нет.
Tural
Дата: 12.05.2006 16:59:44
Как я могу использовать System.Web.Mail на Windows-сервисе. Выдается вот такая ошибка компиляции:

Error 1 The type or namespace name 'Mail' does not exist in the namespace 'System.Web' (are you missing an assembly reference?) C:\Projects\Visual Studio 2005\Projects\Test\SendMail\SendMail\MailClient.cs 3 18 SendMail


Я не хотел вообще-то использовать сторонние разроботки, но видимо придеться :(
Спасибо. Попробую посмотрю.