C# 发送带有内联图像的电子邮件时出现问题

C# 发送带有内联图像的电子邮件时出现问题,c#,email-attachments,C#,Email Attachments,我正试图在我的电子邮件中发送一个内联图像,它显示得很好,但我收到的不是仅仅显示图像,而是与附件相同的图像。我如何让它只是有一个内联的电子邮件,而不是有一个单独的附件 这是我的密码: public async static Task SendMail(string emailAccount, string sendTo, string message, string subject, string imgpath) { try {

我正试图在我的电子邮件中发送一个内联图像,它显示得很好,但我收到的不是仅仅显示图像,而是与附件相同的图像。我如何让它只是有一个内联的电子邮件,而不是有一个单独的附件

这是我的密码:

 public async static Task SendMail(string emailAccount, string sendTo, string message, string subject, string imgpath)
        {
            try
            {
                string internalEmail = emailAccount;
                string emailPassword = ConfigurationManager.AppSettings["EmailPassword"];
                string displayName = "Church Musician Team";
                MailMessage myMessage = new MailMessage();
                myMessage.To.Add(sendTo);
                myMessage.From = new MailAddress(internalEmail, displayName);
                myMessage.Subject = subject;
                string attachmentPath = imgpath;
                Attachment inline = new Attachment(attachmentPath);
                inline.ContentDisposition.Inline = true;
                inline.ContentId = "id1";
                inline.ContentType.MediaType = "image/png";
                myMessage.Attachments.Add(inline);
                myMessage.Body = message;
                myMessage.IsBodyHtml = true;
               



                using (SmtpClient smtp = new SmtpClient())
                {
                    smtp.EnableSsl = false;
                    smtp.Host = ConfigurationManager.AppSettings["EmailHost"];
                    smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["EmailPort"]);
                    smtp.UseDefaultCredentials = false;
                    smtp.Credentials = new NetworkCredential(internalEmail, emailPassword);
                    smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                    smtp.SendCompleted += (s, e) => { smtp.Dispose(); };
                    await smtp.SendMailAsync(myMessage);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            
        }

您可以使用以下方法将位图数据嵌入到主体中:

public static string BmpToUrl(Bitmap source)
{
    return $"data:image/png;base64,{Convert.ToBase64String((byte[]) (new ImageConverter()).ConvertTo(source, typeof(byte[])))}";
}
然后,无论你想把它放在身体的什么地方,使用:

...
body += $"<img src='{BmpToUrl(myBitmap)} />"
...
。。。
正文+=$“”
...
这样你就不需要有一个单独的附件


诚然,我从来没有在电子邮件中这样做过,但我相信它应该会起作用。

您可以使用以下方法将位图数据嵌入到身体中:

public static string BmpToUrl(Bitmap source)
{
    return $"data:image/png;base64,{Convert.ToBase64String((byte[]) (new ImageConverter()).ConvertTo(source, typeof(byte[])))}";
}
然后,无论你想把它放在身体的什么地方,使用:

...
body += $"<img src='{BmpToUrl(myBitmap)} />"
...
。。。
正文+=$“”
...
这样你就不需要有一个单独的附件


诚然,我从来没有在电子邮件中这样做过,但我相信它应该会起作用。

这确实帮助了我。非常感谢你!这真的帮助了我。非常感谢你!谢谢你的详细回复!如果你有一个电子邮件模板,你怎么能做到这一点?是否要将其放入模板中,还是必须放入方法中?这就是为什么我试着用我的问题中的另一种方式做它的原因,因为它允许我直接将它放在我的模板中。你可以将它直接放在模板中。你只需要捕获位图的Base64编码字符串表示形式,这样你就可以将它嵌入模板中。我刚刚实现了你的答案,并意识到了这一点已经有一个名为LinkedResource的类为您执行此操作。Chetan Ranpariya为此发布了一个很好的链接。您的答案是正确的,但它实际上是链接资源的一部分。谢谢你的帮助:)谢谢你的详细回复!如果你有一个电子邮件模板,你怎么能做到这一点?是否要将其放入模板中,还是必须放入方法中?这就是为什么我试着用我的问题中的另一种方式做它的原因,因为它允许我直接将它放在我的模板中。你可以将它直接放在模板中。你只需要捕获位图的Base64编码字符串表示形式,这样你就可以将它嵌入模板中。我刚刚实现了你的答案,并意识到了这一点已经有一个名为LinkedResource的类为您执行此操作。Chetan Ranpariya为此发布了一个很好的链接。您的答案是正确的,但它实际上是链接资源的一部分。谢谢你的帮助:)