.NET'te PDF Nasıl Bir Görüntüye Dönüştürulur
Belge teslimini otomatikleştirmek, hemen hemen her iş hattı .NET uygulamasında ortaya çıkan bir gerekliliktir. Bir sipariş verildiğinde, bir fatura müşteriye saniyeler içinde ulaşmalıdır. Bir rapor gece boyunca çalıştığında, paydaşlar ofise gelmeden önce onun gelen kutularında olmasını beklerler. En basit ve en yaygın olarak desteklenen teslimat formatı, e-posta eki olarak gönderilen bir PDF'dir. Bu kılavuz, bellekte IronPDF ile bir PDF belgesi oluşturma ve ardından bunu MailKit veya yerleşik System.Net.Mail ad alanı kullanarak, diske tek bir bayt yazmadan bir e-posta eki olarak gönderme sürecine rehberlik eder.
Gerekli Paketler Nasıl Yüklenir?
Bu iş akışını iki paket güçlendirir: bir PDF oluşturma kütüphanesi ve bir e-posta gönderme kütüphanesi. Her ikisini de Visual Studio'daki Paket Yöneticisi Konsolu aracılığıyla veya .NET CLI kullanarak yükleyin.
Install-Package IronPdf, MailKit
IronPDF, HTML, CSS ve JavaScript'i piksel mükemmeliyetinde PDF belgelerine dönüştüren bir Chromium tabanlı rendering motoru sunar. Windows, Linux ve macOS üzerinde çalışır, bu da aynı kodun bir ASP.NET Core web API'sinde, bir arka plan hizmetinde veya bir Azure Function'da çalıştığı anlamına gelir. MailKit, tüm yeni .NET e-posta geliştirmeleri için Microsoft'un önerdiği kütüphanedir -- SMTP, IMAP, POP3, OAuth 2.0 ve tam MIME yapısını destekler. MailKit kaynak kodu ve dokümantasyonu GitHub'da mevcuttur.
Bellekte Bir PDF Belgesi Nasıl Oluşturulur?
ChromePdfRenderer sınıfı, HTML'den PDF'e dönüştürme için giriş noktasıdır. HTML dizgesini RenderHtmlAsPdf'ye verin ve tamamen bellekte bulunan bir PdfDocument nesnesi geri alın. Ham baytları BinaryData özelliği üzerinden erişin - bu bayt dizisi, e-posta eki API'lerinin tam olarak beklediği şeydir.
using IronPdf;
var renderer = new ChromePdfRenderer();
string htmlContent = """
<h1>Order Confirmation</h1>
<p>Thank you for your purchase.</p>
<table>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget A</td><td>2</td><td>$19.99</td></tr>
<tr><td>Widget B</td><td>1</td><td>$59.99</td></tr>
</table>
<p><strong>Order Total: $99.97</strong></p>
""";
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
// pdf.BinaryData holds the complete PDF as a byte array
byte[] pdfBytes = pdf.BinaryData;
Console.WriteLine($"PDF generated: {pdfBytes.Length} bytes");
using IronPdf;
var renderer = new ChromePdfRenderer();
string htmlContent = """
<h1>Order Confirmation</h1>
<p>Thank you for your purchase.</p>
<table>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget A</td><td>2</td><td>$19.99</td></tr>
<tr><td>Widget B</td><td>1</td><td>$59.99</td></tr>
</table>
<p><strong>Order Total: $99.97</strong></p>
""";
PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlContent);
// pdf.BinaryData holds the complete PDF as a byte array
byte[] pdfBytes = pdf.BinaryData;
Console.WriteLine($"PDF generated: {pdfBytes.Length} bytes");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
Dim htmlContent As String = "
<h1>Order Confirmation</h1>
<p>Thank you for your purchase.</p>
<table>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget A</td><td>2</td><td>$19.99</td></tr>
<tr><td>Widget B</td><td>1</td><td>$59.99</td></tr>
</table>
<p><strong>Order Total: $99.97</strong></p>
"
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
' pdf.BinaryData holds the complete PDF as a byte array
Dim pdfBytes As Byte() = pdf.BinaryData
Console.WriteLine($"PDF generated: {pdfBytes.Length} bytes")
RenderHtmlAsPdf yöntemi, Google Chrome'u çalıştıran aynı Chromium motorunu kullanarak HTML'yi çözümler, bu nedenle tablolar, CSS Grid, Flexbox ve yerleştirilmiş yazı tipleri tarayıcıda olduğu gibi tam olarak oluşturulurlar. Sonuç, tam PDF ikili verisini hiçbir disk okuma ve yazma olmadan döndüren BinaryData özelliğine sahip bir PdfDocument'dir. Harici resimler veya stil sayfalarını çekmek için belgeler, göreli kaynak URL'lerinin çözülmesi gereken yeri IronPDF'e bildirmek için isteğe bağlı BasePath parametresini kullanır - bu, HTML dosyasını PDF'e nasıl dönüştürme sayfasında ayrıntılı olarak ele alınmıştır.
Sayfa Düzeni ve Özel Başlıklar Ayarlama
PDF'yi eklemeden önce, kenar boşluklarını, üstbilgiyi veya altbilgiyi yapılandırmak isteyebilirsiniz. Tüm düzen seçenekleri RenderingOptions özelliğinde yer alır:
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 15;
renderer.RenderingOptions.MarginBottom = 15;
renderer.RenderingOptions.MarginLeft = 12;
renderer.RenderingOptions.MarginRight = 12;
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:9pt;color:#666;text-align:right;'>Monthly Report</div>",
DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:8pt;text-align:center;'>{page} of {total-pages}</div>"
};
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Monthly Summary</h1><p>See attached data.</p>");
byte[] pdfBytes = pdf.BinaryData;
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.MarginTop = 15;
renderer.RenderingOptions.MarginBottom = 15;
renderer.RenderingOptions.MarginLeft = 12;
renderer.RenderingOptions.MarginRight = 12;
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:9pt;color:#666;text-align:right;'>Monthly Report</div>",
DrawDividerLine = true
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='font-size:8pt;text-align:center;'>{page} of {total-pages}</div>"
};
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Monthly Summary</h1><p>See attached data.</p>");
byte[] pdfBytes = pdf.BinaryData;
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.MarginTop = 15
renderer.RenderingOptions.MarginBottom = 15
renderer.RenderingOptions.MarginLeft = 12
renderer.RenderingOptions.MarginRight = 12
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='font-size:9pt;color:#666;text-align:right;'>Monthly Report</div>",
.DrawDividerLine = True
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='font-size:8pt;text-align:center;'>{page} of {total-pages}</div>"
}
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Monthly Summary</h1><p>See attached data.</p>")
Dim pdfBytes As Byte() = pdf.BinaryData
Kenarlıklar, milimetre cinsindendir. {page} ve {total-pages} belirteçleri, oluşturma sırasında değiştirilir. HTML dizgesinden PDF'e nasıl sayfası, tüm oluşturma seçeneklerini kapsar. Belgeleri eklemeden önce filigran ekleyebilir veya metin ve resim damgası yapabilirsiniz.
MailKit ile Bir PDF'yi E-postaya Nasıl Eklersiniz?
MailKit, bir MIME mesaj ağacını doğrudan oluşturur ve bu size içerik türü, kodlama ve ek meta verisi üzerinde tam kontrol sağlar. BodyBuilder yardımcı sınıfı, bir veya daha fazla dosya ekiyle birlikte bir metin veya HTML gövdesinin genel durumunu basitleştirir.
using IronPdf;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
// Step 1 -- generate the PDF in memory
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Generated automatically.</p>");
// Step 2 -- build the email message
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Reports Service", "reports@example.com"));
message.To.Add(new MailboxAddress("Alice Smith", "alice@example.com"));
message.Subject = "Your Monthly Report is Ready";
var builder = new BodyBuilder();
builder.TextBody = "Hello Alice,\n\nPlease find your monthly report attached.\n\nRegards,\nReports Service";
builder.HtmlBody = "<p>Hello Alice,</p><p>Please find your monthly report attached.</p>";
// Add the in-memory PDF as an attachment
builder.Attachments.Add("MonthlyReport.pdf", pdf.BinaryData, new ContentType("application", "pdf"));
message.Body = builder.ToMessageBody();
// Step 3 -- send via SMTP with TLS
using var client = new SmtpClient();
await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("username", "app-password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
using IronPdf;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
// Step 1 -- generate the PDF in memory
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Generated automatically.</p>");
// Step 2 -- build the email message
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Reports Service", "reports@example.com"));
message.To.Add(new MailboxAddress("Alice Smith", "alice@example.com"));
message.Subject = "Your Monthly Report is Ready";
var builder = new BodyBuilder();
builder.TextBody = "Hello Alice,\n\nPlease find your monthly report attached.\n\nRegards,\nReports Service";
builder.HtmlBody = "<p>Hello Alice,</p><p>Please find your monthly report attached.</p>";
// Add the in-memory PDF as an attachment
builder.Attachments.Add("MonthlyReport.pdf", pdf.BinaryData, new ContentType("application", "pdf"));
message.Body = builder.ToMessageBody();
// Step 3 -- send via SMTP with TLS
using var client = new SmtpClient();
await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("username", "app-password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
Imports IronPdf
Imports MailKit.Net.Smtp
Imports MailKit.Security
Imports MimeKit
' Step 1 -- generate the PDF in memory
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Monthly Report</h1><p>Generated automatically.</p>")
' Step 2 -- build the email message
Dim message As New MimeMessage()
message.From.Add(New MailboxAddress("Reports Service", "reports@example.com"))
message.To.Add(New MailboxAddress("Alice Smith", "alice@example.com"))
message.Subject = "Your Monthly Report is Ready"
Dim builder As New BodyBuilder()
builder.TextBody = "Hello Alice," & vbCrLf & vbCrLf & "Please find your monthly report attached." & vbCrLf & vbCrLf & "Regards," & vbCrLf & "Reports Service"
builder.HtmlBody = "<p>Hello Alice,</p><p>Please find your monthly report attached.</p>"
' Add the in-memory PDF as an attachment
builder.Attachments.Add("MonthlyReport.pdf", pdf.BinaryData, New ContentType("application", "pdf"))
message.Body = builder.ToMessageBody()
' Step 3 -- send via SMTP with TLS
Using client As New SmtpClient()
Await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls)
Await client.AuthenticateAsync("username", "app-password")
Await client.SendAsync(message)
Await client.DisconnectAsync(True)
End Using
builder.Attachments.Add üç bağımsız değişken alır: alıcının e-posta istemcisinde gördüğü dosya adı, pdf.BinaryData'dan gelen ham bayt dizisi ve MIME türünü application/pdf olarak belirten bir ContentType örneği. Asenkron SMTP yöntemleri, ağ işlemi tamamlanırken çağıran iş parçacığını serbest tutar - bu, onlarca eş zamanlı isteği işleyen ASP.NET Core denetleyicilerinde kritik bir durumdur.
SecureSocketOptions.StartTls, 587 numaralı bağlantı noktasında SMTP sunucusuyla şifrelenmiş bir kanal müzakere eder. Gmail için, hesap şifreniz yerine bir Uygulama Parolası kullanın: Google Hesap Güvenliği > Uygulama Parolaları altında bir tane oluşturun ve ardından AuthenticateAsync'ye iletin. Microsoft 365 için, kiracınız temel kimlik doğrulamayı devre dışı bıraktıysa, MailKit'in SaslMechanismOAuth2 sınıfı üzerinden OAuth 2.0 kimlik doğrulaması yapılandırın.
Birden Fazla Alıcıya Gönderme
Aynı e-posta üzerinde birden fazla kişiye kopyalamak için, To, Cc veya Bcc koleksiyonlarına, SendAsync'yı çağırmadan önce adresler ekleyin:
message.To.Add(new MailboxAddress("Alice Smith", "alice@example.com"));
message.To.Add(new MailboxAddress("Bob Jones", "bob@example.com"));
message.Cc.Add(new MailboxAddress("Carol Manager", "carol@example.com"));
message.To.Add(new MailboxAddress("Alice Smith", "alice@example.com"));
message.To.Add(new MailboxAddress("Bob Jones", "bob@example.com"));
message.Cc.Add(new MailboxAddress("Carol Manager", "carol@example.com"));
message.To.Add(New MailboxAddress("Alice Smith", "alice@example.com"))
message.To.Add(New MailboxAddress("Bob Jones", "bob@example.com"))
message.Cc.Add(New MailboxAddress("Carol Manager", "carol@example.com"))
Tek bir SendAsync çağrısı mesajı tüm adreslere teslim eder. MailKit, bir SMTP oturumunda RCPT TO komutlarını gruplar, bu yüzden birden fazla alıcı için performans kaybı yoktur.
Alternatif Olarak System.Net.Mail Nasıl Kullanılır?
Daha eski .NET sürümlerini hedefleyen projeler veya üçüncü taraf bir NuGet paketinin eklenmesinin izin verilmediği projeler için yerleşik System.Net.Mail ad alanı, temel SMTP teslimatını gerçekleştirir. Microsoft artık yeni geliştirme için bunu önermiyor, ancak ekstra bağımlılıklar olmadan yaygın kullanım senaryolarını kapsıyor.
using IronPdf;
using System.Net;
using System.Net.Mail;
// Generate the PDF
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Invoice #1001</h1><p>Amount due: $350.00</p>");
// Build the mail message
using var message = new MailMessage("invoices@example.com", "customer@example.com");
message.Subject = "Invoice #1001 Attached";
message.Body = "Your invoice is attached to this email. Please remit payment within 30 days.";
message.IsBodyHtml = false;
// Wrap the byte array in a MemoryStream for the Attachment constructor
var stream = new MemoryStream(pdf.BinaryData);
message.Attachments.Add(new Attachment(stream, "Invoice-1001.pdf", "application/pdf"));
// Send via SMTP
using var client = new SmtpClient("smtp.example.com", 587)
{
Credentials = new NetworkCredential("username", "password"),
EnableSsl = true
};
await client.SendMailAsync(message);
using IronPdf;
using System.Net;
using System.Net.Mail;
// Generate the PDF
var renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Invoice #1001</h1><p>Amount due: $350.00</p>");
// Build the mail message
using var message = new MailMessage("invoices@example.com", "customer@example.com");
message.Subject = "Invoice #1001 Attached";
message.Body = "Your invoice is attached to this email. Please remit payment within 30 days.";
message.IsBodyHtml = false;
// Wrap the byte array in a MemoryStream for the Attachment constructor
var stream = new MemoryStream(pdf.BinaryData);
message.Attachments.Add(new Attachment(stream, "Invoice-1001.pdf", "application/pdf"));
// Send via SMTP
using var client = new SmtpClient("smtp.example.com", 587)
{
Credentials = new NetworkCredential("username", "password"),
EnableSsl = true
};
await client.SendMailAsync(message);
Imports IronPdf
Imports System.Net
Imports System.Net.Mail
Imports System.IO
' Generate the PDF
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Invoice #1001</h1><p>Amount due: $350.00</p>")
' Build the mail message
Using message As New MailMessage("invoices@example.com", "customer@example.com")
message.Subject = "Invoice #1001 Attached"
message.Body = "Your invoice is attached to this email. Please remit payment within 30 days."
message.IsBodyHtml = False
' Wrap the byte array in a MemoryStream for the Attachment constructor
Dim stream As New MemoryStream(pdf.BinaryData)
message.Attachments.Add(New Attachment(stream, "Invoice-1001.pdf", "application/pdf"))
' Send via SMTP
Using client As New SmtpClient("smtp.example.com", 587)
client.Credentials = New NetworkCredential("username", "password")
client.EnableSsl = True
Await client.SendMailAsync(message)
End Using
End Using
MailKit ile karşılaştırıldığında, System.Net.Mail.Attachment doğrudan bir bayt dizisini kabul etmez - önce pdf.BinaryData'yi bir MemoryStream içinde sarmanız gerekir. Hem MailMessage hem de SmtpClient, SMTP bağlantısını kapatan ve gönderimden sonra altta yatan akışı temizleyen using ifadeleri içinde sarılır. Eğer using'yi MailMessage üzerinde belirtmezseniz, bazı çalışma zamanlarında gönderim tamamlanmadan önce ek akışı kapatılabilir.
MailKit ve System.Net.Mail Arasında Seçim Yapma
| Özellik | MailKit | System.Net.Mail |
|---|---|---|
| OAuth 2.0 kimlik doğrulama | Evet | Hayır |
| IMAP / POP3 desteği | Evet | Hayır |
| Öncelikli Asenkron API | Evet | Kısmi |
| Microsoft önerisi | Önerilen | Eski |
| Ek NuGet paketi | Gerekli | Gerekli değildir |
| Karmaşık MIME oluşturma | Tam destek | Temel |
Yeni bir proje için özellikle SMTP sunucusunun OAuth gerektirdiği durumlarda veya cevapları okumak için IMAP'e ihtiyacınız varsa MailKit'i seçin. Kod tabanınız zaten ona bağımlı olduğunda ve geçiş maliyeti gerekçelendirilemeyecek olduğunda System.Net.Mail kullanın.
Bu Deseni Gerçek İş Akışlarına Nasıl Uygularsınız?
Bellek içi PDF'den e-postaya kalıbı, çoğu iş uygulamasını yönlendiren belge otomasyonu senaryolarına doğrudan uygulanır.
Fatura Otomasyonu
Bir e-ticaret sipariş yöneticisi, ödeme alındıktan hemen sonra bir fatura PDF'si oluşturur. OrderConfirmed olayı, sipariş verilerinden doldurulmuş bir Razor şablonlu HTML dizgesiyle RenderHtmlAsPdf'yi çağıran ve ardından sonucu müşterinin e-posta adresine gönderen bir yöntem tetikler. PDF asla dosya sistemine dokunmadığı için temizleyecek artık dosyalar, paylaşılan geçici bir dizinde yarış koşulları ve konteynerleştirilmiş dağıtımlarda izin sorunları yoktur. Daha fazla Razor görünümlerinden HTML oluşturma hakkında bilgi için, ASP.NET Core PDF oluşturma kılavuzuna bakın.
Zamanlanmış Rapor Dağıtımı
IHostedService ile planlanan bir arka plan hizmeti, her Pazartesi saat 06:00'da haftalık bir analiz özeti oluşturur. Veritabanını sorgular, bir HTML rapor dizesi oluşturur, bunu IronPDF ile işler ve MailKit kullanarak bir dağıtım listesine gönderir. Tüm işlem bir asenkron iş akışı olarak çalışır, bu nedenle SMTP el sıkışması sırasında bir iş parçacığı havuzu iş parçacığını tutmaz. Azure'da barındırılan iş yükleri için, Azure PDF oluşturucu kılavuzu, IronPDF'i Azure App Service ve Azure Functions içine nasıl dağıtacağınızı açıklar.
ASP.NET Core'da Fiş Oluşturma
ASP.NET Core minimal API veya denetleyici eyleminde, bir POST uç noktası bir ödeme yükü alır, bir makbuz PDF'si oluşturur ve eşzamanlı olarak e-posta gönderirken HTTP 200 döner. E-posta gönderme mantığını bir arka plan Task içinde tutun, böylece HTTP yanıtı hemen müşteriye döner:
app.MapPost("/checkout", async (CheckoutRequest req, IEmailService emailService) =>
{
var renderer = new ChromePdfRenderer();
PdfDocument receipt = renderer.RenderHtmlAsPdf(BuildReceiptHtml(req));
// Fire and forget -- do not await so the HTTP response is immediate
_ = emailService.SendReceiptAsync(req.CustomerEmail, receipt.BinaryData);
return Results.Ok(new { message = "Order confirmed." });
});
app.MapPost("/checkout", async (CheckoutRequest req, IEmailService emailService) =>
{
var renderer = new ChromePdfRenderer();
PdfDocument receipt = renderer.RenderHtmlAsPdf(BuildReceiptHtml(req));
// Fire and forget -- do not await so the HTTP response is immediate
_ = emailService.SendReceiptAsync(req.CustomerEmail, receipt.BinaryData);
return Results.Ok(new { message = "Order confirmed." });
});
Imports System.Threading.Tasks
app.MapPost("/checkout", Async Function(req As CheckoutRequest, emailService As IEmailService) As Task(Of IResult)
Dim renderer As New ChromePdfRenderer()
Dim receipt As PdfDocument = renderer.RenderHtmlAsPdf(BuildReceiptHtml(req))
' Fire and forget -- do not await so the HTTP response is immediate
_ = emailService.SendReceiptAsync(req.CustomerEmail, receipt.BinaryData)
Return Results.Ok(New With {.message = "Order confirmed."})
End Function)
Bu, SMTP sunucusu yavaş olsa bile API yanıt süresini 100 ms'nin altında tutar. emailService, MailKit SmtpClient'i saran alan veya geçici bir hizmet olarak kaydedilir.
Hataları ve Tekrar Denemeleri Nasıl Yönetiyorsunuz?
Ağ işlemleri başarısız oluyor. SMTP sunucuları geçici olarak kullanılamıyor, kimlik doğrulama jetonları süresi doluyor ve ek boyutu sınırları sağlayıcıya göre değişiklik gösteriyor. Başlangıçtan itibaren e-posta gönderim yoluna dayanıklılık ekleyin.
MailKit gönderme mantığını bir try/catch içine alarak başarısızlıkları kalıcı bir kuyruğa kaydedin, böylece tekrar denenebilir:
using IronPdf;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using Microsoft.Extensions.Logging;
async Task SendPdfEmailWithRetryAsync(
byte[] pdfBytes,
string recipientEmail,
string subject,
ILogger logger,
int maxAttempts = 3)
{
for (int attempt = 1; attempt <= maxAttempts; attempt++)
{
try
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Mailer", "mailer@example.com"));
message.To.Add(MailboxAddress.Parse(recipientEmail));
message.Subject = subject;
var builder = new BodyBuilder { TextBody = "Your document is attached." };
builder.Attachments.Add("document.pdf", pdfBytes, new ContentType("application", "pdf"));
message.Body = builder.ToMessageBody();
using var smtpClient = new SmtpClient();
await smtpClient.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls);
await smtpClient.AuthenticateAsync("user", "pass");
await smtpClient.SendAsync(message);
await smtpClient.DisconnectAsync(true);
logger.LogInformation("Email sent to {Email} on attempt {Attempt}", recipientEmail, attempt);
return;
}
catch (Exception ex) when (attempt < maxAttempts)
{
logger.LogWarning(ex, "Send attempt {Attempt} failed. Retrying...", attempt);
await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
}
}
}
using IronPdf;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using Microsoft.Extensions.Logging;
async Task SendPdfEmailWithRetryAsync(
byte[] pdfBytes,
string recipientEmail,
string subject,
ILogger logger,
int maxAttempts = 3)
{
for (int attempt = 1; attempt <= maxAttempts; attempt++)
{
try
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Mailer", "mailer@example.com"));
message.To.Add(MailboxAddress.Parse(recipientEmail));
message.Subject = subject;
var builder = new BodyBuilder { TextBody = "Your document is attached." };
builder.Attachments.Add("document.pdf", pdfBytes, new ContentType("application", "pdf"));
message.Body = builder.ToMessageBody();
using var smtpClient = new SmtpClient();
await smtpClient.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls);
await smtpClient.AuthenticateAsync("user", "pass");
await smtpClient.SendAsync(message);
await smtpClient.DisconnectAsync(true);
logger.LogInformation("Email sent to {Email} on attempt {Attempt}", recipientEmail, attempt);
return;
}
catch (Exception ex) when (attempt < maxAttempts)
{
logger.LogWarning(ex, "Send attempt {Attempt} failed. Retrying...", attempt);
await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
}
}
}
Imports IronPdf
Imports MailKit.Net.Smtp
Imports MailKit.Security
Imports MimeKit
Imports Microsoft.Extensions.Logging
Public Async Function SendPdfEmailWithRetryAsync(
pdfBytes As Byte(),
recipientEmail As String,
subject As String,
logger As ILogger,
Optional maxAttempts As Integer = 3) As Task
For attempt As Integer = 1 To maxAttempts
Try
Dim message = New MimeMessage()
message.From.Add(New MailboxAddress("Mailer", "mailer@example.com"))
message.To.Add(MailboxAddress.Parse(recipientEmail))
message.Subject = subject
Dim builder = New BodyBuilder With {
.TextBody = "Your document is attached."
}
builder.Attachments.Add("document.pdf", pdfBytes, New ContentType("application", "pdf"))
message.Body = builder.ToMessageBody()
Using smtpClient = New SmtpClient()
Await smtpClient.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls)
Await smtpClient.AuthenticateAsync("user", "pass")
Await smtpClient.SendAsync(message)
Await smtpClient.DisconnectAsync(True)
End Using
logger.LogInformation("Email sent to {Email} on attempt {Attempt}", recipientEmail, attempt)
Return
Catch ex As Exception When attempt < maxAttempts
logger.LogWarning(ex, "Send attempt {Attempt} failed. Retrying...", attempt)
Await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)))
End Try
Next
End Function
Üstel geri çekilme -- ilk hatadan sonra 2 saniye, ikinci hatadan sonra 4 saniye -- aşırı yüklenmiş bir SMTP sunucusuna yüklenmeyi önler. Üretim uygulamalarında, başarısızlıkların uygulama yeniden başlatmalarından etkilenmemesi için yeniden deneme döngüsünü bir mesaj kuyruğu (Azure Service Bus, RabbitMQ veya AWS SQS) ile değiştirin.
IronPDF, HTML içeriği oluşturulamazsa bir PdfException da ortaya atar.
Hata mesajının spesifik olması için bunu SMTP istisnalarından ayrı olarak yakalayın:
PdfDocument pdf;
try
{
pdf = renderer.RenderHtmlAsPdf(htmlContent);
}
catch (IronPdf.Exceptions.PdfException ex)
{
logger.LogError(ex, "PDF rendering failed");
throw;
}
PdfDocument pdf;
try
{
pdf = renderer.RenderHtmlAsPdf(htmlContent);
}
catch (IronPdf.Exceptions.PdfException ex)
{
logger.LogError(ex, "PDF rendering failed");
throw;
}
Imports IronPdf.Exceptions
Dim pdf As PdfDocument
Try
pdf = renderer.RenderHtmlAsPdf(htmlContent)
Catch ex As PdfException
logger.LogError(ex, "PDF rendering failed")
Throw
End Try
Çizim hatalarını teslimat hatalarından ayırmak hata ayıklamayı daha hızlı hale getirir. Otomatik belge işleme hatalarını daha geniş bir perspektiften ele almak için, PDF oluşturma için 5 adımlık rehber doğrulama desenlerini ayrıntılı olarak ele alır.
Ek Boyutunu Sağlayıcı Limitleri Altında Nasıl Tutabilirsiniz?
Çoğu ticari e-posta sağlayıcısı, maksimum ek boyutunu zorunlu kılar. Gmail, bireysel ekleri 25 MB ile sınırlar; Microsoft 365, standart posta kutuları için varsayılan olarak 20 MB kullanır. Gömülü resimler içeren yoğun bir şekilde stil verilmiş HTML raporu, bu sınırları beklenmedik şekilde aşabilir.
Sınırlar içinde kalmaya yardımcı olan üç teknik:
Görüntüleri işleme öncesi sıkıştırın. Satıriçi görüntüler, sıkıştırılmamış PNG yerine sıkıştırılmış JPEG veya WebP kullanılmalıdır. 600 dpi PNG logounun PDF'ye eklenmesi birkaç megabayt artırabilir; 85% kalitede bir JPEG, aynı görsel sonuç için tipik olarak 200 KB'nin altında olur.
IronPDF'in sıkıştırma ayarlarını kullanın. PdfDocument.CompressImages metodu, yerleşik bitmap'lerin çözünürlüğünü oluşturma sonrasında azaltır. Bunu BinaryData okumadan önce çağırın:
pdf.CompressImages(60); // quality 0-100
byte[] compressedPdfBytes = pdf.BinaryData;
pdf.CompressImages(60); // quality 0-100
byte[] compressedPdfBytes = pdf.BinaryData;
pdf.CompressImages(60) ' quality 0-100
Dim compressedPdfBytes As Byte() = pdf.BinaryData
Büyük raporları birden fazla e-posta olarak bölün. Bir rapor sıkıştırmadan sonra bile sağlayıcı limitini aşıyorsa, her bölüm için ayrı bir PDF oluşturun ve her birini ayrı bir e-posta ile gönderin. PDF bölme ve birleştirme nasıl sayfası, sayfa aralığını CopyPages kullanarak bir PdfDocument'yi bölme yöntemini gösterir.
SMTP boyut limitleri için dış referanslar: Gmail ek sınırlamaları, Microsoft 365 mesaj boyutu limitleri.
Sonraki Adımlarınız Neler?
Artık bellekte IronPDF ile bir PDF oluşturma ve bunu MailKit veya System.Net.Mail kullanarak e-posta eki olarak gönderme için çalışan bir şablonunuz var. Bellekte uygulanan yaklaşım, disk okuyup yazma işlemlerini ortadan kaldırır, konteynerleştirilmiş dağıtımları basitleştirir ve geçici dosya temizleme gerektirmeden yüksek-throughput senaryolarına ölçeklenir.
Entegrasyonu derinleştirmek için:
- Kafa, altbilgi ve sayfa numaralandırması ile karmaşık belge düzenlerini öğrenmek için HTML to PDF tutorial'ı okuyun.
- Özel PDF işleme seçeneklerini keşfedin ve kenar boşluklarını, sayfa boyutunu ve JavaScript yürütme zaman aşımını kontrol edin. Eklenmeden önce oluşturulmuş PDF'e dijital imza ekleyin, alıcılara tahrifata karşı belirgin belgeler sağlayın.
- Ölçekli sunucusuz belge oluşturma için Azure Functions veya App Service'e dağıtın.
- Üretim lisansına taahhütte bulunmadan önce tam özellik setini test etmek için IronPDF'i ücretsiz deneyin veya dağıtım fiyatlandırması için lisanslama seçeneklerini gözden geçirin.
Sıkça Sorulan Sorular
C#'da oluşturulan bir PDF'yi e-posta eki olarak nasıl gönderebilirim?
IronPDF'yi kullanarak, PDF oluşturma özelliklerini .NET'in e-posta gönderme özellikleriyle entegre ederek oluşturulan PDF dosyalarını e-posta ekleri olarak gönderebilirsiniz.
.NET uygulamalarında PDF dosyalarını e-posta ile göndermenin faydaları nelerdir?
.NET uygulamalarında PDF dosyalarını e-posta yoluyla göndermek, belge teslimatını otomatikleştirir, iş süreçlerini hızlandırır ve müşteri iletişimini geliştirir.
IronPDF, e-posta ekleri için PDF'lerde dinamik içerik yönetebilir mi?
Evet, IronPDF, özelleştirilmiş PDF'leri e-posta ekleri olarak göndermek için gereken dinamik PDF içeriğini oluşturur, bu nedenle olay tabanlı uygulamalar için uygundur.
IronPDF ile e-posta gönderme yöntemlerinde hangi parametreler yaygın olarak kullanılır?
Yaygın parametreler, e-posta konusu, gönderen bilgileri ve etkin yanıtlar gibi ekleri dahil eder, bu da olay tabanlı uygulamalarda etkili işlemeyi sağlar.
IronPDF belge teslimini otomatikleştirme için uygun mu?
IronPDF, güvenilir PDF oluşturma sağlayarak ve C#'ın e-posta gönderme yetenekleriyle entegre edildiği için belge teslimini otomatikleştirmek için uygundur.
IronPDF ile PDF e-posta gönderimi zamanlanabilir mi?
Evet, IronPDF belirli zamanlarda PDF e-postaları göndermeyi otomatikleştirmek için zamanlanmış görevlere entegre edilebilir, bu da iş akışı verimliliğini artırır.
IronPDF, e-posta ekleri için farklı veri kaynaklarından PDF'ler oluşturmayı destekliyor mu?
IronPDF, çeşitli veri kaynaklarından PDF'ler oluşturarak geliştiricilerin e-posta ekleri için detaylı belgeler hazırlamasına olanak tanır.
IronPDF müşteri iletişimini nasıl geliştirir?
IronPDF, detaylı PDF belgelerinin ek olarak oluşturulup gönderilmesine olanak tanıyarak müşterilerle e-posta iletişiminin profesyonelliğini ve netliğini artırır.
IronPDF, faturalar ve raporlar gibi belgeleri PDF ekleri olarak göndermek için kullanılabilir mi?
Evet, IronPDF, çeşitli iş ihtiyaçlarına uygun olarak faturalar, raporlar ve diğer belgeleri PDF ekleri olarak oluşturmak ve göndermek için uygundur.
IronPDF, iş süreçlerinin iyileştirilmesinde ne rol oynar?
IronPDF, PDF belgelerinin oluşturulması ve dağıtılmasını sağlamak suretiyle iş süreçlerini geliştirir, manuel müdahaleyi ve hataları azaltır.

