我想向用户发送密码电子邮件,但客户希望在电子邮件中嵌入(内嵌)图像。
我创建了一封电子邮件,将数据保存到txt文件,在我在模板中读取的代码中,但是当我发送它时,行结尾被破坏,因此MIME数据被破坏。我得到= 3D
我做错了什么?
string FILENAME = Server.MapPath("~/GuestUserTemplate.txt");
StreamReader objStreamReader = File.OpenText(FILENAME);
string sEmailTemplate = "";
string input = null;
while ((input = objStreamReader.ReadLine()) != null)
{
sEmailTemplate = sEmailTemplate + input;
}
objStreamReader.Close();
/* send an email */
MailMessage msg = new MailMessage();
msg.IsBodyHtml = true;
msg.To.Add(new MailAddress(sToEmail));
msg.From = new MailAddress(sFromEmail);
msg.Subject = sEmailSubject;
msg.Body = sEmailTemplate;
//try
{
client.Send(msg);
}
//catch (Exception excm)
{
}
刚做了一点侦探工作。我发送的电子邮件在标题中有这个:
MIME-Version: 1.0
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
具有内嵌图片的电子邮件在哪里:
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----_=_NextPart_001_01C9C98D.6552117E";
type="multipart/alternative"
似乎我需要将内容类型设置为multipart,但我不确定如何......
答案 0 :(得分:2)
我不太确定你要加载什么样的文字(并附加什么?)但我建议你创建一个真实的模板,例如:您的电子邮件文本,占位符将替换为用户名等。
使用< img src =“cid:logo.png”/> - 对于邮件的HTML正文中的内嵌图片(在模板中)。
然后,您需要将相应的图像添加到MailMessage的LinkedResources集合中,并将其ContentID标头设置为“logo.png”或您调用的任何内容。然后转发并发送邮件(将根据邮件结构自动为您设置多部分内容类型。)
P.S。:使用SendAsync()或将邮件写入您自己的smtp服务器的本地提取队列,否则您将占用ASP.NET工作线程。连接到远程smtp服务器/ Web服务等需要相当长的时间(与请求执行时间相比)并且工作线程正在等待并且无法为其他传入请求提供服务。
答案 1 :(得分:0)
您应该使用System.Net.Mail。创建一个MailMessage,然后添加一个附件并使用SmtpClient发送。
答案 2 :(得分:0)
检查您的文本文件 - 它可能缺少预期的行结尾(Cr + Lf)。
答案 3 :(得分:0)
从以下位置更改while循环:
while ((input = objStreamReader.ReadLine()) != null)
{
sEmailTemplate = sEmailTemplate + input;
}
要:
sEmailTemplate = sEmailTemplate + objStreamReader.ReadToEnd();
答案 4 :(得分:-1)
最重要的是你无法使用System.Net.Mail执行此操作。
以下是您遇到的问题。
编码。
您的orignal邮件是使用quoted-printable编码保存的(因此您看到的是“= 3D”)当您重新将其读入邮件时,这些邮件将被双重编码。编码用于在SMTP传输期间保护邮件。
边界。
创建消息时,标题中使用边界来告知邮件客户端消息的不同部分的边界。您试图获取一条消息的边界,并将它们合并为一条新消息。由于System.Net.Mail无法对内部边界进行足够的控制,因此无法执行此操作。
如果要使用System.Net.Mail发送嵌入图像,则需要使用链接资源创建消息。这是一个更多的链接: