Delphi - Indy - сохранение черновика GMail

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

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

GMail API должен поддерживать это, но предоставленные примеры не в форматах Delphi / Indy ... Я ищу минимальные изменения в программировании, поэтому я хотел бы знать, возможно ли это и в компонентах Indy? TIdMessage позволяет использовать флаг «mfDraft», но это не предотвращает немедленную отправку сообщения при использовании IdSMTP1.Send


person Jur    schedule 01.11.2015    source источник
comment
Связано: stackoverflow.com/questions/1206275/   -  person mjn    schedule 01.11.2015
comment
Это ДОЛЖНА быть папка с черновиками GMail ...   -  person Jur    schedule 01.11.2015


Ответы (2)


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

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

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

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

person Remy Lebeau    schedule 02.11.2015

Хорошо, для тех, кто будет читать эту ветку в будущем ... вот необходимый код: (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;
person Jur    schedule 04.11.2015
comment
К сожалению, этот код работает только для англоязычных аккаунтов; например, в голландском аккаунте имя почтового ящика должно быть [Gmail] / Concepten - person Jur; 05.11.2015
comment
@Jur Я не уверен, возвращает ли SelectMailbox из Indy логическое значение. В Synapse это так, и вы можете сделать что-то вроде этого: if not Imap.SelectFolder('[Gmail]/Drafts') then Imap.SelectFolder('[Gmail]/Concepten');. В этом случае язык учетной записи может быть установлен на английский или голландский. После этого вы также можете сделать это: Imap.AppendMess(Imap.SelectedFolder, m.Lines);, чтобы вам не пришлось снова подавать черновик или концепт. Никогда не знаешь, настроен ли у кого-то, даже голландца, на английский язык (как у меня). Так что вам нужно проверить и то, и другое. - person Rik; 06.11.2015