معرفی
ارسال ایمیل به بخش مهمی از ارتباطات در دنیای دیجیتال امروزی تبدیل شده است. یکی از الزامات مکرر ارسال فایل های PDF به عنوان پیوست ایمیل است. گاهی اوقات، ممکن است بخواهید یک PDF ایجاد شده به صورت پویا را به عنوان پیوست در سی شارپ ارسال کنید. این می تواند زمانی مفید باشد که شما نیاز به ایجاد گزارش یا فاکتور دارید و آنها را برای مشتریان یا همکاران خود ایمیل کنید.
در این مقاله نحوه ارسال ایمیل با PDF ایجاد شده به صورت پویا به عنوان یک پیوست با استفاده از C# را بررسی خواهیم کرد.
بیایید با کد شروع کنیم.
ابتدا یک پروژه خالی جدید در Asp.net Core Web App (MVC) با C# ایجاد کردیم. حالا باید بسته NuGet را نصب کنیم.
- NuGetInstall-Package iTextSharp -نسخه 5.5.13.3
- NuGetInstall-Package itextsharp.xmlworker -نسخه 5.5.13.3
بیایید کد را شروع کنیم.
_host.WebRootPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
string contentRootPath = _host.WebRootPath + "/test.html";
using(StreamReader reader = new StreamReader(contentRootPath)) {
body = reader.ReadToEnd();
}
body = body.Replace("{title}", "Your First title");
body = body.Replace("{Header1}", "First Header");
body = body.Replace("{Header2}", "Second Header");
body = body.Replace("{currentdate}", DateTime.Now.ToString());
در کد بالا یک صفحه HTML ایجاد کنید که برای ایجاد pdf استفاده می شود.
حالا به پوشه wwwroot رفته و یک صفحه HTML به عنوان test.html ایجاد کنید.
<html>
<head>
<title>{title}</title>
</head>
<body>
<h1>{Header1}</h1>
<h2>{Header2}</h2>
<p>Pages (HTML)</p>
<p>Style Sheets (CSS)</p>
<p>Computer Code (JavaScript)</p>
<p>Live Data (Files and Databases)</p>
<p>{currentdate}</p>
</body>
</html>
حالا کد را ادامه دهید،
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
byte[] ? bytesArray = null;
using(var ms = new MemoryStream()) {
var document = new Document();
PdfWriter writer = PdfWriter.GetInstance(document, ms);
document.Open();
using(var strReader = new StringReader(body)) {
//Set factories
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
//Set css
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
string contentRootPath1 = _host.WebRootPath + "/css/site.css";
cssResolver.AddCssFile(contentRootPath1, true);
//Export
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
var worker = new XMLWorker(pipeline, true);
var xmlParse = new XMLParser(true, worker);
xmlParse.Parse(strReader);
xmlParse.Flush();
}
document.Close();
bytesArray = ms.ToArray();
}
byte[] reader = {};
mailMessage.IsBodyHtml = true;
mailMessage.From = new MailAddress("sendermail@gmail.com");
mailMessage.Subject = "Test Payment Receipt";
mailMessage.Body = "Please Find The Attachment";
mailMessage.IsBodyHtml = true;
mailMessage.Attachments.Add(new Attachment(new MemoryStream(bytesArray), "Test.pdf"));
mailMessage.To.Add(new MailAddress("recivermail@gmail.com"));
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.EnableSsl = true;
System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
NetworkCred.UserName = "sendermail@gmail.com";
NetworkCred.Password = "password";
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = NetworkCred;
smtp.Port = 587;
smtp.Send(mailMessage);
}
در کد بالا، شی MemoryStream
محتوای PDF را نگه می دارد. و صفحه HTML را به PDF تبدیل کنید. اکنون این فایل pdf را با استفاده از MailMessage به صورت پیوست ارسال کنید.
ما یک شیء MailMessage جدید ایجاد می کنیم
و خصوصیات لازم مانند فرستنده، گیرنده، موضوع و بدن را تنظیم کنید. سپس با استفاده از آبجکت MemoryStream یک شی پیوست ایجاد می کنیم و آن را به پیام ایمیل اضافه می کنیم.
در مثال بالا، من از جیمیل به عنوان یک ایمیل فرستنده استفاده می کنم. اگر از جیمیل نیز به عنوان فرستنده نامه استفاده می کنید، مراحلی را دنبال کنید.