Отправка веб-страницы по электронной почте программно. URL изображения не разрешены - PullRequest
1 голос
/ 05 мая 2009

Я пишу задание таймера SharePoint, которое должно извлекать содержимое веб-страницы и отправлять этот HTML-код по электронной почте.

Я использую объекты HttpWebRequest и HttpWebResponse для извлечения содержимого.

Функция электронной почты работает нормально, за исключением одной проблемы.

Веб-страница, на которой размещено содержимое моей электронной почты, содержит изображения.

Когда HTML-код страницы отправляется как электронное письмо, URL-адреса изображений внутри HTML-кода являются относительными URL-адресами, они не разрешаются как абсолютные URL-адреса.

Как преобразовать URL-адреса изображений в их абсолютные пути внутри содержимого веб-страницы?

Есть ли прямой способ сделать это? Я не хочу запускать Regex поверх HTML-кода, чтобы заменить все относительные URL-адреса абсолютными URL-адресами.

Ответы [ 4 ]

5 голосов
/ 05 мая 2009

Попробуйте добавить элемент base в заголовок получаемого HTML-документа. В качестве атрибута href вы должны использовать URL страницы, которую вы извлекаете.

2 голосов
/ 05 мая 2009

Нашел этот классный инструмент Codeplex под названием HtmlAgilityPack. http://www.codeplex.com/htmlagilitypack

Используя этот API, мы можем анализировать HTML так же, как мы можем анализировать XML-документы. Мы также можем запрашивать и искать узлы, используя XPath.

Я использовал следующий фрагмент кода для исправления URL-адресов изображений

HtmlDocument htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(htmlMessage);

//This selects all the Image Nodes
            HtmlNodeCollection hrefNodes = htmlDoc.DocumentNode.SelectNodes("//img");

            foreach (HtmlNode node in hrefNodes)
            {
                string imgUrl = node.Attributes["src"].Value;
                node.Attributes["src"].Value = webAppUrl + imgUrl;
            }

        StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);

            htmlDoc.OptionOutputAsXml = false;
            htmlDoc.Save(sw);
            htmlMessage = sb.ToString();
0 голосов
/ 24 февраля 2012

Я сталкивался с этой проблемой несколько раз, и я не думаю, что есть какой-либо метод волшебной палочки, чтобы сделать все это для вас. HTMLAgilityPack хорошо справляется с агрегацией необходимого контента, но вам придется расшифровать его самостоятельно. Например; получение списка узлов HtmlNode, содержащих «// img», может вернуть любой из следующих элементов:

<img src="http://www.adg2435.com/pictures/pic.jpg"/> //absolute url
<img src="coolpicture.jpg"/> //relative to the page
<img src="pictures/pic.jpg"/>
<img src="./pictures/pic.jpg"/>

Вам решать, какие типы ссылок будут отображаться на данной веб-странице. Вам также необходимо учитывать такие вещи: (обрезать URL вашего изображения после расширения ".jpg")

<img src="/pictures/pic.jpg?45823593&xyz=95325235r0634945823ot49140200"/>

Итак, мне удобно держать под рукой несколько вещей:

  1. Исходный URL для всей страницы
  2. Домен для данного URL (для того, чтобы сказать, например, «содержит ли данный источник домен?») Вот как бы вы получили домен исходной ссылки:

    Uri domainUri = новый Uri (fullUrl); domainUrl = domainUri.GetLeftPart (UriPartial.Authority);

  3. Потенциально, вы можете захотеть субдомен (т.е. "http://www.mysite.com/pictures/")

0 голосов
/ 05 мая 2009

Я не хочу запускать Regex поверх HTML-кода, чтобы заменить все относительные URL-адреса абсолютными URL-адресами.

Очень жаль, потому что только так вы сможете увидеть изображения. Вы бы предпочли скачать все изображения и вставить их в электронное письмо тоже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...