【问题标题】:Send e-mail with image on body发送带有正文的电子邮件
【发布时间】: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 这样的枚举,那么发生了什么就很清楚了。当然,在这种情况下,请确保捕获异常并将其记录下来,以便进行故障排除。

标签: c# asp.net smtp


【解决方案1】:

您可以将图像转换为 base64 并将其添加到 src 中,或者您可以只提供图像所在的页面。

【讨论】:

  • 我转换到base64并且工作了!谢谢!
【解决方案2】:

你可以试试图书馆MailKit。使用此库可以很好地发送嵌入的图像。

var stream = new MemoryStream();
image.Save(stream, ImageFormat.Png);
stream.Position = 0;

var resource = builder.LinkedResources.Add(contentId, stream);
resource.ContentId = contentId;

// in the email message, there is img with src="cid:contentId"

另一个嵌入图像的例子是here

【讨论】:

    【解决方案3】:

    你可以使用它:

     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 = 0; //add port here
                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";
    
                //add file here
                Attachment attachment = new Attachment("c://image");
                attachment.ContentDisposition.Inline = true;
                message.Attachments.Add(attachment);
    
                message.AlternateViews.Add(htmlView);
                message.IsBodyHtml = true;
    
    
                smtpServer.Send(message);
                smtpServer.Dispose();
    
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 2015-02-10
      • 2012-06-15
      • 2018-11-21
      • 2019-07-20
      • 2021-06-12
      • 2017-01-16
      相关资源
      最近更新 更多