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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:05:09