Разобрать внешний вид html-тела из gmail api - PullRequest
0 голосов
/ 08 сентября 2018

Я занимаюсь разработкой программного обеспечения на 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?

...