微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 如何从某个IMAP邮箱获取所有电子邮件的正文文本?

如何从Delphi中的某个IMAP邮箱获取所有电子邮件的正文文本?例如,从INBox邮箱?

解决方法

有许多方法可以从所选邮箱中检索所有邮件的所有正文.我已经使用了那个,你在邮箱中迭代邮箱,每个邮箱中的邮件Retrieve.这种方式允许您修改代码,这样您就可以在需要时打破循环,例如在 RetrievePeek之前替换 Retrieve,它不会像上面提到的那样将消息标记为在服务器上读取.当从服务器检索消息时,它的所有部分都被迭代,当它是文本部分时,它的主体被附加到本地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.dll和ssleay32.dll库放到项目可见的路径中;您可以在不同版本和平台from here下载适用于Indy的OpenSSL库.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐