Использование компонента Indy TidHttp для отправки вложенных файлов электронной почты через sendgrid

Я использую компонент Indy TIdHTTP и успешно могу отправлять электронные письма через API sendgrid, используя следующую функцию. Документацию по API sendgrid можно найти здесь.

Теперь мне поручено включить вложения файлов. В документации по API указано: Содержимое файла должно быть частью составного HTTP POST.

Я попытался изменить свою функцию, включив в нее TIdMultipartFormDataStream, но безуспешно.

Как изменить код для поддержки прикрепленных файлов?

procedure SendGridEmailProc;
var
  IdHTTP1: TIdHTTP;
  IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocketOpenSSL;
  mString: string;
  mParams: TStringList;
  i: Integer;
begin
  try
    mParams := TStringList.Create;
    IdHTTP1 := TIdHTTP.create(nil);
    IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
    with IdSSLIOHandlerSocket1 do begin
      SSLOptions.Method := sslvSSLv3;
      SSLOptions.Mode :=  sslmUnassigned;
      SSLOptions.VerifyMode := [];
      SSLOptions.VerifyDepth := 2;
    end;
    with IdHTTP1 do begin
      IOHandler := IdSSLIOHandlerSocket1;
    end;


    mParams.Add('api_user=xxxxx');
    mParams.Add('api_key=xxxxx');
    mParams.Add('to=xxxxxx');
    mParams.Add('from=xxxxx');

    mParams.Add('subject=test:'+datetimetostr(now));

    mParams.Add('text=this is a test');

    IdHTTP1.Post('https://sendgrid.com/api/mail.send.xml',mParams);


  finally
    mParams.Free;
    idhttp1.free;
    IdSSLIOHandlerSocket1.Free;
  end;
end;

person M Schenkel    schedule 29.01.2013    source источник
comment
В любом случае, SendGrid поддерживает SMTP, поэтому мне очень интересно, почему вы пытаетесь использовать для этого веб-запросы.   -  person TLama    schedule 29.01.2013
comment
Хорошая точка зрения. По иронии судьбы я портирую это с TIdSMTP. Зная, что у них есть компонент SMTP, все, что мне нужно было сделать, это заменить некоторые значения сервера и учетные данные! В любом случае, я надеюсь, что другие найдут это полезным.   -  person M Schenkel    schedule 29.01.2013


Ответы (1)


Попробуйте сделать это так (обратите внимание, что это не проверено):

uses
  IdException, IdHTTP, IdSSLOpenSSL, IdMultipartFormData;

procedure SendGridEmailProc;
var
  HTTPClient: TIdHTTP;
  Parameters: TIdMultiPartFormDataStream;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  HTTPClient := TIdHTTP.Create(nil);
  try
    SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      SSLHandler.SSLOptions.Method := sslvSSLv3;
      SSLHandler.SSLOptions.Mode := sslmUnassigned;
      SSLHandler.SSLOptions.VerifyMode := [];
      SSLHandler.SSLOptions.VerifyDepth := 2;
      HTTPClient.IOHandler := SSLHandler;

      Parameters := TIdMultiPartFormDataStream.Create;
      try
        Parameters.AddFormField('api_user', 'xxxxx');
        Parameters.AddFormField('api_key', 'xxxxx');
        Parameters.AddFormField('to', 'xxxxxx');
        Parameters.AddFormField('from', 'xxxxx');
        Parameters.AddFormField('subject', 'test:' + DateTimeToStr(Now));
        Parameters.AddFormField('text', 'this is a test');

        // note, that you need to use the same file name for the files[]
        // identifier and that you should explicitly specify the content 
        // type for a file field to meet the HTTP dump shown in the help
        Parameters.AddFile('files[file.jpg]', 'c:\file.jpg', 
          'application/octet-stream');

        try
          HTTPClient.Post('https://sendgrid.com/api/mail.send.xml', 
            Parameters);
        except
          on E: EIdException do
            ShowMessage(E.ClassName + ': ' + E.Message);
        end;
      finally
        Parameters.Free;
      end;
    finally
      SSLHandler.Free;
    end;
  finally
    HTTPClient.free;
  end;
end;
person TLama    schedule 29.01.2013
comment
Сейчас я пытаюсь заставить эту функцию поддерживать электронные письма на основе html. Но это терпит неудачу (в основном добавление нового AddFormField с параметрами «html» и фактическим html). Не будет ли это работать с электронными письмами на основе html? - person M Schenkel; 31.01.2013
comment
Я даже хотел протестировать этот код, но не могу, так как у меня нет собственного домена, необходимого для успешной инициализации моей учетной записи (которую я создал, когда писал этот пост). Так что, боюсь, я больше ничем не смогу вам помочь. Но в любом случае, что это за неудача, которую вы получаете? - person TLama; 31.01.2013
comment
Есть ли у кого-нибудь пример, подобный приведенному выше, который работает с версией 3 SendGrid? Спасибо всем :-) - person user1355041; 10.01.2017