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
相关产品推荐
相关产品推荐

