如何使用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
相关产品推荐
相关产品推荐

