如何使用c#aspx通过电子邮件发送MIME数据

时间:2009-12-04 14:49:55

标签: c# asp.net email 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"

似乎我需要将内容类型设置为multipart,但我不确定如何......

5 个答案:

答案 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执行此操作。

以下是您遇到的问题。

  1. 编码。

    您的orignal邮件是使用quoted-printable编码保存的(因此您看到的是“= 3D”)当您重新将其读入邮件时,这些邮件将被双重编码。编码用于在SMTP传输期间保护邮件。

  2. 边界。

    创建消息时,标题中使用边界来告知邮件客户端消息的不同部分的边界。您试图获取一条消息的边界,并将它们合并为一条新消息。由于System.Net.Mail无法对内部边界进行足够的控制,因此无法执行此操作。

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

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