Я занимаюсь разработкой программного обеспечения на C #, которое считывает входящие электронные письма в почтовый ящик gmail.
Я использую Gmail API для получения писем.
Тело электронных писем закодировано в base64, поэтому я использую следующий метод для его декодирования:
byte[] data = FromBase64ForUrlString(p.Body.Data);
string decodedString = Encoding.UTF8.GetString(data);
public static byte[] FromBase64ForUrlString(string base64ForUrlInput)
{
int padChars = (base64ForUrlInput.Length % 4) == 0 ? 0 : (4 - (base64ForUrlInput.Length % 4));
StringBuilder result = new StringBuilder(base64ForUrlInput, base64ForUrlInput.Length + padChars);
result.Append(String.Empty.PadRight(padChars, '='));
result.Replace('-', '+');
result.Replace('_', '/');
return Convert.FromBase64String(result.ToString());
}
Затем я получаю html тело письма.
Для того, чтобы получить текст, я использую этот метод (Используя HtmlAgilityPack):
public string ConvertHtml(string html)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
StringWriter sw = new StringWriter();
ConvertTo(doc.DocumentNode, sw);
sw.Flush();
return sw.ToString();
}
Теперь я столкнулся с проблемой преобразования html-сообщений, отправленных из Outlook. Похоже, Outlook имеет специальную кодировку.
Когда я пытаюсь преобразовать этот тип тела, я получаю строку, которая содержит много: \ r \ n, \ n, \ r, что вызывает разрыв строки в местах, где нет разрыва строки.
До сих пор мне удавалось обойти это, используя Microsoft.Office.Interop.Outlook.
В основном я создал элемент электронной почты Outlook, установил для его свойства htmlBody значение, которое я только что получил из API gmail, а затем сам текст получил из свойства body.
Microsoft.Office.Interop.Outlook.Application objOutlook = newMicrosoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.MailItem msgInterop =(Microsoft.Office.Interop.Outlook.MailItem)(objOutlook.CreateItem(
Microsoft.Office.Interop.Outlook.OlItemType.olMailItem));
msgInterop.HTMLBody = decodedString;
if (msgInterop.Body != null)
currEmailItem.Body = msgInterop.Body.ToString();
Эта процедура возможна только на компьютерах, на которых установлено программное обеспечение Outlook.
Теперь я переместил программное обеспечение на сервер, операционной системой которого является Windows Server.
В начале я установил Outlook на сервер, хотя и не хотел, но каждый раз, когда мое программное обеспечение пытается получить доступ к Outlook, требуется доступ максимум на 10 минут, поэтому я хотел избежать решения, которое заставляет меня используйте Outlook.
Может быть, у вас есть решение, которое не требует установки программного обеспечения Outlook?