XtraReport Rapor çıktısını html olarak body kısmına ekleme

İlk olarak MhtParsel adında bir class oluşturuyoruz.

class MhtParser
{
public class Part
{
public string MediaType { get; set; }
public string ContentID { get; set; }
public byte[] Content { get; set; }
}      


  string[] parts;

        public IEnumerable<Part> Parts
        {
            get
            {
                for (int i = 3; i < parts.Length - 1; i++)
                {
                    yield return new Part()
                    {
                        MediaType = Regex.Match(parts[i], "Content-Type:\\s*(.*)\r").Groups[1].Value,
                        ContentID = Regex.Match(parts[i], "Content-ID:\\s*<(.*?)>").Groups[1].Value,
                        Content = Base64Decode(parts[i].Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None)[1])
                    };
                }
            }
        }
        public MhtParser(string mht)
        {
            string boundary = GetBoundary(mht);
            parts = mht.Split(new string[] { boundary }, StringSplitOptions.None);
        }
        public string GetBody()
        {
            return Encoding.UTF8.GetString(Base64Decode(parts[2].Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None)[1]));
        }
        string GetBoundary(string s)
        {
            Match m = Regex.Match(s, "boundary=\"(.*?)\";");
            if (m.Success)
                return m.Groups[1].Value;
            return null;
        }
        byte[] Base64Decode(string s)
        {
            byte[] bodyBytes = Encoding.Default.GetBytes(s);
            return new FromBase64Transform().TransformFinalBlock(bodyBytes, 0, bodyBytes.Length);
        }

    }

Daha sonra Xtrareportumuzun data source doldurduktan sonra raporumuzun layoutunu yüklüyoruz.Daha sonra Mime html çevirdikten sonra daha önce oluşturduğumuz klasımızı çağırıyoruz.

     
       XtraReport Rpt = new XtraReport();
  Rpt.DataSource = GetRaporBilgi(sqlTip, sqlQuery, Parametreler);
 ReportPrintTool PrintTool = new ReportPrintTool(Rpt);
                                ((XtraReport)PrintTool.Report).LoadLayout(RaporDosyasi);
  ReportDesignTool ReportDesingTool = new ReportDesignTool(Rpt);
  Rpt.CreateDocument();
MemoryStream mhtStream = new MemoryStream();
                            Rpt.ExportToMht(mhtStream);

                            MhtParser mhtParser = new MhtParser(Encoding.Default.GetString(mhtStream.ToArray()));

                            string body = mhtParser.GetBody();
                            body = Regex.Replace(body, "<script.*?</script>", "", RegexOptions.Singleline);

                            AlternateView htmlView = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
                            htmlView.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
                            foreach (var part in mhtParser.Parts)
                            {
                                if (body.Contains("cid:" + part.ContentID))
                                {
                                    LinkedResource res = new LinkedResource(new MemoryStream(part.Content), part.MediaType);
                                    res.ContentId = part.ContentID;
                                    res.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
                                    htmlView.LinkedResources.Add(res);
                                }
                            }

AlternateView htmlView değerini mail gönderme servisine gönderiyoruz.

MailMessage mail = new MailMessage();

mail.AlternateViews.Add(htmlView ); Bu şekilde gönderilmesi gerekir.

Mail eklediğimiz çıktı örneğidir.