Bilder in E-Mails einbinden
Dieses Skript zeigt, wie Bilder direkt in den HTML-Inhalt einer E-Mail eingebettet werden können (Inline-Bilder), sodass sie im Mailtext sichtbar sind, nicht nur als Anhang.
Anwendungsfall
Sie möchten eine E-Mail mit eingebettetem Firmenlogo, Signatur-Bild oder Produktbild versenden, das direkt im Mailtext angezeigt wird (nicht als separater Anhang).
Konfiguration in PRINT+PLUS
- Exporter-Typ: Beliebig (Dokument- oder Skript-Exporter)
- Event:
AfterClosingDocumentoderAfterLastDocument
Funktionsprinzip
Inline-Bilder in E-Mails funktionieren über die Content-ID (CID):
- Das Bild wird als Attachment mit einer eindeutigen
ContentIdan die Mail angehängt - Im HTML-Body wird das Bild über
<img src="cid:MeineContentId">referenziert - Der E-Mail-Client zeigt das Bild direkt im Text an
Vollständiges Skript
// Version 6
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.Common.Util;
using Ruthardt.PrintPlus.Model.Interfaces;
public class MailMitBild : IScriptAction
{
private const string SMTP_SERVER = "mail.meinefirma.de";
private const int SMTP_PORT = 587;
private const string SMTP_USER = "absender@meinefirma.de";
private const string SMTP_PASSWORT = "GeheimesPasswort";
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
var empfaenger = currentContext.Data.GetStringValue("E-Mail");
if (string.IsNullOrWhiteSpace(empfaenger))
{
return;
}
// HTML-Body mit eingebettetem Bild (via cid:)
var htmlBody = @"
<html>
<body>
<h2>Ihr Dokument</h2>
<p>Sehr geehrte Damen und Herren,</p>
<p>im Anhang finden Sie Ihr Dokument.</p>
<p>Mit freundlichen Grüßen</p>
<img src=""cid:firmenlogo"" width=""200"" />
</body>
</html>";
// E-Mail erstellen
using (var nachricht = new MailMessage(
SMTP_USER,
empfaenger,
"Ihr Dokument",
htmlBody)
{
IsBodyHtml = true
})
{
// Bild als Inline-Attachment einbetten
var logoPfad = @"C:\Vorlagen\Bilder\Logo.png";
var logoBytes = File.ReadAllBytes(logoPfad);
using (var stream = new MemoryStream(logoBytes))
{
stream.Position = 0;
var logoAttachment = new Attachment(stream, "Logo.png", "image/png");
logoAttachment.ContentId = "firmenlogo";
logoAttachment.ContentDisposition.Inline = true;
nachricht.Attachments.Add(logoAttachment);
// Generiertes Dokument als normalen Anhang beifügen
nachricht.Attachments.Add(new Attachment(currentContext.DocumentFileName.FullName));
// Versand
using (var smtp = new SmtpClient(SMTP_SERVER)
{
Port = SMTP_PORT,
EnableSsl = true,
Credentials = new NetworkCredential(SMTP_USER, SMTP_PASSWORT)
})
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
smtp.Send(nachricht);
}
}
}
printContext.Logger.Info($"E-Mail mit eingebettetem Bild an '{empfaenger}' versendet.");
}
}
}
Erklärung
| Schritt | Code | Beschreibung |
|---|---|---|
| 1 | <img src="cid:firmenlogo"> |
Im HTML-Body wird das Bild über seine Content-ID referenziert |
| 2 | logoAttachment.ContentId = "firmenlogo" |
Die Content-ID muss exakt dem cid:-Wert im HTML entsprechen |
| 3 | logoAttachment.ContentDisposition.Inline = true |
Markiert das Attachment als Inline-Bild (nicht als Download-Anhang) |
Mehrere Bilder einbetten
var htmlBody = @"
<html><body>
<img src=""cid:header"" />
<p>Ihr Inhalt...</p>
<img src=""cid:signatur"" />
</body></html>";
// Header-Bild
var headerAttachment = new Attachment(@"C:\Bilder\header.png");
headerAttachment.ContentId = "header";
headerAttachment.ContentDisposition.Inline = true;
nachricht.Attachments.Add(headerAttachment);
// Signatur-Bild
var signaturAttachment = new Attachment(@"C:\Bilder\signatur.png");
signaturAttachment.ContentId = "signatur";
signaturAttachment.ContentDisposition.Inline = true;
nachricht.Attachments.Add(signaturAttachment);
Variante: Bild aus cobra DMS einbetten
using Cobra.Common;
using Cobra.Common.DocumentManagement.Interfaces;
// Bild-Pfad aus einem DMS-Feld ermitteln
var dmsId = currentContext.Data.GetStringValue("Logo");
IDmsController dmsController = CobraMain.Container.ResolveType<IDmsController>();
var bildPfad = dmsController.GetDocumentFileName(dmsId);
var bildAttachment = new Attachment(bildPfad);
bildAttachment.ContentId = "firmenlogo";
bildAttachment.ContentDisposition.Inline = true;
nachricht.Attachments.Add(bildAttachment);
Hinweise
- Content-ID: Die
ContentIdmuss pro E-Mail eindeutig sein und darf keine Sonderzeichen enthalten. Am besten einfache Namen wie"logo","signatur","header"verwenden. - Bildformate: PNG und JPEG funktionieren in allen E-Mail-Clients zuverlässig. SVG wird von vielen Clients nicht unterstützt.
- Dateigröße: Halten Sie eingebettete Bilder klein (< 200 KB). Große Bilder verlangsamen den Versand und können von Spamfiltern blockiert werden.
- Kompatibilität: Inline-Bilder via CID werden von allen gängigen E-Mail-Clients unterstützt (Outlook, Thunderbird, Gmail, Apple Mail).
Keine Kommentare vorhanden
Keine Kommentare vorhanden