Zum Fußzeileninhalt springen
IRONPDF NUTZEN

Wie man eine PDF-Datei als E-Mail-Anhang in C# sendet

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. Dieser Leitfaden führt Sie durch den kompletten End-to-End-Workflow in C# – von der Generierung eines PDF-Dokuments im Speicher mit IronPDF bis zum anschließenden Versenden als E-Mail-Anhang entweder mit MailKit oder dem integrierten Namespace System.Net.Mail, und das 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
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
SHELL

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?

Die Klasse ChromePdfRenderer ist der Einstiegspunkt für die HTML-zu-PDF-Konvertierung . Übergibt man eine HTML-Zeichenkette an RenderHtmlAsPdf, erhält man ein PdfDocument-Objekt zurück, das vollständig im Speicher gehalten wird. Greifen Sie über die Eigenschaft BinaryData auf die Rohbytes zu – dieses Byte-Array entspricht genau dem, was E-Mail-Anhang-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 Methode RenderHtmlAsPdf analysiert das HTML mit derselben Chromium-Engine, die auch Google Chrome antreibt, sodass Tabellen, CSS Grid, Flexbox und eingebettete Schriftarten genau so gerendert werden wie im Browser. Das Ergebnis ist ein PdfDocument, dessen BinaryData Eigenschaft die vollständige PDF-Binärdatei ohne jegliche Lese- und Schreibvorgänge auf der Festplatte zurückgibt. Bei Dokumenten, die externe Bilder oder Stylesheets einbinden, verwenden Sie den optionalen Parameter BasePath, um IronPDF mitzuteilen, wo relative Ressourcen-URLs aufgelöst werden sollen – dies wird ausführlich auf der Anleitungsseite "HTML-Datei zu PDF" 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 Eigenschaft RenderingOptions:

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

Die Ränder sind in Millimetern angegeben. Die Platzhalter {page} und {total-pages} werden beim Rendern ersetzt. Die Anleitung zur Konvertierung von HTML-Zeichenketten in PDF beschreibt 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 Hilfsklasse BodyBuilder vereinfacht den häufigen Fall eines Text- oder HTML-Bodys 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 angibt. 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 handelt einen verschlüsselten Kanal mit dem SMTP-Server auf Port 587 aus. Verwenden Sie für Gmail ein App-Passwort anstelle Ihres Kontopassworts: Generieren Sie eines unter Google-Kontosicherheit > App-Passwörter und übermitteln Sie es dann an AuthenticateAsync. Für Microsoft 365 konfigurieren Sie die OAuth 2.0-Authentifizierung über die MailKit-Klasse SaslMechanismOAuth2, falls Ihr Mandant die Basisauthentifizierung deaktiviert hat.

Senden an mehrere Empfänger

Um mehrere Personen in dieselbe E-Mail zu kopieren, fügen Sie Adressen den Sammlungen To, Cc oder Bcc hinzu, bevor Sie SendAsync aufrufen:

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 einziger SendAsync-Aufruf übermittelt 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 auf ältere .NET Versionen abzielen, oder Projekte, bei denen das Hinzufügen eines NuGet Pakets von Drittanbietern nicht zulässig ist, übernimmt der integrierte Namespace System.Net.Mail 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 zu MailKit besteht darin, dass System.Net.Mail.Attachment kein Byte-Array direkt akzeptiert – Sie müssen pdf.BinaryData zuerst in MemoryStream einbetten. Sowohl MailMessage als auch SmtpClient sind in using-Anweisungen eingebettet, welche die SMTP-Verbindung trennen und den zugrunde liegenden Datenstrom nach dem Senden leeren. Wenn Sie using bei MailMessage weglassen, kann es bei einigen Laufzeitumgebungen vorkommen, dass der Anhangsstream verworfen wird, bevor der Sendevorgang abgeschlossen ist.

Auswahl zwischen MailKit und System .NET.Mail

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

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 die Codebasis 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 Ereignis OrderConfirmed löst eine Methode aus, die RenderHtmlAsPdf mit einer Razor-Vorlage für HTML-Zeichenfolge aufruft, die aus Bestelldaten befüllt wird, und anschließend das Ergebnis an die E-Mail-Adresse des Kunden sendet. Da die PDF-Datei niemals auf das Dateisystem zugreift, gibt es keine zu bereinigenden Restdateien, keine Race Conditions in einem gemeinsam genutzten temporären Verzeichnis und keine Berechtigungsprobleme bei containerisierten Bereitstellungen. Weitere Informationen zum Rendern von HTML aus Razor Ansichten finden Sie im ASP.NET Core PDF-Generierungsleitfaden .

Geplante Berichtsverteilung

Ein Hintergrunddienst, der mit IHostedService geplant ist, generiert jeden Montag um 06:00 Uhr eine wöchentliche Analysezusammenfassung. 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. Die Logik zum Versenden von E-Mails sollte im Hintergrund ausgeführt werden (Task), damit die HTTP-Antwort sofort an den Client zurückgesendet 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 Dienst emailService ist als ein beschränkter oder vorübergehender Dienst registriert, der den MailKit-Dienst SmtpClient umschließt.

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 außerdem einen 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 Komprimierungseinstellungen von IronPDF. Die Methode PdfDocument.CompressImages reduziert die Auflösung eingebetteter Bitmaps nach dem Rendern. Rufen Sie es an, bevor Sie lesen BinaryData:

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 Anleitungsseite zum Aufteilen und Zusammenführen von PDFs zeigt, wie man eine PdfDocument-Datei mithilfe von CopyPages-Seitenbereichen aufteilt.

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

Was sind Ihre nächsten Schritte?

Sie verfügen nun über eine funktionierende Vorlage, um mit IronPDF eine PDF-Datei im Speicher zu generieren und diese anschließend als E-Mail-Anhang entweder mit MailKit oder mit System.Net.Mail zu versenden. Der In-Memory-Ansatz eliminiert Lese- und Schreibvorgänge auf der Festplatte, vereinfacht containerisierte Bereitstellungen und skaliert auf Szenarien mit hohem Durchsatz, ohne dass eine Bereinigung temporärer Dateien 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