使用SendGrid发送邮件无法添加附件的技术求助
问题排查:SendGrid发送邮件时附件无法正常附带的原因
从你提供的代码来看,附件无法发送的问题主要出在Attachment对象的属性配置错误以及文件内容的处理方式不对上,下面我逐一拆解问题并给出修正方案:
1. Content属性填充错误
你当前给Content赋值的是硬编码的"BwdW",这并不是目标文件的有效Base64编码内容。SendGrid要求附件的Content必须是文件字节流转换后的Base64字符串,而不是随意的字符串,这会导致邮件无法识别附件内容。
2. Filename属性误用
Filename字段应该是收件人在邮件中看到的显示文件名(比如"EmailHeader.png"),但你现在传入的是服务器本地路径Server.MapPath("~/Content/IMG/EmailHeader.png"),这会导致SendGrid无法正确解析文件名,甚至可能忽略该附件。
3. 正确的Attachment构建方式
你需要先读取本地文件的字节流,再将其转换为Base64编码,同时正确设置各个属性。以下是修正后的Attachment构建代码:
// 读取本地文件的字节流 string filePath = Server.MapPath("~/Content/IMG/EmailHeader.png"); byte[] fileBytes = System.IO.File.ReadAllBytes(filePath); // 转换为符合要求的Base64字符串 string base64Content = Convert.ToBase64String(fileBytes); List<Attachment> files = new List<Attachment> { new Attachment() { Content = base64Content, Type = "image/png", Filename = "EmailHeader.png", // 这里是收件人看到的文件名 Disposition = "inline", ContentId = "EmailHeader" } };
4. 发送方法的优化建议
在EnvioCorreo_Copias_Archivos方法中,clientSendGrid.SendEmailAsync(msg).Wait();使用.Wait()可能会导致线程阻塞,建议改用await来异步调用,避免潜在的线程死锁问题:
// 修正后的异步发送方法 public async Task<bool> EnvioCorreo_Copias_Archivos(string cuerpo, string asunto, string correoEmisor, List<EmailAddress> correoReceptor, List<Attachment> Archivos) { try { var clientSendGrid = new SendGridClient("Key_Sendgrid"); var from = new EmailAddress(correoEmisor, "Alias"); var tos = correoReceptor; var subject = asunto; var plainTextContent = ""; var htmlContent = cuerpo; var showAllRecipients = true; var msg = MailHelper.CreateSingleEmailToMultipleRecipients(from, tos, subject, plainTextContent, htmlContent, showAllRecipients); msg.AddAttachments(Archivos); // 使用await异步发送,替代阻塞式的.Wait() var response = await clientSendGrid.SendEmailAsync(msg); // 可以通过SendGrid的响应状态码更精准判断发送结果 return response.StatusCode == System.Net.HttpStatusCode.Accepted; } catch (Exception) { return false; } }
额外提示
如果你的附件来自Google Drive,不能直接使用本地路径,需要先通过Google Drive API下载文件的字节流,再转换为Base64编码后填充到Content属性中。
内容的提问来源于stack exchange,提问作者Tomás Checa
相关产品推荐
相关产品推荐

