c# Пользовательские заголовки MailMessage — с использованием System.Net.Mail;

Вот мой метод тестирования заголовков MailMessage:

   private void Send_Email(string smtp_server, int port, string display_name, string from, string to, string subject, string html_body, string sender_email, string sender_password)
        {
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress(from, display_name, Encoding.UTF8);
            mail.To.Add(to);

            mail.SubjectEncoding = Encoding.UTF8;
            mail.Subject = subject;

            mail.Headers.Add("Reply-To", "Reply-To__ <" + from + ">");
            mail.Headers.Add("Sender", from);
            mail.Headers.Add("Return-Path", from);
            mail.Headers.Add("MIME-Version", "1.0");

            string boundary = Guid.NewGuid().ToString();
            mail.Headers.Add("Content-Type", "multipart/mixed; boundary=--" + boundary);

            //mail.Headers.Add("", Environment.NewLine);
            //mail.Headers.Add("", Environment.NewLine);

            //mail.Headers.Add("", "--" + boundary);
            //mail.Headers.Add("Content-Type", "text/html; charset=utf-8");
            //mail.Headers.Add("Content-Transfer-Encoding", "base64");
            //mail.Headers.Add("", Environment.NewLine);
            //var bytes = Encoding.UTF8.GetBytes(html_body);
            //var base64 = Convert.ToBase64String(bytes);
            //mail.Headers.Add("", base64.ToString());
            //mail.Headers.Add("", "--" + boundary);

            SmtpClient smtp = new SmtpClient();
            smtp.UseDefaultCredentials = true;
            //smtp.Credentials = new System.Net.NetworkCredential(sender_email, sender_password);
            smtp.Host = smtp_server;
            smtp.Port = port;
            smtp.Timeout = 60000;

            smtp.SendCompleted += (s, e) =>
            {
                if (e.Cancelled)
                {
                    MessageBox.Show("sending email was canceled");
                }
                if (e.Error != null)
                {
                    MessageBox.Show("sending email was failed -> Error : " + e.Error.ToString());
                }
                else
                {
                    MessageBox.Show("email was sent successfully");
                }

                mail.Dispose();
            };

            try
            {
                smtp.SendAsync(mail, null);
            }
            catch (System.Net.Mail.SmtpException exp)
            {
                MessageBox.Show("sending email was failed, SmtpException -> Error : " + exp.ToString());

                mail.Dispose();
            }
        }

В php ваши руки свободны и вы можете очень хорошо создавать заголовки и структуру почты,
Взгляните на этот пример:
http://www.sanwebe.com/2011/01/send-php-mail-with-attachment
Я хочу сделать что-то вроде php в .Net и сделать мою структуру почты с помощью заголовков.
Но ошибки в моих кодах связаны с этими строками:

mail.Headers.Add("", "бло бло бло");

И Ошибка :

Часть имени не может быть пустой...

Как я могу обойти эту ошибку и создать каждый кусок моей почты, используя заголовки:
такие как -> Тело - Вложения - и т.д.


После ответ на мой вопрос, я выясню, как я могу объединить несколько Content-Types:
например -> html - plain/text - октет - и т. д.


person SilverLight    schedule 05.09.2015    source источник


Ответы (2)


Я думаю, что это подпадает под действие RFC 2822, https://tools.ietf.org/html/rfc2822#section-2.2:

2.2. Поля заголовка

Поля заголовка представляют собой строки, состоящие из имени поля, за которым следует двоеточие (":"), за которым следует тело поля и которые заканчиваются символом CRLF. Имя поля ДОЛЖНО состоять из печатных символов US-ASCII (т. е. символов со значением от 33 до 126 включительно), кроме
двоеточия.
Тело поля может состоять из любых символов US-ASCII. Символы ASCII,
кроме CR и LF. Тем не менее, тело поля может содержать CRLF, когда
используется в заголовках "свертывание" и "развертывание", как описано в разделе 2.2.3. Все тела полей ДОЛЖНЫ соответствовать синтаксису, описанному в разделах 3 и 4 этого стандарта.

Похоже, что пустая строка не допускается.

Использование 5-часового тайм-аута SMTP является чрезмерным. Диапазон от 5 секунд до 60 секунд является более разумным.

person Loathing    schedule 05.09.2015
comment
спасибо за ответ, есть ли способ просматривать заголовки почты и работать с ними? В Хроме или ФФ или как-то иначе? - person SilverLight; 05.09.2015
comment
Похоже, вы столкнулись с проблемой XY: мета .stackexchange.com/questions/66377/what-is-the-xy-problem - person Loathing; 05.09.2015
comment
Извините за этот комментарий, и вопрос моего предыдущего комментария не является вопросом stackoverflow.com, и именно поэтому я задал его в комментариях! - person SilverLight; 05.09.2015

Из MSDN:

Следующий список почтовых заголовков не следует добавлять с помощью свойства Headers, и любые значения, заданные для этих заголовков с помощью свойства Headers, будут отброшены или перезаписаны когда сообщение отправлено:

Bcc

Cc

Content-ID

Content-Location

Content-Transfer-Encoding

Content-Type

Date

From

Importance

MIME-Version

Priority

Reply-To

Sender

To

X-Priority
person jsanalytics    schedule 05.09.2015
comment
так в чем же польза человека от заголовков? я не упоминал об этой ссылке MSDN -> Не устанавливайте это !!!! - person SilverLight; 05.09.2015
comment
Насколько я понимаю, некоторые заголовки могут быть установлены с использованием свойства Headers, но не все, потому что для них уже есть определенные свойства. - person jsanalytics; 05.09.2015
comment
также некоторые свойства в классе MailMessage доступны только для чтения. Что это за ужасный класс? - person SilverLight; 05.09.2015
comment
Кстати, текст, который я разместил, взят из ссылки MSDN. Итак, он ДЕЙСТВИТЕЛЬНО говорит: «Не устанавливайте это ...: O) - person jsanalytics; 05.09.2015
comment
Свойства, доступные только для чтения, обычно должны быть установлены через соответствующий конструктор. - person jsanalytics; 05.09.2015