You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi(Indy)调用Mailgun API发送邮件附件丢失求助

排查Delphi Indy调用Mailgun API附件丢失问题

嘿,我帮你分析下代码里可能导致附件丢失的几个关键点:

  • 附件字段名错误:Mailgun API要求附件对应的表单字段名是attachment,而你代码里用了ABC.pdf当字段名,这会导致Mailgun识别不到这是附件。得把AddFile的第一个参数改成attachment。
  • 未指定正确的MIME类型:AddFile的第三个参数是空字符串,Indy可能无法正确设置附件的Content-Type,Mailgun没法解析这个文件类型。对于PDF文件,应该指定application/pdf。
  • 字符编码优化:虽然这不是附件问题的直接原因,但UTF8Encode可以不用手动加——当你给AddFormField指定'utf-8'作为Charset时,Indy会自动处理编码转换,手动转可能反而导致重复编码。

修改后的代码示例:

try
  IdHTTP1.Request.CharSet := 'utf-8';
  IdHTTP1.Request.ContentType := 'multipart/form-data';
  IdHTTP1.Request.BasicAuthentication := True;
  IdHTTP1.Request.Username := 'api';
  IdHTTP1.Request.Password := 'my pass';
  Parametri := TIdMultiPartFormDataStream.Create;
  // 去掉手动UTF8Encode,让Indy自动处理编码
  Parametri.AddFormField('from', 'Excited user<excited@sandbox.mailgun.org>', 'utf-8').ContentTransfer := '8bit';
  Parametri.AddFormField('to','to@mail.com');
  Parametri.AddFormField('subject', 'xy: sub...', 'utf-8').ContentTransfer := '8bit';
  Parametri.AddFormField('text', 'Here is my text...', 'utf-8').ContentTransfer := '8bit';
  // 修正字段名为attachment,并指定PDF的MIME类型
  Parametri.AddFile('attachment', 'c:\ABC.pdf', 'application/pdf');
  Memo1.Text := IdHTTP1.Post( 'https://api.mailgun.net/v3/sandbox.mailgun.org/messages', Parametri);
finally
  Parametri.Free;
end;

另外,如果修改后还是有问题,可以检查下Indy的版本——较旧的Indy版本在处理multipart/form-data时可能存在边界符生成或者Content-Disposition头部的bug,建议升级到最新稳定版试试。

内容的提问来源于stack exchange,提问作者s.b.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:21