Indy POP3定期接收电子邮件

3

我正在尝试使用Delphi构建一个应用程序,该应用程序需要每30秒检查一次Gmail收件箱,并处理特定目的的电子邮件。

已经使用Indy POP3组件构建了该应用程序,以下是部分代码。

    If Not POP3.Connected Then
    Begin

    POP3.Host := 'pop.gmail.com';
    POP3.Port := 995;
    POP3.Username := 'email'; 
    POP3.Password := 'password'; 


    SSL.Host := POP3.Host;
    SSL.Port := POP3.Port;
    SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
    POP3.IOHandler := SSL;
    POP3.UseTLS := utUseImplicitTLS;

    // try etc... 
    POP3.Connect;
    End;    
     MsgCnt := POP3.CheckMessages;

       For i := 1 To MsgCnt Do
        Begin

            POP3.Retrieve(i, Msg);
            // process message.. etc..

        End;

我有一个问题需要解决,以下是具体情况:

  • 如果我每30秒就断开并重新连接POP3,经过多次尝试后服务器会拒绝我的连接,并显示“socket error”。如果我不每30秒重连而是每30秒检索一次邮件,我就无法获取新邮件。
  • 此外,如果我没有断开连接或使用“DisconnectNotifyPeer”命令,则我会一遍又一遍地接收已读邮件,但只要我能解决上述问题,我也能解决这个问题。但是,如果您有其他建议,则对此问题也会有所帮助。

您认为我该怎么办才能解决这个问题呢?我不想每30秒连接一次,但又希望能够收到新邮件。是否有像ADO Requery方法之类的命令或函数可以实现这样的功能呢?

顺便说一下,我已经尝试过在一些其他godaddy邮件帐户上操作,它们也在工作了3或4次后拒绝了我的连接。我希望能解决这个问题并在gmail(google apps)上使用。

感谢您的帮助。


3
每30秒连接一次?这肯定会触发一些保护机制。考虑使用IMAP - 它内置了“长轮询”(IDLE命令 - 服务器在接收到新邮件时通知客户端)。POP3似乎不适合这种工作。 - Piskvor left the building
2个回答

1

30秒太频繁了。请使用更长的间隔,比如至少几分钟。

至于在连接到POP3服务器时无法接收新邮件,当您登录时邮箱会被锁定,并保持锁定状态直到您断开连接。您只能看到和操作登录时存在的邮件。这是POP3设计的核心。它不适用于一般化的文件夹/消息管理。这就是IMAP专门用来做的(正如您已经发现的那样)。POP3仅用于下载和删除邮件,因此只需下载/删除邮件,断开连接,等待一段时间再重复操作即可。


1

你没有展示出你所有的代码,但我假设你将POP3控件保持连接到服务器上...最终服务器会超时并将你断开连接。

connect
checkmessages
save messages
disconnect

只要你适当地断开连接,就应该能够每30-60秒通过POP3连接一次。但是,如果你想保持连接并立即更新新邮件,那么这就是IMAP功能,而不是POP3。

我一直在断开连接,但服务器仍然拒绝我的连接请求,无论如何,我将其更改为IMAP,这解决了我的问题。谢谢。 - Adnan M. TURKEN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接