Как создать многострочный объект в С# 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, так что письмо будет лучше работать со спам-фильтрами.
спасибо
Ответы
Ответ 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();
}
Я надеюсь, что по крайней мере некоторые из них помогут кому-то.