Доступ к веб-страницам по электронной почте - PullRequest
2 голосов
/ 15 февраля 2010

Мой поставщик данных позволяет мне получать доступ к почте на моем телефоне, но не в Интернете. Я подумываю написать утилиту для извлечения веб-страницы по электронной почте, чтобы я мог просматривать веб-страницы на моем телефоне во время путешествия. Идея состоит в том, чтобы в моей системе работала служба (работающая в outlook и подключенная к серверу Exchange), которая ожидает «запросное письмо» с веб-адресом в качестве субъекта. Этот сервис должен получить веб-страницу и ответить HTML-контентом.

Пожалуйста, предложите способы, как я могу реализовать это эффективно. Есть ли какая-либо утилита, которая делает то же самое?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Это довольно просто сделать с помощью системы CDO DLL. У меня уже есть работающий прототип, просто отправьте письмо на site2email@gmail.com, и вы получите ответ со встроенной веб-страницей (в случае, если URL-адрес был указан в теме) или прикрепленным веб-архивом (файл MHT со всеми ресурсами) на случай, если URL отправлено в теле письма. Вот быстрый и грязный фрагмент кода, с которым вы можете поиграть:

    private void ConvertAndSend(string emailTo,Uri url)
    {
        try
        {
            string mimeType;
            string charset;
            if (NetworkUtils.UrlExists(url.AbsoluteUri,out mimeType,out charset))
            {
                if (mimeType.Equals("text/html",StringComparison.OrdinalIgnoreCase))
                    SendUrlToEmail(url.AbsoluteUri,emailTo,charset);
                else
                {
                    string fileName = Path.GetFileName(url.AbsoluteUri);
                    string extension = GetExtensionByMimeType(mimeType);
                    if (String.IsNullOrEmpty(fileName)
                        || fileName.Length > 200)
                        fileName = DateTime.Now.ToString("yyyyMMddHHmmss");
                    if (!Path.GetExtension(fileName).Equals(extension
                        ,StringComparison.OrdinalIgnoreCase))
                        fileName += extension;
                    string tempFolder = Path.Combine(Server.MapPath("App_Data")
                        ,"TempFiles");
                    if (!Directory.Exists(tempFolder))
                        Directory.CreateDirectory(tempFolder);
                    fileName = Path.Combine(tempFolder,fileName);
                    new WebClient().DownloadFile(url.AbsoluteUri,fileName);
                    SendMessage(emailTo,url.AbsoluteUri,Path.GetFileName(fileName),fileName);
                }
            }
            else
            {
                throw new WebException("Requiested address is not available at the moment.");
            }
        }
        catch (Exception ex)
        {
            SendMessage(emailTo,url.AbsoluteUri,ex.Message,null);
        }
    }

    public void SendUrlToEmail(string url
        ,string emailTo
        ,string charset)
    {
        Encoding encFrom;
        try { encFrom = Encoding.GetEncoding(charset); }
        catch { encFrom = Encoding.UTF8; }
        CDO.Message msg = null;
        ADODB.Stream stm = null;
        try
        {
            msg = new CDO.MessageClass();
            msg.MimeFormatted = true;
            msg.CreateMHTMLBody(url
                ,CDO.CdoMHTMLFlags.cdoSuppressNone
                ,string.Empty
                ,string.Empty);
            //msg.HTMLBodyPart.Fields["urn:schemas:mailheader:Content-Language"].Value = "ru";
            msg.HTMLBodyPart.Fields["urn:schemas:mailheader:charset"].Value = "Cp" + encFrom.CodePage;
            msg.HTMLBodyPart.Fields["urn:schemas:mailheader:content-type"].Value = "text/html; charset=" + charset;
            msg.HTMLBodyPart.Fields.Update();
            msg.HTMLBody = documentBody;
            msg.Subject = url;
            msg.From = Params.Username;
            msg.To = emailTo;
            msg.Configuration.Fields[GmailMessage.SMTP_SERVER].Value = SmtpServer;
            msg.Configuration.Fields[GmailMessage.SEND_USING].Value = 2;
            msg.Configuration.Fields.Update();
            msg.Send();
        }
        finally
        {
            if (stm != null)
            {
                stm.Close();
                Marshal.ReleaseComObject(stm);
            }
            if (msg != null)
                Marshal.ReleaseComObject(msg);
        }
    }

NetworkUtils.UrlExists - это небольшой метод, который отправляет HEAD, а затем, если ему не удается GET-запрос, определить тип и кодировку содержимого.

1 голос
/ 15 февраля 2010

Существует утилита, которая делает то же самое на sourceforge: Web2Mail

0 голосов
/ 15 февраля 2010

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

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