2015-06-25 5 views
1

Мне нужно отправить строку текста по электронной почте ... но приемник очень требовательна к его формату: он должен быть простым текстом ASCII.отправка длинной строки текста по электронной почте

Я пытался отправить Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable. К сожалению, моя строка довольно длинная (255 символов) и экранированные кавычки порезов этой строки после 78 символов в новую строку:

BUOYID, 55073, UTCDATE, 24/06/2015, UTCTime, 22: 42.00, STATUS , E0000, ZEROCRS, 201, А = VGHGT, 0.92, TZ, 6.4, MAXWAVE, 3.12, SIGWAVE, 1,63, SIGPERIOD, 9.3, H10,2.2, T10,9.5, M =

Видимо решение лежит при отправке текста в виде вложения ContentDisposition.Inline (вложение с содержимым внутри тела), что позволит использовать более длинную текстовую строку ... но это не так просто.

Если я сохранить строку в текстовый файл, например так:

string message ="my255CharText"; 
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"\\shareddata\temp\buoy.txt")) 
{ 
    file.WriteLine(message); 
} 
MailMessage emailMsg = new MailMessage(); 
emailMsg.To.Add("[email protected]); 
emailMsg.Subject = "my Subject"; 
emailMsg.From = new MailAddress("[email protected]"); 
emailMsg.BodyEncoding = System.Text.Encoding.ASCII; 
emailMsg.IsBodyHtml = false; 

Attachment data = new Attachment(@"\\shareddata\temp\buoy.txt", MediaTypeNames.Text.Plain); 

emailMsg.Attachments.Add(data); 
ContentDisposition dispositon = data.ContentDisposition; 
dispositon.Inline=true; 
SmtpClient smtp = new SmtpClient("SMTP_SERVER"); 
smtp.Send(emailMsg); 

я продолжать посылать электронную почту с прикрепленным файлом не содержание текстового файла в теле. Если я пытаюсь поставить переменную в качестве вложения:

Attachment data = new Attachment(message, MediaTypeNames.Text.Plain); 

я получаю следующее:

PathTooLongException: The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

Я также попытался изменить путь к локальному диску (c:\temp\buoy.txt), но файл по-прежнему отправляется как вложение, а не внутри.

EDIT: просьба дать мне понять: я получаю pathTooLongException ТОЛЬКО, когда я отправляю переменную непосредственно в качестве вложения, а не когда я отправляю из файла.

+0

Ok. Можете ли вы попытаться сохранить «сообщение» в файле, который НЕ является общим файлом? Скажем в 'C: \ files \ buoy.txt'. –

+0

Я изменил путь к c: \ temp \ buoy.txt - файл по-прежнему отправляется как вложение.«Путь слишком длинный» показывает только, когда я пытаюсь отправить его непосредственно из переменной 'Attachment данных = новый Attachment (строка сообщения, ....)' – Yasskier

+1

Отправка форматированных данных по электронной почте всегда сопряжено с проблемами. Помимо проблем с форматированием, также не гарантируется доставка, и она небезопасна (может быть легко подделана или перехвачена). Я бы рекомендовал использовать либо веб-службы, либо SFTP/FTPS для передачи данных. – Dijkgraaf

ответ

0

ОК, я решил: как @Dan Field указал, частичная проблема заключалась в том, что Ms Outlook упреждающе отображал встроенное вложение, как .. хорошо вложение. Но это не решало мою проблему с разрывными линиями, что в итоге было ошибкой Quoted-printable standard, которая действительно ограничивает размер линии. Но, по крайней мере, для моей цели кодирования 7bit был приемлемым и с ним я был в состоянии послать целых 262 символов в одной строке:

string message="255CharsLongMessage"; 
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"\\shareddata\temp\buoy.txt", false, System.Text.Encoding.ASCII)) 
     { 
      file.WriteLine(message); 
     } 


MailMessage emailMsg = new MailMessage(); 
emailMsg.To.Add("[email protected]"); 
emailMsg.Subject = "My_Subject"; 
emailMsg.From = new MailAddress("[email protected]"); 
emailMsg.BodyEncoding = System.Text.Encoding.ASCII; 
emailMsg.IsBodyHtml = false; 
SmtpClient smtp = new SmtpClient("SMTP_SERVER"); 
Attachment data = new Attachment(@"\\shareddata\temp\buoy.txt", new ContentType("text/plain; charset=us-ascii")); 

emailMsg.Attachments.Add(data); 
data.ContentDisposition.Inline = true; 
data.TransferEncoding = TransferEncoding.SevenBit; 
smtp.Send(emailMsg); 
0

Так что я не знаю, если это действительно решает ваши фактические проблемы, но избавиться от ошибки вы имеете дело с теперь это должно работать:

string message ="my255CharText"; 

MailMessage emailMsg = new MailMessage(); 
emailMsg.To.Add("[email protected]); 
emailMsg.Subject = "my Subject"; 
emailMsg.From = new MailAddress("[email protected]"); 
emailMsg.BodyEncoding = System.Text.Encoding.ASCII; 
emailMsg.IsBodyHtml = false; 

using (System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.ASCII.GetBytes(message))) 
{ 
    Attachment data = new Attachment(ms, new ContentType("text/plain; charset=us-ascii")); 

    emailMsg.Attachments.Add(data); 
    ContentDisposition dispositon = data.ContentDisposition; 
    dispositon.Inline=true; 
    SmtpClient smtp = new SmtpClient("SMTP_SERVER"); 
    smtp.Send(emailMsg); 
} 

Когда я проверить это, Outlook и Клиент Android Mail отображает вложение как вложение, GMail (веб-клиент и клиент Android) показывает его встроенный (в виде одной строки текста). Но на маленьком экране моего телефона, очевидно, текст разбивается на несколько строк.

У меня возникло ощущение, что вы имеете дело с проблемой рендеринга, которая будет специфичной для почтового клиента, и ваша работа может быть больше связана с клиентом , а не с универсальным решением (которое, вероятно, не существует).

+0

В предоставленном формате он подчеркивает «данные вложения» как «Недопустимое объявление члена инициализатора». Если я уронить 'using' и просто объявить' ms' и использовать его в качестве приложения, я получаю пустое сообщение с «/ простым текстом» вложением - Я проверил, как в Outlook, и Gmail. – Yasskier

+1

Извините, выложил там закрывающий палец (на используемой строке) - отредактирован для исправления. Вот почему проблема была там. Как я заметил, некоторые клиенты просто покажут это как приложение, даже если вы указали его встроенный. Клиент должен решить, как сделать встроенное вложение. –

+0

Хм, кажется, что на этот раз мой SMTP-сервер отказывается обработать это сообщение:/- я получаю 'Неспособность отправить email' :( – Yasskier

Смежные вопросы