2009-12-04 69 views
1

我想向用户发送密码电子邮件,但客户想要在电子邮件中嵌入(内联)图像。如何使用c#aspx发送电子邮件的MIME数据

我创建了一封电子邮件,将数据保存到一个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" 

看来我需要设置内容类型为多部分,但我我不知道如何...

回答

2

我不太清楚你加载什么样的文字(并追加到什么呢?),但我会建议你创建一个真正的模板,例如带有占位符的电子邮件文本将替换为用户名称等

使用< IMG SRC = “CID:logo.png”/ > - 在邮件的HTML体内嵌图像(模板)。

然后,您将需要相应的图像添加到MAILMESSAGE的LinkedResources收集,并设置其内容识别头为“Logo.png”或者无论你怎么称呼它。之后,发送邮件(根据邮件消息的结构自动为您设置多部分内容类型)。

附::使用SendAsync()或邮件写自己的SMTP服务器的本地拾取队列,否则你绑你的ASP.NET辅助线程。连接到远程的SMTP服务器/网络服务等需要花费相当长的时间(与请求执行时间)和工作线程坐在那里等待,无法服务于其他传入的请求。

0

你应该使用System.Net.Mail。创建一个MailMessage,然后添加一个附件并使用SmtpClient发送。

+0

他想要的形象被内联,而不是显示为附件,所以这是不行的。 – Oded 2009-12-04 15:08:43

0

检查您的文本文件 - 它可能缺少预期的行结束(Cr + Lf)。

+0

使用程序员记事本我可以看到,行尾是CR + LF,就像你期望的那样。我看不到重新编码在哪里...... – 2009-12-04 15:12:26

+0

它是一个ASCII文件吗? .NET将在内部使用UTF-8。 – Oded 2009-12-04 15:13:48

+0

@Oded,很好的问题。程序员记事本报告其UTF-8 ...会电子邮件喜欢Unix行结束? – 2009-12-04 15:16:30

0

更改while循环从:

while ((input = objStreamReader.ReadLine()) != null) 
{ 
    sEmailTemplate = sEmailTemplate + input; 
} 

要:

sEmailTemplate = sEmailTemplate + objStreamReader.ReadToEnd(); 
+0

这只是给出了相同的结果。 – 2009-12-04 15:43:24

+0

你确定你的代码正在拾取正确的文本文件吗?它是否在根路径上? – Oded 2009-12-04 15:48:09

+0

这是一个公平的问题。是的,我只是通过重命名来检查。我只是读= 3D是某种MIME编码,我想知道模板是否正在编码,因为我将它设置为消息正文? – 2009-12-04 15:52:36

-1

底线是,你不能用System.Net.Mail做到这一点。

这是您遇到的问题。

  1. 编码。

    你的原始邮件是用quoted-printable编码保存的(因此你看到的是“= 3D”)当你重新读入这条消息时,它们会得到双重编码。正在使用编码来保护SMTP传输过程中的消息。

  2. 边界。

    创建消息时,标题中会使用边界来告知邮件客户端消息不同部分的边界。您试图对一条消息进行限制,并将它们合并为一条新消息。由于System.Net.Mail没有给你足够的内部界限控制,所以你不能这样做。

    如果要使用System.Net.Mail发送嵌入式图像,则需要使用链接资源创建消息。下面是更多的链接:

http://systemnetmail.com/faq/4.4.aspx