SmtpClient() 允许您在邮件中添加附件,但是如果您想在邮件打开时显示图像而不是附加它怎么办?
我记得,它可以用大约 4 行代码来完成,但我不记得是怎么做的,而且我在 MSDN 网站上找不到它。
编辑:我没有使用网站或任何东西,甚至没有 IP 地址。图像位于硬盘驱动器上。发送时,它们应该是邮件的一部分。所以,我想我可能想使用一个标签......但我不太确定,因为我的电脑没有广播。
SmtpClient() 允许您在邮件中添加附件,但是如果您想在邮件打开时显示图像而不是附加它怎么办?
我记得,它可以用大约 4 行代码来完成,但我不记得是怎么做的,而且我在 MSDN 网站上找不到它。
编辑:我没有使用网站或任何东西,甚至没有 IP 地址。图像位于硬盘驱动器上。发送时,它们应该是邮件的一部分。所以,我想我可能想使用一个标签......但我不太确定,因为我的电脑没有广播。
经常提到的一种解决方案是将图像作为 an 添加Attachment
到邮件中,然后使用引用在 HTML 邮件正文中引用它cid:
。
但是,如果您改用该LinkedResources
集合,则内联图像仍会显示得很好,但不会显示为邮件的附加附件。这就是我们想要发生的事情,所以这就是我在这里所做的:
using (var client = new SmtpClient())
{
MailMessage newMail = new MailMessage();
newMail.To.Add(new MailAddress("you@your.address"));
newMail.Subject = "Test Subject";
newMail.IsBodyHtml = true;
var inlineLogo = new LinkedResource(Server.MapPath("~/Path/To/YourImage.png"), "image/png");
inlineLogo.ContentId = Guid.NewGuid().ToString();
string body = string.Format(@"
<p>Lorum Ipsum Blah Blah</p>
<img src=""cid:{0}"" />
<p>Lorum Ipsum Blah Blah</p>
", inlineLogo.ContentId);
var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
view.LinkedResources.Add(inlineLogo);
newMail.AlternateViews.Add(view);
client.Send(newMail);
}
注意:此解决方案将一个添加AlternateView
到您MailMessage
的 typetext/html
中。为了完整起见,您还应该添加一个AlternateView
type text/plain
,其中包含用于非 HTML 邮件客户端的纯文本版本的电子邮件。
HTML 电子邮件和图像是附件,因此只是通过内容 ID 引用图像的情况,即
Dim A As System.Net.Mail.Attachment = New System.Net.Mail.Attachment(txtImagePath.Text)
Dim RGen As Random = New Random()
A.ContentId = RGen.Next(100000, 9999999).ToString()
EM.Body = "<img src='cid:" + A.ContentId +"'>"
这里似乎有全面的例子:Send Email with inline images
当你说 4 行代码时,你指的是这个吗?
System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath\filename.png");
inline.ContentDisposition.Inline = true;
在 Base64 字符串中转换图像怎么样?AFAIK 这可以很容易地嵌入邮件正文中。
看看这里。
已经发布的解决方案是我找到的最好的解决方案,例如,如果您有多个图像,我将完成它。
string startupPath = AppDomain.CurrentDomain.RelativeSearchPath;
string path = Path.Combine(startupPath, "HtmlTemplates", "NotifyTemplate.html");
string body = File.ReadAllText(path);
//General tags replacement.
body = body.Replace("[NOMBRE_COMPLETO]", request.ToName);
body = body.Replace("[ASUNTO_MENSAJE]", request.Subject);
//Image List Used to replace into the template.
string[] imagesList = { "h1.gif", "left.gif", "right.gif", "tw.gif", "fb.gif" };
//Here we create link resources one for each image.
//Also the MIME type is obtained from the image name and not hardcoded.
List<LinkedResource> imgResourceList = new List<LinkedResource>();
foreach (var img in imagesList)
{
string imagePath = Path.Combine(startupPath, "Images", img);
var image = new LinkedResource(imagePath, "image/" + img.Split('.')[1]);
image.ContentId = Guid.NewGuid().ToString();
image.ContentType.Name = img;
imgResourceList.Add(image);
body = body.Replace("{" + Array.IndexOf(imagesList, img) + "}", image.ContentId);
}
//Altern view for managing images and html text is created.
var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
//You need to add one by one each link resource to the created view
foreach (var imgResorce in imgResourceList)
{
view.LinkedResources.Add(imgResorce);
}
ThreadPool.QueueUserWorkItem(o =>
{
using (SmtpClient smtpClient = new SmtpClient(servidor, Puerto))
{
smtpClient.EnableSsl = true;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.Timeout = 50000;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new System.Net.NetworkCredential()
{
UserName = UMail,
Password = password
};
using (MailMessage mailMessage = new MailMessage())
{
mailMessage.IsBodyHtml = true;
mailMessage.From = new MailAddress(UMail);
mailMessage.To.Add(request.ToEmail);
mailMessage.Subject = "[NAPNYL] " + request.Subject;
mailMessage.AlternateViews.Add(view);
smtpClient.Send(mailMessage);
}
}
});
如您所见,您有一组图像名称,图像位于同一个文件夹中很重要,因为它指向同一个输出文件夹。
最后,电子邮件以异步方式发送,因此用户不必等待发送。
打开邮件时在客户端显示图像的过程是客户端功能。只要客户端知道如何渲染图像并且没有阻止任何图像内容,它就会立即打开它。只要您正确指定了图像 mime 附件类型,就无需在发送电子邮件时进行任何特殊操作以使其在客户端上打开。