65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 HTTP 检查 Yahoo! 帐户

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.61/5 (16投票s)

2003 年 5 月 21 日

5分钟阅读

viewsIcon

108695

downloadIcon

2276

如何通过 HTTP 检查 Yahoo! 邮件帐户。

下载源代码 (10 kb)

    引言

    众所周知,Yahoo 已停止对其免费电子邮件服务进行 POP3 访问。本文将向您介绍如何从 Visual Basic 应用程序检查基于 HTTP 的电子邮件帐户。本文只是开发一个完整应用程序框架的起点,该框架可针对类似的基于 HTTP 的电子邮件帐户进行自定义。由于它是 HTTP,因此您的程序保证适用于任何类型的互联网连接。

     

    概念与方法

    这个概念非常简单。我们一直在做一些事情,但从我将要展示的方式来看,我们从未想过要实现它。我们所有人是如何检查我们的 Yahoo! 帐户的?我们遵循以下步骤:

     

    1. 连接到 mail.yahoo.com 网站。
    2. 输入我们的登录名和密码。
    3. 点击“登录”按钮。

     

    之后,传统的 Yahoo! 邮箱页面就会显示出来。

     

    现在,让我们尝试以编程方式执行此操作。

     

    1. 在我们其中一个嵌套的 Internet Explorer 控件中加载 mail.yahoo.com 网站。
    2. 将登录名和密码字段设置为我们的登录/密码组合。
    3. 调用表单的“提交”方法。

     

    简单!不是吗?现在,按照以上步骤操作后,浏览器会自动加载 Yahoo! 邮箱页面。我们现在要做的就是正确解析 HTML 页面并提取所需信息。

     

    YahooMailChecker 应用程序

    我们将我们的应用程序称为 YahooMailChecker 应用程序。这将在 Microsoft Visual Basic 6.0 中成为一个标准的 Windows 应用程序 (EXE) 项目。

     

    我们的应用程序将需要以下引用:

     

    1. Microsoft HTML 对象库。
    2. Microsoft Internet Explorer。

     

    我们的应用程序将托管以下控件:

     

    1. Timer 控件
    2. 状态栏控件。

     

    我们将需要 Timer 控件,因为我们将以固定间隔检查我们的 Yahoo! 帐户。显然,状态栏将一直告知我们 Internet Explorer 正在做什么。

     

     

    连接到 Yahoo! Mail 站点

    正如您现在可能已经猜到的,所有代码都将放在 Timer 控件的 Timer 事件中。我已将 Timer 控件的间隔设置为 15 秒,您需要根据您的互联网连接速度调整此间隔。

     

    这是我们的应用程序的工作方式:

     

    1. 创建一个 Internet Explorer 对象实例并将其设置为我们的全局变量。
    2. 开始在 Timer 控件的事件中工作。

     

    我们将使用的 Internet Explorer 对象有一个名为 DocumentComplete 的事件,我们将使用此事件来获得浏览器完成状态的通知。在此事件中,我们将检查是否已在 yahoo mail 站点上进行身份验证。如果是,请继续提取所需信息。如果不是,则尝试登录。

     

    为了连接到 Yahoo! Mail 站点,您将使用 Internet Explorer 对象的 Navigate 方法。

     

    这是 Timer 控件的 Timer 事件中的代码片段:

    Private Sub tmrWorkerThread_Timer()
        Dim FirstPart As String
        Dim OpenBracket As Integer
        Dim CloseBracket As Integer
        Dim Actual As String

        tmrWorkerThread.Enabled = False

        sbYMC.Panels(1).Text = "Navigating"

        YahooMail.navigate "http://mail.yahoo.com"

        Do While YahooMail.readyState <> READYSTATE_COMPLETE
            DoEvents
            sbYMC.Panels(1).Text = YahooMail.StatusText
        循环

        If InStr(YahooMail.document.body.innerHTML, "You must sign in to read or send mail") <> 0 Or InStr(YahooMail.document.body.innerHTML, "Invalid Password") <> 0 Then
            With YahooMail.document
                .All.Item("login").Value = "myloginid"
                .All.Item("passwd").Value = "mypassword"
                .Forms(0).submit
            End With

            Do While YahooMail.readyState <> READYSTATE_COMPLETE
                DoEvents
                sbYMC.Panels(1).Text = YahooMail.StatusText
            循环
        Else
            lblMailBoxState = "Authenticated"
        End If

        tmrWorkerThread.Enabled = True
    End Sub
     
    让我们尝试理解上面的代码。上面的代码工作方式如下:

     

    1. 通过调用 Internet Explorer 对象的 Navigate 方法导航到 mail.yahoo.com 站点。我将我的 Internet Explorer 命名为“YahooMail”。
    2. 等待页面加载完成。这是通过等待浏览器的完成状态 (READYSTATE_COMPLETE) 来实现的。
    3. 页面加载后,检查 HTML 内容以查看您是否已使用不同的会话 ID 登录(yahoo 在客户端计算机上以 cookie 的形式维护此信息)。通过检查 HTML 内容 (InnerHTML) 中的“You must sign in to read or send mail”文本来做出此检查。如果找不到此文本,则表示浏览器正在使用现有 cookie(该 cookie 过去曾有效)。

    就是这样!

     

    DocumentComplete 事件

    现在页面已在我们的浏览器对象中加载,我们需要提取相关信息。这在 Internet Explorer 对象的 DocumentComplete 事件中完成。

     

    此事件中的代码如下所示:

     

    Private Sub YahooMail_DocumentComplete(ByVal pDisp As Object, URL As Variant)

        If InStr(YahooMail.document.body.innerHTML, ">Inbox") > 0 Then

            FirstPart = Mid(YahooMail.document.body.innerHTML, InStr(YahooMail.document.body.innerHTML, ">Inbox"), 20)

           

            OpenBracket = InStr(FirstPart, "(")

            CloseBracket = InStr(FirstPart, ")")

           

            If OpenBracket = 0 Or CloseBracket = 0 Then

                lblInboxCount = "No Unread Mails"

            Else

                Actual = Mid(FirstPart, OpenBracket + 1, CloseBracket - OpenBracket - 1)

               

                lblInboxCount = Actual

            End If

       

            FirstPart = Mid(YahooMail.document.body.innerHTML, InStr(YahooMail.document.body.innerHTML, ">Bulk"), 20)

           

            OpenBracket = InStr(FirstPart, "(")

            CloseBracket = InStr(FirstPart, ")")

           

            If OpenBracket = 0 Or CloseBracket = 0 Then

                lblInboxCount = "No Unread Bulk Mails"

            Else

                Actual = Mid(FirstPart, OpenBracket + 1, CloseBracket - OpenBracket - 1)

           

                lblBulkCount = Actual

            End If

        End If

    End Sub

     

    现在让我们了解此代码的工作原理。

     

    1. 如果目标文档包含文本:“>Inbox”,则表示您已登录帐户。
    2. 继续查找上述文本的位置。
    3. 提取未读邮件计数,然后对批量邮件文件夹重复这些步骤。

    很简单,不是吗?就是这么简单!我们只是认为所有这些事情都很复杂,从而错过了真正的乐趣。

    © . All rights reserved.