通过电子邮件访问网页

时间:2010-02-15 09:51:19

标签: c# exchange-server

我的数据提供商允许我访问手机上的邮件,但不能访问互联网。 我正在考虑编写一个实用程序来通过电子邮件获取网页,以便我在旅行时可以在手机上查看网页。我的想法是在我的系统上运行一个服务(运行outlook并连接到Exchange服务器),该服务等待以网址作为主题的“查询邮件”。此服务应该获取网页并使用html内容进行回复。

请建议如何有效实施此方法。有没有可用的实用程序?

3 个答案:

答案 0 :(得分:2)

使用系统CDO dll相当简单。我已经有一个工作原型,只需将邮件发送到site2email@gmail.com,您将收到嵌入式网页的答案(如果主题中提供了网址)或附加的网络存档(包含所有资源的mht文件)以防万一在邮件的正文中发送的网址。 以下是您可以使用的快速且脏的代码段:

    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 :(得分:1)

有一个实用程序在sourceforge上执行相同操作:Web2Mail

答案 2 :(得分:0)

Instapaper做了类似的事情 - 它将网页转换为简单的HTML进行阅读。也许不完全是你需要的,但可能是一个很好的起点。