【发布时间】:2021-01-20 18:26:14
【问题描述】:
我想发送一封正文顶部带有徽标的电子邮件。这是我的方法:
public bool SendEmail(string toAddress)
{
SmtpClient smtpServer = new SmtpClient("the server");
try
{
AlternateView htmlView = AlternateView.CreateAlternateViewFromString("<image src=cid:logo style=\"height: 50px;\"><br>Hello World", null, MediaTypeNames.Text.Html);
LinkedResource imageResource = new LinkedResource(Server.MapPath(@"..\..\images\logo.png"));
imageResource.ContentId = "logo";
htmlView.LinkedResources.Add(imageResource);
smtpServer.Port = port;
smtpServer.Credentials = new NetworkCredential("user", "pass");
smtpServer.EnableSsl = false;
MailMessage message = new MailMessage();
message.To.Add(toAddress);
message.From = new MailAddress("the address");
message.Subject = "Some subject";
message.AlternateViews.Add(htmlView);
message.IsBodyHtml = true;
smtpServer.Send(message);
smtpServer.Dispose();
return true;
}
catch (Exception ex)
{
return false;
}
}
方法正在发送电子邮件,但图像作为附件发送。我试过这样做:
LinkedResource imageResource = new LinkedResource(Server.MapPath(@"..\..\images\logo.png"), MediaTypeNames.Image.Jpeg);
但是当我在这一行中添加“MediaTypeNames.Image.Jpeg”时,发送的电子邮件根本没有图像。
有人可以帮助我吗?提前致谢!
【问题讨论】:
-
不要使用布尔值作为判断方法是否成功的手段。如果它不太可能失败,只需让异常冒泡到可以处理的程度。您在此处的 catch 块也隐藏了异常详细信息,因此如果电子邮件确实开始发送失败,您将不知道错误是什么。
-
@mason 感谢您的建议!我会重新考虑这个
-
您还可以考虑电子邮件正文中的 base64 图像。另外我不确定这个 Server.MapPath 将如何工作?图片网址可以公开访问吗?
-
@Nantharupan 此图片网址是项目内的文件夹
-
@Wanderer 太棒了。如果您确实认为某个方法很有可能会失败,那么您可以创建一个类或枚举来表示结果,而不是返回一个布尔值。如果你调用一个方法并且它返回一个布尔值,你怎么知道这个布尔值是什么意思?您必须希望它被记录在案,或者阅读方法本身。但是如果你返回一个像
EmailSendingResult.FailedToSend这样的枚举,那么发生了什么就很清楚了。当然,在这种情况下,请确保捕获异常并将其记录下来,以便进行故障排除。