6

Delphiの特定のIMAPメールボックスからすべての電子メールメッセージの本文を取得するにはどうすればよいですか?たとえば、INBOXメールボックスから?

4

1 に答える 1

13

選択したメールボックスからすべてのメッセージのすべての本文を取得する方法はたくさんあります。私は、メールボックスとメールボックスからRetrieveのすべてのメッセージを1つずつ繰り返す1つを使用しました。この方法では、コードを変更できるため、必要なときにループを中断したり、最初に述べたようにメッセージをサーバー上で既読としてマークしない置換などを行うことができますRetrieveRetrievePeekメッセージがサーバーから取得されると、そのすべての部分が繰り返され、テキスト部分の場合、その本文がローカル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.dllIndy用のOpenSSLライブラリをさまざまなバージョンとプラットフォームでダウンロードできますfrom here

于 2012-11-28T16:36:52.063 に答える