Подтвердить что ты не робот

Как создать многострочный объект в С# System.Net.Mail.MailMessage

Если вы создаете свойство body как

System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();

message.Body ="First Line \n second line";

Я также пробовал

message.Body ="First Line" + system.environment + "second line";

Оба они были проигнорированы, когда я получил сообщение (используя Outlook).

Любые идеи о том, как получить несколько строк? Я стараюсь избегать кодирования html, так что письмо будет лучше работать со спам-фильтрами.

спасибо

4b9b3361

Ответ 1

В соответствии с комментарием drris, если для параметра IsBodyHtml установлено значение true, стандартная новая строка потенциально может быть проигнорирована по дизайну, я знаю, что вы упомянули об избежании HTML, но попробуйте использовать <br /> вместо этого, даже если просто посмотреть, "решает" проблему - тогда вы можете исключить, что вы знаете:

var message = new System.Net.Mail.MailMessage();
message.Body = "First Line <br /> second line";

Вы также можете просто попробовать установить IsBodyHtml на false и определить, работают ли в этом экземпляре новые строки, хотя, если вы явно не установите его в true, я уверен, что по умолчанию он равен false.

Также как побочная заметка, избегая HTML-сообщений в электронной почте, необязательно любая помощь в получении сообщения через фильтры спама, AFAIK - если что-нибудь, тем больше вы это делаете, это обеспечение совместимости между почтовыми клиентами и совместимостью с точки зрения макета. Чтобы "играть хорошо" со спам-фильтрами, необходимо учитывать ряд других вещей; даже в том, что касается темы и содержания почты, от которой отправляется почта и где и что они соответствуют и так далее. Письмо просто не будет подвергаться дискриминации, поскольку оно помечено HTML.

Ответ 2

Начало каждой новой строки с двумя пробелами позволит избежать автоматического удаления, выполняемого Outlook.

var lineString = "  line 1\r\n";
linestring += "  line 2";

Будет отображаться правильно:

line 1
line 2

Это немного неуклюжее чувство, которое нужно использовать, но оно делает работу без больших усилий, затрачиваемых на нее.

Ответ 3

Если вам не нужен тело сообщения в html, отключите его:

message.IsBodyHtml = false;

затем используйте, например:

message.Body = "First line" + Environment.NewLine + 
               "Second line";

но если вам нужно иметь его в html по какой-либо причине, используйте html-tag:

message.Body = "First line <br /> Second line";

Ответ 4

Мне обычно нравится StringBuilder, когда я работаю с MailMessage. Добавление новых строк легко (с помощью метода AppendLine), и вы можете просто установить Тело сообщения равным StringBuilder.ToString() (... для экземпляра StringBuilder).

StringBuilder result = new StringBuilder("my content here...");
result.AppendLine(); // break line

Ответ 5

Ключ к этому - когда вы сказали

используя Outlook.

У меня была та же проблема с полностью отформатированными текстовыми сообщениями тела. Это Outlook, который делает мусор из него. Иногда достаточно любезно сообщить вам, что " дополнительные строки были удалены". Обычно он просто делает то, что хочет, и заставляет вас выглядеть глупо.

Итак, я вложил в своеобразное тело и положил свой хороший форматированный текст в приставку. Вы можете либо сделать это, либо форматировать тело в HTML.

Ответ 6

Попробуйте использовать оператор verbatim "@" перед вашим сообщением:

message.Body = 
@"
FirstLine
SecondLine
"

Считайте, что расстояние текста от левого поля влияет на реальное расстояние от левого поля электронной почты.

Ответ 7

Попробуйте использовать объект StringBuilder и используйте метод appendline. Это может сработать.

Ответ 8

Ответ приведен в коде, представленном silvia elena в в этой статье.

Ответ 9

Что-то, что сработало для меня, было просто разделение данных с помощью :

message.Body = FirstLine + ":" + SecondLine;

Я надеюсь, что это поможет

Ответ 10

Сегодня я нашел ту же проблему в приложении отчетов об ошибках. Я не хочу прибегать к HTML, чтобы позволить Outlook отображать сообщения, которые я должен был делать (при условии, что StringBuilder sb):

sb.Append(" \r\n\r\n").Append("Exception Time:" + DateTime.UtcNow.ToString());

Ответ 11

Попробуйте это

IsBodyHtml = false,
BodyEncoding = Encoding.UTF8,
BodyTransferEncoding = System.Net.Mime.TransferEncoding.EightBit

Если вы хотите использовать \r\n

Мне удалось получить мою работу после попытки на целый день!

Ответ 12

Я понимаю, что на это, возможно, уже был дан ответ. Тем не менее, у меня была эта проблема сегодня утром, когда Environment.Newline не сохраняется в теле письма. Ниже приведен полный (теперь работающий с Environment.Newline) метод, который я использую для отправки электронной почты через мою программу. (Часть Modules.MessageUpdate может быть пропущена, так как это просто записывается в файл журнала, который у меня есть.) Это расположено на главной странице моей программы WinForms.

    private void MasterMail(string MailContents)
    {
        Modules.MessageUpdate(this, ObjApp, EH, 3, 25, "", "", "", 0, 0, 0, 0, "Master Email - MasterMail Called.", "N", MainTxtDict, MessageResourcesTxtDict);

        Outlook.Application OApp = new Outlook.Application();
        //Location of email template to use. Outlook wont include my Signature through this automation so template contains only that.
        string Temp = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + ResourceDetails.DictionaryResources("SigTempEmail", MainTxtDict);

        Outlook.Folder folder = OApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDrafts) as Outlook.Folder;

        //create the email object.
        Outlook.MailItem TestEmail = OApp.CreateItemFromTemplate(Temp, folder) as Outlook.MailItem;

        //Set subject line.
        TestEmail.Subject = "Automation Results";

        //Create Recipients object.
        Outlook.Recipients oRecips = (Outlook.Recipients)TestEmail.Recipients;

        //Set and check email addresses to send to.
        Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add("EmailAddressToSendTo");
        oRecip.Resolve();

        //Set the body of the email. (.HTMLBody for HTML Emails. .Body will preserve "Environment.NewLine")
        TestEmail.Body = MailContents + TestEmail.Body;
        try
        {
            //If outlook is not open, Open it.
            Process[] pName = Process.GetProcessesByName("OUTLOOK.EXE");
            if (pName.Length == 0)
            {
                System.Diagnostics.Process.Start(@"C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE");
            }

            //Send email
            TestEmail.Send();

            //Update logfile - Success.
            Modules.MessageUpdate(this, ObjApp, EH, 1, 17, "", "", "", 0, 0, 0, 0, "Master Email sent.", "Y", MainTxtDict, MessageResourcesTxtDict);
        }
        catch (Exception E)
        {
            //Update LogFile - Fail.
            Modules.MessageUpdate(this, ObjApp, EH, 5, 4, "", "", "", 0, 0, 0, 0, "Master Email - Error Occurred. System says: " + E.Message, "Y", MainTxtDict, MessageResourcesTxtDict);
        }
        finally
        {
            if (OApp != null)
            {
                OApp = null;
            }
            if (folder != null)
            {
                folder = null;
            }
            if (TestEmail != null)
            {
                TestEmail = null;
            }
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }

Вы можете добавить нескольких получателей, указав ";" между адресами электронной почты вручную или одним из моих других методов, которые я заполняю из файла Txt в словаре и использую для создания адресов получателей с помощью следующего фрагмента.

        foreach (KeyValuePair<string, string> kvp in EmailDict)
        {
            Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add(kvp.Value);
            RecipientList += string.Format("{0}; ", kvp.Value);
            oRecip.Resolve();
        }

Я надеюсь, что по крайней мере некоторые из них помогут кому-то.