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.
相关产品推荐
相关产品推荐

