Zum Fußzeileninhalt springen
IRONPDF NUTZEN

Wie man ein PDF in ein Bild in .NET konvertiert

Die Automatisierung der Dokumentenzustellung ist eine Anforderung, die in nahezu jeder .NET -Anwendung für Geschäftsanwendungen auftaucht. Sobald eine Bestellung aufgegeben wird, muss dem Kunden innerhalb von Sekunden eine Rechnung zugestellt werden. Wenn ein Bericht über Nacht erstellt wird, erwarten die Beteiligten ihn in ihrem Posteingang, bevor sie im Büro eintreffen. Das einfachste und am weitesten verbreitete Format ist eine PDF-Datei, die als E-Mail-Anhang versendet wird. Diese Anleitung führt Sie durch den kompletten Workflow von Anfang bis Ende in C# – ein PDF-Dokument im Speicher mit IronPDF generieren und es dann als E-Mail-Anhang entweder mit MailKit oder dem eingebauten System.Net.Mail-Namespace senden, alles ohne ein einziges Byte auf die Festplatte zu schreiben.

Wie installiert man die benötigten Pakete?

Dieser Workflow wird von zwei Paketen unterstützt: einer Bibliothek zur PDF-Generierung und einer Bibliothek zum Versenden von E-Mails. Installieren Sie beides entweder über die Paket-Manager-Konsole in Visual Studio oder über die .NET -Befehlszeilenschnittstelle.

Install-Package IronPdf, MailKit

IronPDF verfügt über eine auf Chromium basierende Rendering-Engine , die HTML, CSS und JavaScript in pixelgenaue PDF-Dokumente umwandelt. Es läuft unter Windows, Linux und macOS, was bedeutet, dass derselbe Code in einer ASP.NET Core Web-API, einem Hintergrunddienst oder einer Azure-Funktion funktioniert. MailKit ist die Bibliothek, die Microsoft für die gesamte neue .NET -E-Mail-Entwicklung empfiehlt – sie unterstützt SMTP, IMAP, POP3, OAuth 2.0 und die vollständige MIME-Konstruktion. Der Quellcode und die Dokumentation von MailKit sind auf GitHub verfügbar.

Wie erzeugt man ein PDF-Dokument im Speicher?

The ChromePdfRenderer class is the entry point for HTML to PDF conversion. Übergeben Sie einen HTML-String an RenderHtmlAsPdf und Sie erhalten ein PdfDocument-Objekt zurück, das sich vollständig im Speicher befindet. Greifen Sie auf die Rohbytes über die BinaryData-Eigenschaft zu – dieses Byte-Array ist genau das, was E-Mail-Anhangs-APIs erwarten.

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")
$vbLabelText   $csharpLabel

Die RenderHtmlAsPdf-Methode analysiert das HTML mit derselben Chromium-Engine, die Google Chrome antreibt, sodass Tabellen, CSS Raster, Flexbox und eingebettete Schriften genau wie in einem Browser gerendert werden. Das Ergebnis ist ein PdfDocument, dessen BinaryData-Eigenschaft das vollständige PDF-Binär ohne jeglichen Festplattenzugriff zurückgibt. Für Dokumente, die externe Bilder oder Stylesheets einbinden, verwenden Sie den optionalen BasePath-Parameter, um IronPDF mitzuteilen, wo relative Ressourcen-URLs aufgelöst werden sollen – dies wird detailliert auf der HTML-Datei zu PDF Anleitung behandelt.

Seitenlayout und benutzerdefinierte Kopfzeilen festlegen

Bevor Sie die PDF-Datei anhängen, können Sie Ränder, Kopf- oder Fußzeilen konfigurieren. Alle Layoutoptionen befinden sich in der RenderingOptions-Eigenschaft:

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
$vbLabelText   $csharpLabel

Ränder werden in Millimetern angegeben. Die {page}- und {total-pages}-Tokens werden zur Renderzeit ersetzt. Die HTML-String zu PDF Anleitung behandelt alle Rendering-Optionen. Sie können dem generierten Dokument auch Wasserzeichen oder Stempeltexte und Bilder hinzufügen, bevor Sie es anhängen.

Wie kann man mit MailKit eine PDF-Datei an eine E-Mail anhängen?

MailKit erstellt direkt einen MIME-Nachrichtenbaum, wodurch Sie die volle Kontrolle über Inhaltstyp, Kodierung und Metadaten der Anhänge erhalten. Die BodyBuilder-Hilfsklasse vereinfacht den häufigen Fall eines Text- oder HTML-Körpers mit einem oder mehreren Dateianhängen.

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
$vbLabelText   $csharpLabel

builder.Attachments.Add akzeptiert drei Argumente: den Dateinamen, den der Empfänger in seinem E-Mail-Client sieht, das rohe Byte-Array von pdf.BinaryData und eine ContentType-Instanz, die den MIME-Typ als application/pdf spezifiziert. Die asynchronen SMTP-Methoden halten den aufrufenden Thread frei, während die Netzwerkoperation abgeschlossen wird – ein entscheidender Vorteil bei ASP.NET Core -Controllern, die Dutzende von gleichzeitigen Anfragen verarbeiten.

SecureSocketOptions.StartTls verhandelt einen verschlüsselten Kanal mit dem SMTP-Server auf Port 587. Für Gmail verwenden Sie ein App-Passwort anstelle Ihres Kontopassworts: Erstellen Sie eines unter Google Account Security > App Passwords und übergeben Sie es dann an AuthenticateAsync. Für Microsoft 365 konfigurieren Sie die OAuth 2.0-Authentifizierung über die SaslMechanismOAuth2-Klasse von MailKit, wenn Ihr Mandant die Basisauthentifizierung deaktiviert hat.

Senden an mehrere Empfänger

Um mehreren Personen dieselbe E-Mail zu senden, fügen Sie vor dem Aufruf von SendAsync Adressen zu den To-, Cc- oder Bcc-Sammlungen hinzu:

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"))
$vbLabelText   $csharpLabel

Ein einzelner SendAsync-Aufruf liefert die Nachricht an alle Adressen. MailKit fasst die RCPT TO-Befehle in einer einzigen SMTP-Sitzung zusammen, sodass es bei mehreren Empfängern zu keinen Leistungseinbußen kommt.

Wie kann man System .NET.Mail als Alternative verwenden?

Für Projekte, die ältere .NET-Versionen anvisieren oder wenn das Hinzufügen eines Drittanbieter-NuGet-Pakets nicht erlaubt ist, übernimmt der eingebaute System.Net.Mail-Namespace die grundlegende SMTP-Zustellung. Microsoft empfiehlt es nicht mehr für Neuentwicklungen, aber es deckt die gängigen Anwendungsfälle ohne zusätzliche Abhängigkeiten ab.

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
$vbLabelText   $csharpLabel

Der Hauptunterschied im Vergleich zu MailKit besteht darin, dass System.Net.Mail.Attachment kein Byte-Array direkt akzeptiert – Sie müssen pdf.BinaryData zuerst in einem MemoryStream einhüllen. Sowohl MailMessage als auch SmtpClient werden in using-Anweisungen eingefasst, die die SMTP-Verbindung auflösen und den zugrunde liegenden Stream nach dem Senden spülen. Wenn Sie das using bei MailMessage weglassen, könnte der Anhangsstream in einigen Laufzeiten vor Abschluss des Sendens aufgelöst werden.

Auswahl zwischen MailKit und System .NET.Mail

Funktionsvergleich zwischen MailKit und System .NET Mail.
Merkmal MailKit System.Net.Mail
OAuth 2.0-Authentifizierung Ja Nein
IMAP-/POP3-Unterstützung Ja Nein
Async-First-API Ja Teilweise
Microsoft-Empfehlung Empfohlen Vermächtnis
Zusätzliches NuGet Paket Erforderlich Nicht erforderlich
Komplexe MIME-Konstruktion Volle Unterstützung Grundlegendes

Wählen Sie MailKit für jedes neue Projekt, insbesondere wenn der SMTP-Server OAuth erfordert oder wenn Sie IMAP zum Lesen von Antworten benötigen. Verwenden Sie System.Net.Mail, wenn der Code bereits davon abhängt und die Migrationskosten nicht gerechtfertigt sind.

Wie lässt sich dieses Muster auf reale Geschäftsprozesse anwenden?

Das In-Memory-PDF-zu-E-Mail-Muster ist direkt anwendbar auf die Dokumentenautomatisierungsszenarien, die den meisten Geschäftsanwendungen zugrunde liegen.

Rechnungsautomatisierung

Ein System zur Auftragsabwicklung im E-Commerce generiert unmittelbar nach Zahlungseingang eine PDF-Rechnung. Das OrderConfirmed-Ereignis löst eine Methode aus, die RenderHtmlAsPdf mit einem Razor-gestalteten HTML-String aufruft, der mit Bestelldaten gefüllt ist, und sendet dann das Ergebnis an die E-Mail-Adresse des Kunden. Da das PDF nie das Dateisystem berührt, gibt es keine übrig bleibenden Dateien zu bereinigen, keine race conditions in einem geteilten Temp-Verzeichnis und keine Berechtigungsprobleme in containerisierten Bereitstellungen. Weitere Informationen zum Rendern von HTML aus Razor Ansichten finden Sie im ASP.NET Core PDF-Generierungsleitfaden .

Geplante Berichtsverteilung

Ein im IHostedService geplanter Hintergrunddienst erstellt jeden Montag um 06:00 Uhr eine wöchentliche Analysenzusammenfassung. Es fragt die Datenbank ab, erstellt einen HTML-Bericht, rendert ihn mit IronPDF und versendet ihn mit MailKit an eine Verteilerliste. Die gesamte Pipeline läuft asynchron, sodass während des SMTP-Handshakes kein Thread im Threadpool blockiert wird. Für in Azure gehostete Workloads erklärt der Leitfaden zum Azure PDF-Generator, wie IronPDF innerhalb von Azure App Service und Azure Functions bereitgestellt wird.

Beleggenerierung in ASP.NET Core

In einer minimalen API oder Controller-Aktion von ASP.NET Core empfängt ein POST-Endpunkt eine Checkout-Payload, generiert eine Quittung im PDF-Format und gibt einen HTTP-200-Statuscode zurück, während gleichzeitig die E-Mail versendet wird. Halten Sie die Logik für das Versenden von E-Mails in einem Hintergrund-Task, damit die HTTP-Antwort sofort an den Client zurückgegeben wird:

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)
$vbLabelText   $csharpLabel

Dadurch bleibt die API-Antwortzeit auch bei langsamem SMTP-Server unter 100 ms. Der emailService wird als skalierter oder transitorischer Dienst registriert, der die MailKit SmtpClient umhüllt.

Wie gehen Sie mit Fehlern und Wiederholungsversuchen um?

Netzwerkoperationen schlagen fehl. SMTP-Server sind vorübergehend nicht verfügbar, Authentifizierungstoken laufen ab und die Beschränkungen der Anhangsgröße variieren je nach Anbieter. Integrieren Sie von Anfang an Resilienz in den E-Mail-Versandprozess.

Die Sendelogik von MailKit wird in einen try/catch-Block eingeschlossen und Fehler werden in einer persistenten Warteschlange protokolliert, damit sie wiederholt werden können:

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
$vbLabelText   $csharpLabel

Exponentielles Backoff – 2 Sekunden nach dem ersten Fehler, 4 Sekunden nach dem zweiten – verhindert die Überlastung eines SMTP-Servers. In Produktionsanwendungen sollte die Wiederholungsschleife durch eine Message Queue (Azure Service Bus, RabbitMQ oder AWS SQS) ersetzt werden, damit Fehler auch nach einem Neustart der Anwendung erhalten bleiben.

IronPDF wirft auch eine PdfException, wenn der HTML-Inhalt nicht gerendert werden kann. Fangen Sie es separat von den SMTP-Ausnahmen ab, damit die Fehlermeldung spezifisch ist:

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
$vbLabelText   $csharpLabel

Die Trennung von Darstellungsfehlern und Auslieferungsfehlern beschleunigt die Fehlersuche. Für einen umfassenderen Einblick in die Fehlerbehandlung in automatisierten Dokumentenpipelines bietet der 5-stufige Leitfaden zur PDF-Generierung detaillierte Informationen zu Validierungsmustern.

Wie kann die Anhangsgröße innerhalb der Anbietergrenzen gehalten werden?

Die meisten kommerziellen E-Mail-Anbieter legen eine maximale Anhangsgröße fest. Gmail beschränkt einzelne Anhänge auf 25 MB; Bei Microsoft 365 ist die Standardgröße für Standardpostfächer auf 20 MB festgelegt. Ein aufwändig gestalteter HTML-Bericht mit eingebetteten Bildern kann diese Grenzwerte unerwartet überschreiten.

Drei Techniken helfen dabei, innerhalb der Grenzen zu bleiben:

Komprimieren Sie Bilder vor dem Rendern. Eingebundene Bilder sollten komprimiertes JPEG oder WebP anstelle von unkomprimiertem PNG verwenden. Ein PNG-Logo mit 600 dpi kann die PDF-Datei um mehrere Megabyte vergrößern; Ein JPEG mit 85 % Qualität ist typischerweise unter 200 KB groß, bei gleichem visuellen Ergebnis.

Verwenden Sie die Kompressionseinstellungen von IronPDF. Die PdfDocument.CompressImages-Methode verringert die Auflösung eingebetteter Bitmaps nach dem Rendern. Rufen Sie es auf, bevor Sie BinaryData lesen:

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
$vbLabelText   $csharpLabel

Teilen Sie umfangreiche Berichte in mehrere E-Mails auf. Falls ein Bericht auch nach der Komprimierung das Limit Ihres Anbieters überschreitet, erstellen Sie für jeden Abschnitt eine separate PDF-Datei und versenden Sie diese in einer separaten E-Mail. Die PDF-Aufteilungs- und Zusammenführungs-Anleitung zeigt, wie man ein PdfDocument mithilfe von CopyPages nach Seitenbereich unterteilt.

Externe Referenzen für SMTP-Größenbeschränkungen: Gmail-Anhangsbeschränkungen , Microsoft 365-Nachrichtengrößenbeschränkungen .

Was sind Ihre nächsten Schritte?

Sie haben jetzt eine funktionierende Vorlage, um ein PDF im Speicher mit IronPDF zu generieren und es als E-Mail-Anhang entweder mit MailKit oder System.Net.Mail zu senden. Der In-Memory-Ansatz eliminiert Festplattenlese- und Schreibzugriffe, vereinfacht containerisierte Bereitstellungen und skaliert auf Hochdurchsatzszenarien, ohne dass temporäre Datei Bereinigung erforderlich ist.

Um die Integration zu vertiefen:

Häufig gestellte Fragen

Wie kann ich eine generierte PDF-Datei als E-Mail-Anhang in C# versenden?

Mit IronPDF können Sie erstellte PDF-Dateien als E-Mail-Anhänge senden, indem Sie dessen PDF-Erstellungsfunktionen mit den E-Mail-Sendefunktionen von .NET integrieren.

Was sind die Vorteile des Versands von PDF-Dateien per E-Mail in .NET-Anwendungen?

Der Versand von PDF-Dateien per E-Mail in .NET-Anwendungen hilft bei der Automatisierung der Dokumentenzustellung, der Rationalisierung von Geschäftsabläufen und der Verbesserung der Kundenkommunikation.

Kann IronPDF dynamische Inhalte in PDFs für E-Mail-Anhänge verarbeiten?

Ja, IronPDF erzeugt dynamisch PDF-Inhalte, was es geeignet für ereignisgesteuerte Anwendungen macht, die das Versenden von angepassten PDFs als E-Mail-Anhänge erfordern.

Welche Parameter werden bei IronPDF üblicherweise in E-Mail-Versandmethoden verwendet?

Zu den gängigen Parametern gehören der E-Mail-Betreff, die Absenderinformationen und EventArgs, die eine effiziente Verarbeitung in ereignisgesteuerten Anwendungen gewährleisten.

Warum eignet sich IronPDF für die Automatisierung der Dokumentenzustellung?

IronPDF eignet sich zur Automatisierung der Dokumentzustellung, da es eine zuverlässige PDF-Erstellung bietet und sich mit den E-Mail-Sendefunktionen von C# integriert.

Ist es möglich, den PDF-E-Mail-Versand mit IronPDF zu planen?

Ja, IronPDF kann in geplante Aufgaben integriert werden, um den Versand von PDF-E-Mails zu bestimmten Zeiten zu automatisieren und so die Effizienz des Workflows zu verbessern.

Unterstützt IronPDF die Erstellung von PDFs aus verschiedenen Datenquellen für E-Mail-Anhänge?

IronPDF unterstützt die Erstellung von PDFs aus mehreren Datenquellen, sodass Entwickler detaillierte Dokumente für E-Mail-Anhänge generieren können.

Wie kann IronPDF die E-Mail-Kommunikation mit Kunden verbessern?

Durch die Möglichkeit, detaillierte PDF-Dokumente als Anhänge zu erstellen und zu versenden, erhöht IronPDF die Professionalität und Klarheit der E-Mail-Kommunikation mit Kunden.

Kann IronPDF verwendet werden, um Rechnungen und Berichte als PDF-Anhänge zu senden?

Ja, IronPDF eignet sich gut zur Erstellung und zum Versenden von Rechnungen, Berichten und anderen Dokumenten als PDF-Anhänge, um verschiedenen geschäftlichen Bedürfnissen gerecht zu werden.

Welche Rolle spielt IronPDF bei der Verbesserung von Geschäftsabläufen?

IronPDF verbessert Geschäftsabläufe, indem es die Erstellung und Verteilung von PDF-Dokumenten ermöglicht und manuelle Eingriffe und Fehler reduziert.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an