İ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.
