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

C#发送内嵌图片的HTML邮件异常:显示原始代码且生成.dat附件

解决C# SmtpClient发送内嵌图片HTML邮件的问题

问题根源

  • HTML代码被转义:生成HTML时使用了</>实体字符,导致邮件客户端将其识别为纯文本而非可解析的HTML标签。
  • AlternateView配置错误:创建AlternateView时错误指定了image/jpg媒体类型,且未正确关联LinkedResource的ContentId。
  • 重复内容冲突:同时设置MailMessage.Body和添加AlternateView,导致邮件内容逻辑混乱,生成多余的.dat格式附件。

修复步骤

1. 修正HTML生成代码

将转义的实体字符替换为实际HTML标签,同时修复CSS语法错误(table-border改为table.border),并补全未闭合的标签:

public static string getHtmlTruckData()
{
    try
    {
        string messageBody = "";
        string styleFormat = "<style>" +
                                    "table.border {" +
                                        "border-collapse:collapse;" +
                                    "}" +
                                    "table.border th {" +
                                        "padding: 5px; " +
                                        "border: 1px solid black" +
                                    "}" +
                                    "table.border td {" +
                                        "padding: 5px; " +
                                        "border: 1px solid black" +
                                    "}" +
                              "</style>";

        string htmlMainTableStart = "<table style=\"width:100%;\">";
        string htmlMainTableEnd = "</table>";
        string headerHTMLFormat = "<tr>" +
            "<td style=\"width:20%;\"></td>" +
            "<td style=\"width:60%\" align=\"center\">" +
            "<table>" +
            "<img src=\"cid:logo\"/>"+
            "</table>" +
            "</td>" +
            "<td style=\"width:20%;\">" +
            "<table class=\"border\" style=\"width:100%\">" +
            "<tr><td align=\"center\">"+ DateTime.Now.ToShortDateString() + "</td> </tr>" +
            "<tr><td align=\"center\">" + "Daily Trip Report" + "</td> </tr>" +
            "</table>"+ 
            "</td>" +
            "</tr>";

        messageBody = styleFormat;
        messageBody += htmlMainTableStart;
        messageBody += headerHTMLFormat;
        messageBody += htmlMainTableEnd;

        return messageBody;
    }
    catch (Exception ex)
    {
        return null;
    }
}

2. 修正邮件发送代码

正确配置AlternateView为text/html类型,关联LinkedResource的ContentId与HTML中的cid:logo,移除重复的Body设置:

try
{
    using (SmtpClient client = new SmtpClient())
    {
        client.Host = "smtp.gmail.com";
        client.Port = 587;
        client.EnableSsl = true;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Credentials = new System.Net.NetworkCredential()
        {
            UserName = "mailaccount@gmail.com",
            Password = "mypaswrd"
        };

        MailAddress fromEmail = new MailAddress("mailaccount@gmail.com", "Name");
        MailAddress toEmail = new MailAddress("mailaccount@gmail.com", "Name");

        // 创建HTML格式的AlternateView
        AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlString, null, "text/html");
        
        // 初始化图片资源并设置ContentId
        LinkedResource logo = new LinkedResource(@"routeofmyimage")
        {
            ContentId = "logo" // 与HTML中的cid:logo完全匹配
        };
        htmlView.LinkedResources.Add(logo);

        MailMessage message = new MailMessage(fromEmail, toEmail)
        {
            Subject = "Subject"
        };
        message.AlternateViews.Add(htmlView);

        client.Send(message);
    }
}
catch (Exception ex)
{
    // 建议添加错误日志,便于排查问题
}

额外注意事项

  • Gmail权限:若使用Gmail发送,需确保账号开启低权限应用访问;若开启了两步验证,需使用应用专用密码。
  • 图片路径:routeofmyimage需为图片文件的完整本地路径,且程序具备读取权限。
  • 标签规范:确保HTML标签完全闭合,避免邮件客户端渲染异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:30:57