【问题标题】:How to get body texts of all e-mail messages from a certain IMAP mailbox?如何从某个 IMAP 邮箱中获取所有电子邮件的正文?
【发布时间】:2012-11-16 10:18:17
【问题描述】:

如何从 Delphi 中的某个 IMAP 邮箱中获取所有电子邮件的正文?比如来自INBOX邮箱?

【问题讨论】:

  • 您是否希望将此类检索到的消息标记为已读?
  • @TLama 是的,只是为了阅读收件箱中的内容,所以这并不重要。
  • @TLama 是的纯基本 html,因此您可以稍后解析它。
  • 抱歉,在您回复的同时,我已经删除了我的评论。对于其他人,我在问是否可以处理 HTML 正文内容。
  • @TLama ye 没问题。纯 HTML 是完美的 :)

标签: delphi delphi-xe2 imap


【解决方案1】:

有多种方法可以从所选邮箱中检索所有邮件的所有正文。我已经使用了一个,您可以在其中逐一迭代邮箱和Retrieve 邮箱中的每条消息。这种方式允许您修改代码,以便您可以在需要时中断循环,例如将Retrieve 替换为RetrievePeek,它不会像第一次提到的那样在服务器上将消息标记为已读。当从服务器检索消息时,它的所有部分都被迭代,当它是文本部分时,它的正文被附加到一个本地 S 变量中。迭代后,S 变量被添加到输出BodyTexts 字符串列表中。因此,作为结果,您将获得字符串列表集合,其中每个项目由连接消息的文本部分正文组成,每个项目表示一条消息。

uses
  IdIMAP4, IdSSLOpenSSL, IdText, IdMessage, IdExplicitTLSClientServerBase;

procedure GetGmailBodyTextParts(const UserName, Password: string;
  BodyTexts: TStrings);
var
  S: string;
  MsgIndex: Integer;
  MsgObject: TIdMessage;
  PartIndex: Integer;
  IMAPClient: TIdIMAP4;
  OpenSSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  BodyTexts.Clear;
  IMAPClient := TIdIMAP4.Create(nil);
  try
    OpenSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      OpenSSLHandler.SSLOptions.Method := sslvSSLv3;
      IMAPClient.IOHandler := OpenSSLHandler;
      IMAPClient.Host := 'imap.gmail.com';
      IMAPClient.Port := 993;
      IMAPClient.UseTLS := utUseImplicitTLS;
      IMAPClient.Username := UserName;
      IMAPClient.Password := Password;
      IMAPClient.Connect;
      try
        if IMAPClient.SelectMailBox('INBOX') then
        begin
          BodyTexts.BeginUpdate;
          try
            for MsgIndex := 1 to IMAPClient.MailBox.TotalMsgs do
            begin
              MsgObject := TIdMessage.Create(nil);
              try
                S := '';
                IMAPClient.Retrieve(MsgIndex, MsgObject);
                MsgObject.MessageParts.CountParts;
                if MsgObject.MessageParts.TextPartCount > 0 then
                begin
                  for PartIndex := 0 to MsgObject.MessageParts.Count - 1 do
                    if MsgObject.MessageParts[PartIndex] is TIdText then
                      S := S + TIdText(MsgObject.MessageParts[PartIndex]).Body.Text;
                  BodyTexts.Add(S);
                end
                else
                  BodyTexts.Add(MsgObject.Body.Text);
              finally
                MsgObject.Free;
              end;
            end;
          finally
            BodyTexts.EndUpdate;
          end;
        end;
      finally
        IMAPClient.Disconnect;
      end;
    finally
      OpenSSLHandler.Free;
    end;
  finally
    IMAPClient.Free;
  end;
end;

此代码需要 OpenSSL,因此不要忘记将 libeay32.dllssleay32.dll 库放到项目可见的路径中;您可以下载不同版本和平台的 Indy 的 OpenSSL 库from here

【讨论】:

  • 嗯,它不会检索超过 255 个字符的电子邮件,嗯
  • 对不起,我的错。我将不得不更新此代码。这与字符数无关,与纯文本电子邮件有关,它们没有在消息部分存储正文。
  • 我添加了对消息文本部分计数的检查。如果为 0,则主体取自 TIdMessage 对象。我希望这已经足够了,但是当雷米会说些什么时,我会更冷静。
  • 有没有更好的方法来检索电子邮件?基于电子邮件中的内容,无需全部下载..
  • 回滚 :) 将发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多