Direkt zum Hauptinhalt

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: AfterClosingDocument oder AfterLastDocument

 



Funktionsprinzip

Inline-Bilder in E-Mails funktionieren über die Content-ID (CID):

  1. Das Bild wird als Attachment mit einer eindeutigen ContentId an die Mail angehängt
  2. Im HTML-Body wird das Bild über <img src="cid:MeineContentId"> referenziert
  3. 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 ContentId muss 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).