Delphi-Indy-сохранение проекта GMail

Я использую Indy под Delphi для отправки сообщения через учетную запись gmail, используя компоненты TIdSMTP и TIdMessage. Это работает абсолютно нормально.

однако мой клиент попросил сохранить сообщение в папку черновики, чтобы он мог внести изменения в (программно созданное) сообщение перед его фактической отправкой.

предполагается, что Gmail API поддерживает это, но приведенные примеры не в форматах Delphi/Indy... Я ищу минимальное Программирование изменения, поэтому я хотел бы знать, возможно ли это в компонентах Indy? TIdMessage допускает флаг" mfDraft", но это не мешает немедленно отправлять сообщение при использовании IdSMTP1.Отправить

2 ответов


SMTP не имеет понятия черновиков. Вместо этого вы должны использовать IMAP.

использовать TIdIMAP4 чтобы войти в учетную запись GMail, позвоните его SelectMailBox() метод, чтобы выбрать папку Черновика, а затем вызвать один из его AppendMsg...() методы для хранения черновика письма в папку по мере необходимости.

если вы хотите внести изменения в черновик перед его отправкой, вам нужно будет извлечь текущий черновик из папки (один из Retrieve...() или UIDRetrieve...() методов) и редактировать по мере необходимости, а затем удалить текущий черновик из папки (DeleteMsgs() или UIDDeleteMsg() метод) и добавьте новый черновик в папку.

чтобы фактически отправить черновик, вам нужно будет получить и удалить его из папки Черновика, а затем использовать SMTP для его отправки.


OK, для тех, кто читает эту тему в будущем... вот необходимый код: (gebr и ww-это имя пользователя и пароль)

procedure DraftGMail(Info:TIdMessage; gebr,ww:string);
var


  IdIMAP41:TIdIMAP4;
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin

  IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.create;
  try
    IdSSLIOHandlerSocketOpenSSL1.Destination := 'imap.gmail.com:993';
    IdSSLIOHandlerSocketOpenSSL1.host := 'imap.gmail.com';
//    IdSSLIOHandlerSocketOpenSSL1.MaxLineAction := maException;
    IdSSLIOHandlerSocketOpenSSL1.Port := 993;
    IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv3;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLversions := [sslvSSLv3];
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := [];
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 0;

    IdIMAP41:= TIdIMAP4.create;
    try
      IdIMAP41.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
      IdIMAP41.Host := 'imap.gmail.com';
      IdIMAP41.Password := ww;
      IdIMAP41.Port := 993;
//      IdSMTP1.SASLMechanisms := <>;
      IdIMAP41.UseTLS := utUseImplicitTLS;
      IdIMAP41.Username := gebr;

        IdIMAP41.Connect;
//        IdIMAP41.ListMailBoxes(Boxes);
        IdIMAP41.SelectMailbox('[Gmail]/Drafts');
        IdIMAP41.AppendMsg('[Gmail]/Drafts',Info);
        IdIMAP41.Disconnect;

    finally
      FreeAndNil(IdIMAP41);
    end;

  finally
    FreeAndNil(IdSSLIOHandlerSocketOpenSSL1);

  end;
end;