使用c #windows应用程序

时间:2015-11-12 05:58:33

标签: c# .net winforms

我搜索了几次并找到了解决方案,但都只支持一个图像。最后我使用了这个代码。 但问题是,如果html包含多个图像,则只有一个图像显示在正文中,其他图像将作为附件出现。

string inputHtmlContent = htmlbody;
string outputHtmlContent = string.Empty;
var myResources = new List<LinkedResource>();

if ((!string.IsNullOrEmpty(inputHtmlContent)))
{
  var doc = new HtmlAgilityPack.HtmlDocument();
  doc.LoadHtml(inputHtmlContent);
  HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//img");
  if (nodes !=null)
  {
    foreach (HtmlNode node in nodes)
    {
      if (node.Attributes.Contains("src"))
      {
        string data = node.Attributes["src"].Value;
        string imgPath = Application.StartupPath+"\\"+data;
        var imgLogo = new LinkedResource(imgPath);
        imgLogo.ContentId = Guid.NewGuid().ToString();
        imgLogo.ContentType = new ContentType("image/jpeg");
        myResources.Add(imgLogo);
        node.Attributes["src"].Value = string.Format("cid:{0}", imgLogo.ContentId);
        outputHtmlContent = doc.DocumentNode.OuterHtml;
      }
    }
  }
  else
  {
    outputHtmlContent = inputHtmlContent;
  }
  AlternateView av2 = AlternateView.CreateAlternateViewFromString(outputHtmlContent,
                            null, MediaTypeNames.Text.Html);
  foreach (LinkedResource linkedResource in myResources)
  {
    av2.LinkedResources.Add(linkedResource);
  }

  msg.AlternateViews.Add(av2);

请帮我解决此问题,如何在电子邮件正文中显示所有图片?...

2 个答案:

答案 0 :(得分:3)

您可以将图片附加到邮件中,然后将img代码添加为src private void denMailButton_Click(object sender, EventArgs e) { string subject = "Subject"; string body = @"Image 1: <img src=""$CONTENTID1$""/> <br/> Image 2: <img src=""$CONTENTID2$""/> <br/> Some Other Content"; MailMessage mail = new MailMessage(); mail.From = new MailAddress("from@example.com"); mail.To.Add(new MailAddress("to@example.com")); mail.Subject = subject; mail.Body = body; mail.Priority = MailPriority.Normal; string contentID1 = Guid.NewGuid().ToString().Replace("-", ""); string contentID2 = Guid.NewGuid().ToString().Replace("-", ""); body = body.Replace("$CONTENTID1$", "cid:" + contentID1); body = body.Replace("$CONTENTID2$", "cid:" + contentID2); AlternateView htmlView = AlternateView.CreateAlternateViewFromString(body, null, "text/html"); //path of image or stream LinkedResource imagelink1 = new LinkedResource(@"D:\1.png", "image/png"); imagelink1.ContentId = contentID1; imagelink1.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; htmlView.LinkedResources.Add(imagelink1); LinkedResource imagelink2 = new LinkedResource(@"D:\2.png", "image/png"); imagelink2.ContentId = contentID2; imagelink2.TransferEncoding = System.Net.Mime.TransferEncoding.Base64; htmlView.LinkedResources.Add(imagelink2); mail.AlternateViews.Add(htmlView); SmtpClient client = new SmtpClient(); client.Host = "mail.example.com"; client.Credentials = new NetworkCredential("from@example.com", "password"); client.Send(mail); } 这样的附件:

{{1}}

以下是截图:

ContentId

答案 1 :(得分:0)

试试这段代码。这将为excel,csv,pdf以及内联附件生成附件,即在用于png格式的图像的电子邮件正文中。 对于png格式,多个图像将通过 GetEmbeddedImage 方法逐个嵌入内嵌。您可以根据自己的要求进行自定义。

SmtpClient smtpServer = new SmtpClient(smtpServerName);
smtpServer.Port = 25;
smtpServer.Credentials = new System.Net.NetworkCredential(userName, password);
//smtpServer.EnableSsl = true;
MailMessage smtpEmail = new MailMessage();
string messageBodyImage = @"<img width=1200 id=""MyContent"" src=""cid:{0}"">";
 toAddressList = toAddress.Split(';');
foreach (string toEmail in toAddressList)
    smtpEmail.To.Add(toEmail);

smtpEmail.From = new MailAddress(fromAddress);
smtpEmail.Body = messageBody;
smtpEmail.Subject = subject;
foreach (string format in fileExtension)
 {    
    switch (format)
     {       
    case "PNG": 
    smtpEmail.IsBodyHtml = true;
    smtpEmail.AlternateViews.Add(GetEmbeddedImage(reportByteStream, messageBodyImage, format)); 
    break;
    case "CSV":      
    smtpEmail.Attachments.Add(new System.Net.Mail.Attachment(new MemoryStream(myStream[format][0]), "MyReport." + format, "text/csv"));  
    break;
    case "XLS": 
    smtpEmail.Attachments.Add(new System.Net.Mail.Attachment(new MemoryStream(myStream[format][0]), "MyReport." + format, "application/vnd.ms-excel"));
    break;
    default: // For PDF
    smtpEmail.Attachments.Add(new System.Net.Mail.Attachment(new MemoryStream(myStream[format][0]), "MyReport." + format, MediaTypeNames.Application.Pdf));
    break;
    }
}

嵌入多个图像的方法。

    private AlternateView GetEmbeddedImage(Dictionary<string, Byte[][]> streamAttachment, string msgTemplate, string fileFormat)
    {
        LinkedResource imageFile = null;
        AlternateView alternateView = null;
        string msgBody = string.Empty;
        try
        {
        List<LinkedResource> imageFiles = new List<LinkedResource>();
        for (int page = 0; page < streamAttachment[fileFormat].Length; page++)
        {   
                imageFile = new LinkedResource(new MemoryStream(streamAttachment[fileFormat][page]));
                imageFile.ContentId = Guid.NewGuid().ToString();
                msgBody = msgBody + "<BR/>" + string.Format(msgTemplate, imageFile.ContentId);
                imageFiles.Add(imageFile); 
        }

        alternateView = AlternateView.CreateAlternateViewFromString(msgBody, null, MediaTypeNames.Text.Html);
        imageFiles.ForEach(img => alternateView.LinkedResources.Add(img));
        }
        catch (Exception Ex)
        {

        }
        return alternateView;
    }