C#'da Bir E-posta Eki Olarak PDF Dosyası Nasıl Gönderilir
Doküman dağıtim otomasyonu, neredeyse her is uygulamasi icin cikan bir gerekliliktir. Bir siparis verildiginde, bir fatura musteriye saniyeler icinde ulasmalidir. Bir rapor gece boyunca calistiginda, paydaslar ofise gelmeden once posta kutularinda onu bekler. En basit ve en yaygin olarak desteklenen dağıtim formati, bir e-posta ekinde gonderilen bir PDF'dir. Bu kılavuz, IronPDF ile hafızada bir PDF belgesi oluşturarak ve ardından MailKit veya yerleşik System.Net.Mail namespace kullanarak e-posta eki olarak göndererek C#'ta uçtan uca iş akışını tamamıyla gözden geçirir; üstelik diske tek bir bayt bile yazmadan.
Gerekli Paketleri Nasıl Yüklersiniz?
Bu iş akışını güçlendiren iki paket vardır: bir PDF oluşturma kitaplığı ve bir e-posta gönderme kitaplığı. Hem Visual Studio'daki Paket Yoneticisi Konsolundan hem de .NET CLI aracılığıyla yukleyin.
Install-Package IronPdf
dotnet add package IronPdf
Install-Package MailKit
dotnet add package MailKit
Install-Package IronPdf
dotnet add package IronPdf
Install-Package MailKit
dotnet add package MailKit
IronPDF, HTML, CSS ve JavaScript'i pikselle mükemmel PDF dokümanlarina dönüştüren Chromium tabanli bir render motoru getiriyor. Windows, Linux ve macOS'ta calisir, bu da ayni kodun bir ASP.NET Core web API'sinde, bir arka plan servisinde veya bir Azure Fonksiyonunda calistigi anlamına gelir. MailKit, Microsoft'un yeni butun .NET e-posta geliştirmeleri icin tavsiye ettigi kutuphanedir -- SMTP, IMAP, POP3, OAuth 2.0 ve tam MIME olusuturmeyi destekler. MailKit kaynak ve dokümantasyon GitHub'da mevcuttur.
Memory'de PDF Dokümani Nasıl Oluşturursunuz?
ChromePdfRenderer sınıfı, HTML'den PDF'ye dönüşüm için giriş noktasıdır. RenderHtmlAsPdf'a bir HTML dizesi geçin ve tamamen hafızada yaşayan bir PdfDocument nesnesi elde edin. Ham baytları BinaryData özelliği aracılığıyla erişin -- bu bayt dizisi e-posta eki API'lerinin tam da 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 metodu, HTML'yi Google Chrome'u çalıştıran aynı Chromium motorunu kullanarak işler, bu nedenle tablolar, CSS Grid, Flexbox ve gömülü fontlar bir tarayıcıda olduğu gibi tam olarak işlenir. Sonuç, BinaryData özelliğinin tam PDF ikili verisini herhangi bir disk okuma ve yazma olmadan döndürdüğü bir PdfDocument'dir. Dış resimler veya stil dosyalarını çeken belgeler için, göreceli kaynak URL'lerini IronPDF'in nasıl çözeceğini söylemek amacıyla, isteğe bağlı BasePath parametresini kullanın -- bu, HTML dosyası PDF'ye nasıl yapılır sayfasında detaylandırılmıştır.
Sayfa Düzeni ve Özel Üstbilgileri Ayarlama
PDF'i eklemeden once belki marginleri, üstbilgileri veya altbilgileri konfigure etmek isteyebilirsiniz. Tüm yerleşim seçenekleri RenderingOptions özelliğinde bulunur:
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
Marginler milimetre cinsindendir. {page} ve {total-pages} tokenleri render zamanında değiştirilir. HTML dizesinden PDF'ye nasıl yapılır sayfası render seçeneklerinin tam setini kapsar. Ayrıca, oluşturulan dokümana eklemeden önce filigranlar ekleyebilir veya metin ve resimler damgalayabilirsiniz.
MailKit ile PDF'yi E-postaya Nasıl Eklersiniz?
MailKit içerik tipi, kodloma ve ek metadata'u uzerinde tam kontrol vererek bir MIME mesaj ağacını doğrudan oluşturur. BodyBuilder yardımcı sınıfı, bir veya daha fazla dosya eki olan metin veya HTML metninin yaygın 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 üç argüman kabul eder: 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 ContentType örneği. Async SMTP metodları, ağ işletimi tamamlanırken çağıran iş parçacığını serbest bırakır -- bu, onlarca eş zamanlı isteği işleyen ASP.NET Core kontrolörleri açısından kritiktir.
SecureSocketOptions.StartTls, 587 portundaki SMTP sunucusu ile şifreli bir kanal müzakere eder. Gmail için, hesap şifreniz yerine bir Uygulama Şifresi kullanın: Google Hesabı Güvenliği > Uygulama Şifreleri altında bir tane oluşturun ve ardından AuthenticateAsync'ya iletin. Microsoft 365 için, tenant'ınızın temel kimlik doğrulamayı devre dışı bıraktıysa, MailKit'in SaslMechanismOAuth2 sınıfı aracılığıyla OAuth 2.0 kimlik doğrulamasını yapılandırın.
Birden Fazla Alıcıya Gönderim
Aynı e-posta üzerinde birden fazla kişiye kopya göndermek için, SendAsync'yi çağırmadan önce adresleri To, Cc veya Bcc koleksiyonlarına 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ı birleştirir, bu yüzden coklu alıcılar icin herhangi bir performans cezasi yoktur.
System.Net.Mail'i Alternatif Olarak Nasıl Kullanırsınız?
Eski .NET sürümlerini hedefleyen projeler veya üçüncü taraf bir NuGet paketinin eklenmesinin izin verilmediği projelerde, yerleşik System.Net.Mail namespace temel SMTP teslimini işler. Microsoft artık yeni geliştirmeler için bunu önermemektedir ancak ek bir bağımlılığa genel kullanılan durumlari kapsar.
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'e kıyasla ana fark System.Net.Mail.Attachment doğrudan bir bayt dizisini kabul etmez -- önce pdf.BinaryData'yı bir MemoryStream içinde sarmanız gerekir. Hem MailMessage hem de SmtpClient, gönderimden sonra SMTP bağlantısını kapatan ve alttaki akışı temizleyen using ifadelerinin içine sarılır. Eğer using'yi MailMessage üzerinde atlarsanız, bazı çalışma zamanlarında gönderim tamamlanmadan önce ek akışı devre dışı bırakılabilir.
MailKit ve System.Net.Mail Arasinda Secim Yapma
| Özellik | MailKit | System.Net.Mail |
|---|---|---|
| OAuth 2.0 yetkilendirmesi | Evet | Hayır |
| IMAP / POP3 desteği | Evet | Hayır |
| Asenkron öncelikli API | Evet | Kısmi |
| Microsoft tavsiyesi | Tavsiye Edildi | Eski |
| Ek NuGet paketi | Gerekli | Gerekli değil |
| Karmaşık MIME yapısı | Tam destek | Temel |
Herhangi bir yeni proje icin MailKit'i secin, özellikle SMTP sunucusu OAuth gerektiriyorsa veya yanıtları okumak icin IMAP'e ihtiyaçınız varsa. Kod tabanı zaten buna bağlıysa ve geçiş maliyeti haklı çıkarılamıyorsa System.Net.Mail kullanın.
Bu Deseni Gerçek İş Akışlarına Nasıl Uygularsınız?
Bellekteki PDF'den e-postaya deseni, çogu iş uygulamasını yönlendiren doküman otomasyon senaryolarına doğrudan uygulanabilir.
Fatura Otomasyonu
Bir e-ticaret siparis işleyici, ödeme alındığında hemen bir fatura PDF'si oluşturur. OrderConfirmed olayı, sipariş verilerinden doldurulmuş bir Razor şablonlu HTML dizesi ile RenderHtmlAsPdf'yi çağıran bir yöntemi tetikler ve ardından sonucu müşterinin e-posta adresine gönderir. PDF dosya sistemiyle asla temas etmediği için, temizlenmesi gereken kalıntı dosyalar yoktur, ortak bir geçici dizin üzerinde yarış durumları yoktur ve konteynerli dağıtımlarda izin sorunları yaşanmaz. Razor görünümlerinden HTML renderlama hakkında daha fazla bilgi için, ASP.NET Core PDF oluşturma kılavuzuna bakın.
Planlanmış Rapor Dağıtımı
IHostedService ile planlanan bir arka plan hizmeti, her Pazartesi 06:00'da haftalık analiz özetini oluşturur. Veritabanını sorgular, bir HTML rapor dizisi oluşturur, IronPDF ile rendeder ve MailKit kullanarak bir dağıtım listesine gönderir. Tüm boru hattı async iş akışı olarak calisir, bu yüzden SMTP el sıkışması sırasında bir iş parçası havuzu iş parçacığı tutmaz. Azure üzerinde barindirilmis iş yukleri icin, Azure PDF oluşturma kılavuzu, IronPDF'un Azure App Service ve Azure Functions içinde nasıl yerleştirileceğini açıklar.
ASP.NET Core'da Fiş Oluşturma
Bir ASP.NET Core minimal API veya kontrolör eyleminde, bir POST son noktası bir ödemeyi alır, bir fiş PDF'si oluşturur ve e-posta iletimi sırasında bir HTTP 200 geri döner. E-posta gönderim 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 altında tutar. emailService, MailKit SmtpClient'yi saran kapsanan veya geçici bir hizmet olarak kaydedilir.
Hataları ve Tekrar Denemeleri Nasıl Yönetirsiniz?
Ağ işlemleri başarısız olur. SMTP sunucuları geçici olarak erişilebilir değildir, yetkilendirme jetonları süresi dolar ve ek boyut sınırları sağlayıcıya göre değişir. E-posta gönderim yolunda baştan itibaren dayanıklılığı kurun.
MailKit gönderim mantığını bir try/catch içine sarın ve yeniden denenmeleri için başarsızlıkları kalıcı bir kuyruğa kaydedin:
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 alma -- ilk başarısızlıktan sonra 2 saniye, ikincisinden sonra 4 -- aşırı yüklenmiş bir SMTP sunucusunu dövmeyi önler. Üretim uygulamalarında, yeniden deneme döngüsünü (Azure Service Bus, RabbitMQ veya AWS SQS) içeren bir mesaj kuyruğu ile değiştirin, böylece hata uygulama yeniden başlatmalarından kurtulur.
IronPDF, HTML içeriği render edilemezse bir PdfException da fırlatır. Bunu SMTP istisnalarindan ayrı olarak yakalayın, bu şekilde hata mesajı özeldir:
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
Render hatalarını teslim hatalarından ayırmak, hata ayıklamaları hızlandırır. Otomatik doküman boru hatlarındaki hata yönetimine geniş bir bakış için , 5 adımda PDF oluşturma kılavuzu doğrulama desenlerini ayrıntılı bir şekilde ele alır.
Ek Boyutunu Sağlayıcı Sınırlarının Altında Nasıl Tutarsınız?
Çoğu ticari e-posta sağlayıcısı maksimum ek boyutu uygular. Gmail bireysel ekleri 25 MB ile sinirlar; Microsoft 365, standart posta kutuları için varsayılan olarak 20 MB belirlemiştir. Ağır bir şekilde stillenmiş HTML raporu, gömülü resimlerle beklenmedik bir şekilde bu sınırları aşabilir.
Bu sınırlar içinde kalmak için üç teknik:
Render işleminden önce resimleri sıkıştırın. Satır içi resimler, sıkıştırılmış JPEG veya WebP kullanmalıdır; sıkıştırılmamış PNG yerine. 600 dpi bir PNG logosu PDF'ye birkaç megabayt ekleyebilir; aynı görsel sonuç için % 85 kalitede bir JPEG genellikle 200 KB'ın altındadır.
IronPDF'in sıkıştırma ayarlarını kullanın. PdfDocument.CompressImages metodu, render işlemi sonrası yerleştirilmiş bit eşlem çözünürlüğünü azaltır. BinaryData'yi okumanızdan ö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. Sıkıştırma işleminden sonra bile sağlayıcı sınırını aşarsa, her bölüme bir PDF oluşturun ve her birini ayrı bir e-postayla gönderin. PDF ayırma ve birleştirme nasıl yapılır sayfası, bir PdfDocument'yi sayfa aralığına göre CopyPages kullanarak nasıl böleceğinizi gösterir.
SMTP boyut sınırları için dış referanslar: Gmail ek sınırları, Microsoft 365 mesaj boyut sınırları.
Sıradaki Adımlarınız Neler?
Artık hafızada IronPDF ile bir PDF oluşturmak ve MailKit veya System.Net.Mail kullanarak e-posta eki olarak göndermek için çalışan bir şablonunuz var. Bellekteki yaklaşım, disk okuma ve yazmalarını ortadan kaldırır, kapsayıcılı dağıtımları basitleştirir ve geçici dosya temizliği gerektirmeden yüksek verimlilikli senaryoları ölçeklendirmeyi sağlar.
Entegrasyonu daha da derinleştirmek için:
- Başlıklara, altbilgilere ve sayfa numaralamaya sahip karmaşık belge düzenlerini öğrenmek için HTML to PDF eğitimini okuyun.
- Kenar boşluklarını, sayfa boyutunu ve JavaScript çalıştırma zaman aşımını kontrol etmek için özel PDF render seçeneklerini keşfedin.
- Alıcılara düzenlenemez belgeler sağlamak için, eklemeden önce oluşturulan PDF'ye dijital imza ekleyin.
- Sunucusuz ölçekte belge üretimi için Azure İşlevlerine veya Uygulama Hizmetine dağıtın.
- Üretim lisansına karar vermeden önce tüm özellik setini test etmek için IronPDF'yi ücretsiz deneyin veya dağıtım fiyatlarını incelemek için lisanslama seçeneklerini gözden geçirin.
Sıkça Sorulan Sorular
C# içinden oluşturulan bir PDF'i e-posta eki olarak nasıl gönderebilirim?
IronPDF kullanarak, onun PDF oluşturma yeteneklerini .NET'in e-posta gönderme özellikleri ile entegre ederek oluşturulan PDF dosyalarını e-posta eki olarak gönderebilirsiniz.
.NET uygulamalarında pdf dosyalarını e-posta ile göndermenin faydaları nelerdir?
.NET uygulamalarında pdf dosyalarını e-posta ile göndermek, belge teslimatını otomatikleştirerek iş akışlarını kolaylaştırır ve müşteri iletişimini geliştirir.
IronPDF, e-posta ekleri için PDF'lerde dinamik içeriği işleyebilir mi?
Evet, IronPDF dinamik olarak PDF içeriği üretir, bu da özelleştirilmiş pdf'leri e-posta eki olarak göndermenizi gerektiren olay odaklı uygulamalar için uygundur.
IronPDF ile e-posta gönderme yöntemlerinde yaygın olarak hangi parametreler kullanılır?
Yaygın parametreler arasında e-posta konusu, gönderenin bilgileri ve dinamik oluşturulan belgelerle çalışmanın verimli olmasını sağlayan EventArgs yer alır.
Belgelerin teslimatını otomatikleştirmek için IronPDF neden uygundur?
IronPDF, sağlam pdf oluşturma sağladığı ve C# e-posta gönderme yetenekleriyle entegre olduğu için belgelerin teslimatını otomatikleştirmek için uygundur.
IronPDF ile PDF e-posta gönderimini programlamak mümkün mü?
Evet, IronPDF belirli zamanlarda PDF e-postalarının otomatik olarak gönderilmesini programlamak için zamanlanmış görevlere entegre edilebilir, bu da iş akışı verimliliğini arttırır.
IronPDF, e-posta ekleri için çeşitli veri kaynaklarından PDF oluşturmayı destekliyor mu?
IronPDF, geliştiricilerin e-posta ekleri için ayrıntılı belgeler oluşturmasını sağlayarak, birden fazla veri kaynağından PDF oluşturmayı destekler.
IronPDF, müşterilerle olan e-posta iletişimini nasıl geliştirir?
IronPDF, ayrıntılı PDF belgelerinin ek olarak oluşturulmasına ve gönderilmesine izin vererek, müşterilerle e-posta iletişiminin profesyonelliğini ve netliğini artırır.
IronPDF, faturalar ve raporlar gibi PDF ekleri göndermek için kullanılabilir mi?
Evet, IronPDF, çeşitli iş ihtiyaçlarını karşılayarak, faturalar, raporlar ve diğer belgeleri PDF eki olarak oluşturmak ve göndermek için uygundur.
IronPDF iş akışlarını iyileştirmede nasıl bir rol oynar?
IronPDF, PDF belgelerinin oluşturulmasını ve dağıtımını sağlayarak, manuel müdahaleyi ve hataları azaltarak iş akışlarını iyileştirir.




