代码之家  ›  专栏  ›  技术社区  ›  Phil Hannent

如何使用C ASPX通过电子邮件发送MIME数据?

  •  1
  • Phil Hannent  · 技术社区  · 16 年前

    我想向用户发送一封密码电子邮件,但是客户希望在电子邮件中嵌入一个图像(内联)。

    我创建了一封电子邮件,将数据保存到一个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 回复  |  直到 15 年前
        1
  •  2
  •   liggett78    16 年前

    我不太确定您要加载哪种文本(并附加到什么内容?)但我建议您创建一个真正的模板,例如,您的电子邮件文本中的占位符将替换为用户名等。

    使用 <img src=“cid:logo.png”/> -对于HTML正文中的内联图像(在模板中)。

    然后,您需要将相应的图像添加到邮件的LinkedResources集合中,并将其ContentID头设置为“logo.png”或您称之为的任何内容。然后发送邮件(多部分内容类型将根据邮件的结构自动为您设置)。

    附笔。 :使用sendAsync()或将邮件写入您自己的SMTP服务器的本地接收队列,否则将绑定您的ASP.NET工作线程。连接到远程SMTP服务器/Web服务等需要相当长的时间(与请求执行时间相比),并且工作线程处于等待状态,无法为其他传入请求提供服务。

        2
  •  0
  •   Tor Haugen    16 年前

    您应该使用system.net.mail。创建邮件消息,然后添加附件并使用smtpclient发送。

        3
  •  0
  •   Oded    16 年前

    检查您的文本文件-它可能缺少预期的行尾(CR+LF)。

        4
  •  0
  •   Oded    16 年前

    将while循环更改为:

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

    到:

    sEmailTemplate = sEmailTemplate + objStreamReader.ReadToEnd();
    
        5
  •  -1
  •   Tim Cooper    15 年前

    最重要的是,您不能使用System.net.mail来执行此操作。

    这就是你遇到的问题。

    1. 编码。

      您的原始邮件以引用的可打印编码保存(因此您看到的“=3d”s),当您将其重新读取到邮件中时,这些邮件将得到双重编码。编码用于在SMTP传输期间保护邮件。

    2. 边界。

      创建消息时,头中使用边界来告诉邮件客户端消息不同部分的边界。您试图获取一条消息的边界,并将其合并到新消息中。由于system.net.mail没有给您足够的控制权来控制内部边界,所以您不能这样做。

      如果要使用system.net.mail发送嵌入图像,则需要使用链接资源创建邮件。以下是一个链接,其中包含更多:

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