【问题标题】:Using the Indy TidHttp component to send email file attachments through sendgrid使用 Indy TidHttp 组件通过 sendgrid 发送邮件文件附件
【发布时间】:2013-01-29 01:30:24
【问题描述】:

我正在使用 Indy TIdHTTP 组件,并且能够使用以下函数通过 sendgrid API 成功发送电子邮件。 sendgrid api 文档可以在here找到。

现在我的任务是包含文件附件。在 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;

【问题讨论】:

  • 无论如何,SendGrid has SMTP support,所以我很想知道,你为什么要尝试使用网络请求。
  • 好点。具有讽刺意味的是,我是从 TIdSMTP 移植这个的。知道他们有一个 SMTP 组件后,我需要做的就是替换一些服务器值和凭据!无论如何,我希望其他人觉得这很有用。

标签: delphi indy sendgrid


【解决方案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;

【讨论】:

  • 我现在正试图让这个功能支持基于 html 的电子邮件。但它失败了(基本上添加了一个带有参数“html”和实际 html 的新 AddFormField)。这不适用于基于 html 的电子邮件吗?
  • 我什至想测试这段代码,但我不能,因为我没有自己的域,这是成功配置我的帐户所必需的(当我'一直在写这篇文章)。所以,恐怕我无法为您提供更多帮助。但是无论如何,您遇到的失败是什么?
  • 有没有人有类似上面的例子,适用于 SendGrid 版本 3 ?谢谢大家:-)
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2012-01-06
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多