发送内联MHTML

时间:2009-05-27 15:25:38

标签: c# .net email mhtml

我想知道是否可以通过.NET 2.0 MailMessage object发送动态创建的内联MHTML文件。

内联我的意思是:一旦打开电子邮件,就应该以用户可以看到它的方式发送,而无需打开/下载附件。

5 个答案:

答案 0 :(得分:3)

(jdecuyper - 感谢插件,因为我写了aspNetEmail)。

您可以使用aspNetEmail执行此操作。您可以使用MHT替换电子邮件的全部内容。

你无法使用System.Net.Mail执行此操作,但如果你想去商业路线,请发送电子邮件至dave@advancedintellect.com,我会告诉你如何做到这一点。

如果您想要开源路由,可能会在codeproject上有一些SMTP代码,您可以修改它们来执行此操作。基本上,您可以将内容注入SMTP进程的DATA命令。

有一点需要注意:如果您的MHT文档包含嵌入的脚本,flash,activeX对象或可能被邮件客户端阻止的任何内容,则它可能与您在浏览器中看到的内容不同。

答案 1 :(得分:3)

这有点棘手,但是,你可以做到。事实上,MailMessage类只不过是系统的CDO.Message类上面的一个包装器,可以解决这个问题。 您也可以使用AlternateView功能,它更简单:

MailMessage mailMessage = new MailMessage("me@me.com"
    ,"me@me.com"
    ,"test"
    ,"");
string ContentId = "wecandoit.jpg";
mailMessage.Body = "<img src=\"cid:" + ContentId + "\"/>";
AlternateView av = AlternateView.CreateAlternateViewFromString(mailMessage.Body
    ,null
    ,MediaTypeNames.Text.Html);
LinkedResource lr = new LinkedResource(@"d:\Personal\My Pictures\wecandoit.jpg");
lr.ContentId = ContentId;
lr.ContentType.Name = ContentId;
lr.ContentType.MediaType = "image/jpeg";
av.LinkedResources.Add(lr);
mailMessage.AlternateViews.Add(av);
SmtpClient cl = new SmtpClient();
cl.PickupDirectoryLocation = @"c:\test";
cl.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
cl.Send(mailMessage);

答案 2 :(得分:1)

您是否尝试将某些图片添加到html电子邮件中?

要实现此目的,您需要将图像嵌入电子邮件中。我找到了tutorial来完成几行代码。您也可以购买aspnetemail组件。它总是帮助我发送带有嵌入式图像的电子邮件,如果出现任何问题,他们也有一个优秀的支持团队。

请记住,嵌入图片会使您的电子邮件更重,但更好:)

答案 3 :(得分:0)

可以通过CDO.Message(有必要添加到项目引用COM库“Microsoft CDO for Windows 2000 Library”):

protected bool SendEmail(string emailFrom, string emailTo, string subject, string MHTmessage)
{
    string smtpAddress = "smtp.email.com";

    try
    {
      CDO.Message oMessage = new CDO.Message();

      // set message
      ADODB.Stream oStream = new ADODB.Stream();
      oStream.Charset = "ascii";
      oStream.Open();
      oStream.WriteText(MHTmessage);
      oMessage.DataSource.OpenObject(oStream, "_Stream");

      // set configuration
      ADODB.Fields oFields = oMessage.Configuration.Fields;
      oFields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = CDO.CdoSendUsing.cdoSendUsingPort;
      oFields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = smtpAddress;
      oFields.Update();

      // set other values
      oMessage.MimeFormatted = true;
      oMessage.Subject = subject;
      oMessage.Sender = emailFrom;
      oMessage.To = emailTo;
      oMessage.Send();
    }
    catch (Exception ex)
    {
      // something wrong
    }
}

答案 4 :(得分:0)

可以通过CDO.Message(有必要添加到项目引用COM库“Microsoft CDO for Windows 2000 Library”):

protected bool SendEmail(string emailFrom, string emailTo, string subject, string MHTmessage)
{
    string smtpAddress = "smtp.email.com";

    try
    {
      CDO.Message oMessage = new CDO.Message();

      // set message
      ADODB.Stream oStream = new ADODB.Stream();
      oStream.Charset = "ascii";
      oStream.Open();
      oStream.WriteText(MHTmessage);
      oMessage.DataSource.OpenObject(oStream, "_Stream");

      // set configuration
      ADODB.Fields oFields = oMessage.Configuration.Fields;
      oFields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = CDO.CdoSendUsing.cdoSendUsingPort;
      oFields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = smtpAddress;
      oFields.Update();

      // set other values
      oMessage.MimeFormatted = true;
      oMessage.Subject = subject;
      oMessage.Sender = emailFrom;
      oMessage.To = emailTo;
      oMessage.Send();
    }
    catch (Exception ex)
    {
      // something wrong
    }
}