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

如何使用Mailgun和HttpClient在.NET Core Azure Function中发送带附件邮件

问题根源

你的代码问题出在附件对应的表单字段名不符合Mailgun v3 API的要求:Mailgun要求附件的表单字段名必须固定为attachment,你当前将ContentDisposition的Name属性设为了自定义的"Daily report",导致服务端无法识别这是附件字段,因此仅发送了正文内容。


修正后可运行代码

// 可选:手动指定无引号的边界,避免旧版.NET Core默认边界带引号导致Mailgun解析失败
var boundary = Guid.NewGuid().ToString();
var formContent = new MultipartFormDataContent(boundary);
formContent.Headers.Remove("Content-Type");
formContent.Headers.TryAddWithoutValidation("Content-Type", $"multipart/form-data; boundary={boundary}");
   
// 基础邮件参数保持不变
formContent.Add(new StringContent($"Testing This thing <{_settings.CurrentValue.MailgunFrom}>"), "from");
formContent.Add(new StringContent(string.Join(",", to)), "to");
formContent.Add(new StringContent(subject), "subject");
formContent.Add(new StringContent(body), "text");                    

ByteArrayContent fileContent = new ByteArrayContent(theBytes);
// 补充文件的Content-Type,避免服务端识别错误,可根据实际文件类型修改
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
                    
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
    // 核心修正:字段名必须设为Mailgun要求的固定值attachment
    Name = "attachment",
    FileName = System.IO.Path.GetFileName(somelongFilepath)
};

formContent.Add(fileContent);                    

// 注意提前配置HttpClient的基础参数:
// 1. 基础地址:美国区为https://api.mailgun.net/,欧盟区为https://api.eu.mailgun.net/
// 2. 认证头:Basic认证,用户名固定为api,密码为你的Mailgun API密钥
// 3. 不要用.Result阻塞调用,Azure Function中用await避免线程池阻塞
var result = await _httpClient.PostAsync($"v3/{_settings.CurrentValue.MailgunDomain}/messages", formContent);
result.EnsureSuccessStatusCode();

额外说明

  • 如果需要发送邮件正文中引用的内嵌资源(比如图片),将字段名改为inline即可
  • 如果要同时发送多个附件,重复添加多个Name为attachment的文件内容即可

内容的提问来源于stack exchange,提问作者Darren Wainwright

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:00:03