Wie kann man Fehler in Bestellbestätigung finden

Hallo zusammen,

ich versuche mich gerade weiter an der Umsetzung von Shopware 6 und die Bestellbestätigung anzupassen. Ich habe mir die Vorlage angepasst - umformatiert und zusätzliche Werte ausgeben lassen (wie Kunden-E-Mail, Telefonnummer etc.) damit es in etwa so ist, wie ich es aus Shopware 5 kenne (und liebgewonnen habe).

Gehe ich auf „Test-Mail senden“, bekomme ich auch die Testnachricht. In dieser sind aber ja keine Angaben wie Arikel, Preise oder E-Mail-Adresse erhalten, wie bei diesen Testnachrichten halt so üblich.

Wenn ich dann eine Testbestellung auslöse, bekomme ich aber gar keine Mail. Lösche ich meine HTML-Mailvorlage und füge dafür wieder den Shopware-Standard für die Standard-HTML-Bestellbestätigung wieder ein, dann bekomme ich auch eine Mail zur Bestellung.

Jetzt die Frage: Wie ist es mir möglich, herauszufinden, was an meiner Mailvorlage den E-Mail-Versand verhindert? Gibt es da irgendwo einen Log, wo Shopware mir bitte sagt, warum es keine Mail verschickt hat?

Diesen Beitrag habe ich nicht ohne Grund geschrieben:

Das Anpassen und Testen von Mail-Vorlagen ist absoluter Mist! Sorry, aber ich muss das mal so knallhart erwähnen.

Es kann sein das eine Variable zwar in der (unbrauchbaren) Mail-Vorschau funktioniert, aber bei einer realen Bestellung geht keine Mail raus, weil plötzlich eine Variable nicht akzeptiert wird.

Lösung?

So lange Test-Bestellungen (also richtig übers Frontend) durchführen, bis man die Variable in der Mail-Vorlage gefunden hat :frowning: Das habe ich jedenfalls über Tage hinweg und sogar gemeinsam mit dem Shopware-Support machen müssen :frowning:

Deinen Äger kann ich gut nachvollziehen. Ich hatte nur insgeheim gehofft, einfach irgendwo überlesen zu haben, das es irgendwo einen Error-Log für die Mails gibt.

@Shopware, wieso ist es nicht möglich, das bei einer falschen/ungültigen Variable die Mail trotzdem verschickt wird, und an der Stelle mit dem Fehler einfach sowas wie „Error“ oder z.B. „delivery.shippingMethod.translated.name is undefined“ oder irgendwas in der Art ausgegeben wird? Das einfach keine Mail verschickt wird und man nirgendwo erfahren kann wieso, ist doch wirklich keine Lösung!

Und gleich noch eine Frage - ich wollte mich gerade durch die Änderungen Schritt für Schritt jeweils mit einer Testbestellung durcharbeiten.

An erster Stelle stand das verschieben der Position von Rechnungs- und Lieferadresse nach oben.

Ich habe dazu die Shopware-Originalvorlage verwendet, und einfach die Position wie folgt verschoben:

<div style="font-family:arial; font-size:12px;">

{% set currencyIsoCode = order.currency.isoCode %}
 
    {% set billingAddress = order.addresses.get(order.billingAddressId) %}
    <strong>Rechnungsadresse:</strong><br>
    {{ billingAddress.company }}<br>
    {{ billingAddress.firstName }} {{ billingAddress.lastName }}<br>
    {{ billingAddress.street }} <br>
    {{ billingAddress.zipcode }} {{ billingAddress.city }}<br>
    {{ billingAddress.country.translated.name }}<br>
    <br>

    {% if delivery %}
        <strong>Lieferadresse:</strong><br>
        {{ delivery.shippingOrderAddress.company }}<br>
        {{ delivery.shippingOrderAddress.firstName }} {{ delivery.shippingOrderAddress.lastName }}<br>
        {{ delivery.shippingOrderAddress.street }} <br>
        {{ delivery.shippingOrderAddress.zipcode}} {{ delivery.shippingOrderAddress.city }}<br>
        {{ delivery.shippingOrderAddress.country.translated.name }}<br>
        <br>
    {% endif %} 

Hallo {% if order.orderCustomer.salutation %}{{ order.orderCustomer.salutation.translated.letterName ~ ' ' }}{% endif %}{{ order.orderCustomer.firstName }} {{ order.orderCustomer.lastName }},<br>
<br>
Ihre Bestellung ist am {{ order.orderDateTime|format_datetime('medium', 'short', locale='de-DE') }} bei uns eingegangen.<br>
<br>
Bestellnummer: {{ order.orderNumber }}<br>
<br>
Sobald ein Zahlungseingang erfolgt ist, erhalten Sie eine separate Benachrichtigung und Ihre Bestellung wird verarbeitet.<br>
<br>
Den aktuellen Status Ihrer Bestellung können Sie jederzeit über diesen Link abrufen: {{ rawUrl('frontend.account.order.single.page', { 'deepLinkCode': order.deepLinkCode }, salesChannel.domains|first.url) }}<br>
Über diesen Link können Sie auch die Bestellung bearbeiten, die Zahlungsart wechseln oder nachträglich eine Zahlung durchführen.<br>
<br>
<strong>Informationen zu Ihrer Bestellung:</strong><br>
<br>

<table border="0" style="font-family:Arial, Helvetica, sans-serif; font-size:12px;">
    <tr>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Produkt-Nr.</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Produktbild</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Bezeichnung</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Menge</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Preis</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Summe</strong></td>
    </tr>

    {% for lineItem in order.nestedLineItems %}
        {% set nestingLevel = 0 %}
        {% set nestedItem = lineItem %}
        {% block lineItem %}
            <tr>
                <td>{% if nestedItem.payload.productNumber is defined %}{{ nestedItem.payload.productNumber|u.wordwrap(80) }}{% endif %}</td>
                <td>{% if nestedItem.cover is defined and nestedItem.cover is not null %}<img src="{{ nestedItem.cover.url }}" width="75" height="auto"/>{% endif %}</td>
                <td>
                    {% if nestingLevel > 0 %}
                        {% for i in 1..nestingLevel %}
                            <span style="position: relative;">
                                <span style="display: inline-block;
                                    position: absolute;
                                    width: 6px;
                                    height: 20px;
                                    top: 0;
                                    border-left:  2px solid rgba(0, 0, 0, 0.15);
                                    margin-left: {{ i * 10 }}px;"></span>
                            </span>
                        {% endfor %}
                    {% endif %}

                    <div{% if nestingLevel > 0 %} style="padding-left: {{ (nestingLevel + 1) * 10 }}px"{% endif %}>
                        {{ nestedItem.label|u.wordwrap(80) }}
                    </div>

                    {% if nestedItem.payload.options is defined and nestedItem.payload.options|length >= 1 %}
                        <div>
                            {% for option in nestedItem.payload.options %}
                                {{ option.group }}: {{ option.option }}
                                {% if nestedItem.payload.options|last != option %}
                                    {{ " | " }}
                                {% endif %}
                            {% endfor %}
                        </div>
                    {% endif %}

                    {% if nestedItem.payload.features is defined and nestedItem.payload.features|length >= 1 %}
                        {% set referencePriceFeatures = nestedItem.payload.features|filter(feature => feature.type == 'referencePrice') %}
                        {% if referencePriceFeatures|length >= 1 %}
                            {% set referencePriceFeature = referencePriceFeatures|first %}
                            <div>
                                {{ referencePriceFeature.value.purchaseUnit }} {{ referencePriceFeature.value.unitName }}
                                ({{ referencePriceFeature.value.price|currency(currencyIsoCode) }}* / {{ referencePriceFeature.value.referenceUnit }} {{ referencePriceFeature.value.unitName }})
                            </div>
                        {% endif %}
                    {% endif %}
                </td>
                <td style="text-align: center">{{ nestedItem.quantity }}</td>
                <td>{{ nestedItem.unitPrice|currency(currencyIsoCode) }}</td>
                <td>{{ nestedItem.totalPrice|currency(currencyIsoCode) }}</td>
            </tr>

            {% if nestedItem.children.count > 0 %}
                {% set nestingLevel = nestingLevel + 1 %}
                {% for lineItem in nestedItem.children %}
                    {% set nestedItem = lineItem %}
                    {{ block('lineItem') }}
                {% endfor %}
            {% endif %}
        {% endblock %}
    {% endfor %}
</table>

{% set delivery = order.deliveries.first %}

{% set displayRounded = order.totalRounding.interval != 0.01 or order.totalRounding.decimals != order.itemRounding.decimals %}
{% set decimals = order.totalRounding.decimals %}
{% set total = order.price.totalPrice %}
{% if displayRounded %}
    {% set total = order.price.rawTotal %}
    {% set decimals = order.itemRounding.decimals %}
{% endif %}
<p>
    <br>
    <br>
    {% for shippingCost in order.deliveries %}
        Versandkosten: {{ shippingCost.shippingCosts.totalPrice|currency(currencyIsoCode) }}<br>
    {% endfor %}
    Gesamtkosten Netto: {{ order.amountNet|currency(currencyIsoCode) }}<br>
        {% for calculatedTax in order.price.calculatedTaxes %}
            {% if order.taxStatus is same as('net') %}zzgl.{% else %}inkl.{% endif %} {{ calculatedTax.taxRate }}% MwSt. {{ calculatedTax.tax|currency(currencyIsoCode) }}<br>
        {% endfor %}
    {% if not displayRounded %}<strong>{% endif %}Gesamtkosten Brutto: {{ total|currency(currencyIsoCode,decimals=decimals) }}{% if not displayRounded %}</strong>{% endif %}<br>
    {% if displayRounded %}
        <strong>Gesamtkosten Brutto gerundet: {{ order.price.totalPrice|currency(currencyIsoCode,decimals=order.totalRounding.decimals) }}</strong><br>
    {% endif %}
    <br>

    {% if delivery %}
        <strong>Gewählte Versandart:</strong> {{ delivery.shippingMethod.translated.name }}<br>
        {{ delivery.shippingMethod.translated.description }}<br>
        <br>
    {% endif %}

    {% if order.orderCustomer.vatIds %}
        Ihre Umsatzsteuer-ID: {{ order.orderCustomer.vatIds|first }}
        Bei erfolgreicher Prüfung und sofern Sie aus dem EU-Ausland
        bestellen, erhalten Sie Ihre Ware umsatzsteuerbefreit. <br>
    {% endif %}
    <br/>
    Den aktuellen Status Ihrer Bestellung können Sie auch jederzeit auf unserer Webseite im  Bereich "Mein Konto" - "Meine Bestellungen" abrufen: {{ rawUrl('frontend.account.order.single.page', { 'deepLinkCode': order.deepLinkCode }, salesChannel.domains|first.url) }}
    </br>
    Für Rückfragen stehen wir Ihnen jederzeit gerne zur Verfügung.
</p>
<br>
</div>

Statt unter „Gewählte Versandart“ sollte so die Rechnungs- und Lieferadresse am Anfang ausgegeben werden.

Aber! Klappt nicht! Es wird nix verschickt. Es geht erst wieder so:

<div style="font-family:arial; font-size:12px;">

{% set currencyIsoCode = order.currency.isoCode %}
 
    {% set billingAddress = order.addresses.get(order.billingAddressId) %}
    <strong>Rechnungsadresse:</strong><br>
    {{ billingAddress.company }}<br>
    {{ billingAddress.firstName }} {{ billingAddress.lastName }}<br>
    {{ billingAddress.street }} <br>
    {{ billingAddress.zipcode }} {{ billingAddress.city }}<br>
    {{ billingAddress.country.translated.name }}<br>
    <br> 

Hallo {% if order.orderCustomer.salutation %}{{ order.orderCustomer.salutation.translated.letterName ~ ' ' }}{% endif %}{{ order.orderCustomer.firstName }} {{ order.orderCustomer.lastName }},<br>
<br>
Ihre Bestellung ist am {{ order.orderDateTime|format_datetime('medium', 'short', locale='de-DE') }} bei uns eingegangen.<br>
<br>
Bestellnummer: {{ order.orderNumber }}<br>
<br>
Sobald ein Zahlungseingang erfolgt ist, erhalten Sie eine separate Benachrichtigung und Ihre Bestellung wird verarbeitet.<br>
<br>
Den aktuellen Status Ihrer Bestellung können Sie jederzeit über diesen Link abrufen: {{ rawUrl('frontend.account.order.single.page', { 'deepLinkCode': order.deepLinkCode }, salesChannel.domains|first.url) }}<br>
Über diesen Link können Sie auch die Bestellung bearbeiten, die Zahlungsart wechseln oder nachträglich eine Zahlung durchführen.<br>
<br>
<strong>Informationen zu Ihrer Bestellung:</strong><br>
<br>

<table border="0" style="font-family:Arial, Helvetica, sans-serif; font-size:12px;">
    <tr>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Produkt-Nr.</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Produktbild</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Bezeichnung</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Menge</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Preis</strong></td>
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Summe</strong></td>
    </tr>

    {% for lineItem in order.nestedLineItems %}
        {% set nestingLevel = 0 %}
        {% set nestedItem = lineItem %}
        {% block lineItem %}
            <tr>
                <td>{% if nestedItem.payload.productNumber is defined %}{{ nestedItem.payload.productNumber|u.wordwrap(80) }}{% endif %}</td>
                <td>{% if nestedItem.cover is defined and nestedItem.cover is not null %}<img src="{{ nestedItem.cover.url }}" width="75" height="auto"/>{% endif %}</td>
                <td>
                    {% if nestingLevel > 0 %}
                        {% for i in 1..nestingLevel %}
                            <span style="position: relative;">
                                <span style="display: inline-block;
                                    position: absolute;
                                    width: 6px;
                                    height: 20px;
                                    top: 0;
                                    border-left:  2px solid rgba(0, 0, 0, 0.15);
                                    margin-left: {{ i * 10 }}px;"></span>
                            </span>
                        {% endfor %}
                    {% endif %}

                    <div{% if nestingLevel > 0 %} style="padding-left: {{ (nestingLevel + 1) * 10 }}px"{% endif %}>
                        {{ nestedItem.label|u.wordwrap(80) }}
                    </div>

                    {% if nestedItem.payload.options is defined and nestedItem.payload.options|length >= 1 %}
                        <div>
                            {% for option in nestedItem.payload.options %}
                                {{ option.group }}: {{ option.option }}
                                {% if nestedItem.payload.options|last != option %}
                                    {{ " | " }}
                                {% endif %}
                            {% endfor %}
                        </div>
                    {% endif %}

                    {% if nestedItem.payload.features is defined and nestedItem.payload.features|length >= 1 %}
                        {% set referencePriceFeatures = nestedItem.payload.features|filter(feature => feature.type == 'referencePrice') %}
                        {% if referencePriceFeatures|length >= 1 %}
                            {% set referencePriceFeature = referencePriceFeatures|first %}
                            <div>
                                {{ referencePriceFeature.value.purchaseUnit }} {{ referencePriceFeature.value.unitName }}
                                ({{ referencePriceFeature.value.price|currency(currencyIsoCode) }}* / {{ referencePriceFeature.value.referenceUnit }} {{ referencePriceFeature.value.unitName }})
                            </div>
                        {% endif %}
                    {% endif %}
                </td>
                <td style="text-align: center">{{ nestedItem.quantity }}</td>
                <td>{{ nestedItem.unitPrice|currency(currencyIsoCode) }}</td>
                <td>{{ nestedItem.totalPrice|currency(currencyIsoCode) }}</td>
            </tr>

            {% if nestedItem.children.count > 0 %}
                {% set nestingLevel = nestingLevel + 1 %}
                {% for lineItem in nestedItem.children %}
                    {% set nestedItem = lineItem %}
                    {{ block('lineItem') }}
                {% endfor %}
            {% endif %}
        {% endblock %}
    {% endfor %}
</table>

{% set delivery = order.deliveries.first %}

{% set displayRounded = order.totalRounding.interval != 0.01 or order.totalRounding.decimals != order.itemRounding.decimals %}
{% set decimals = order.totalRounding.decimals %}
{% set total = order.price.totalPrice %}
{% if displayRounded %}
    {% set total = order.price.rawTotal %}
    {% set decimals = order.itemRounding.decimals %}
{% endif %}
<p>
    <br>
    <br>
    {% for shippingCost in order.deliveries %}
        Versandkosten: {{ shippingCost.shippingCosts.totalPrice|currency(currencyIsoCode) }}<br>
    {% endfor %}
    Gesamtkosten Netto: {{ order.amountNet|currency(currencyIsoCode) }}<br>
        {% for calculatedTax in order.price.calculatedTaxes %}
            {% if order.taxStatus is same as('net') %}zzgl.{% else %}inkl.{% endif %} {{ calculatedTax.taxRate }}% MwSt. {{ calculatedTax.tax|currency(currencyIsoCode) }}<br>
        {% endfor %}
    {% if not displayRounded %}<strong>{% endif %}Gesamtkosten Brutto: {{ total|currency(currencyIsoCode,decimals=decimals) }}{% if not displayRounded %}</strong>{% endif %}<br>
    {% if displayRounded %}
        <strong>Gesamtkosten Brutto gerundet: {{ order.price.totalPrice|currency(currencyIsoCode,decimals=order.totalRounding.decimals) }}</strong><br>
    {% endif %}
    <br>

    {% if delivery %}
        <strong>Gewählte Versandart:</strong> {{ delivery.shippingMethod.translated.name }}<br>
        {{ delivery.shippingMethod.translated.description }}<br>
        <br>
    {% endif %}

    {% if delivery %}
        <strong>Lieferadresse:</strong><br>
        {{ delivery.shippingOrderAddress.company }}<br>
        {{ delivery.shippingOrderAddress.firstName }} {{ delivery.shippingOrderAddress.lastName }}<br>
        {{ delivery.shippingOrderAddress.street }} <br>
        {{ delivery.shippingOrderAddress.zipcode}} {{ delivery.shippingOrderAddress.city }}<br>
        {{ delivery.shippingOrderAddress.country.translated.name }}<br>
        <br>
    {% endif %}
    {% if order.orderCustomer.vatIds %}
        Ihre Umsatzsteuer-ID: {{ order.orderCustomer.vatIds|first }}
        Bei erfolgreicher Prüfung und sofern Sie aus dem EU-Ausland
        bestellen, erhalten Sie Ihre Ware umsatzsteuerbefreit. <br>
    {% endif %}
    <br/>
    Den aktuellen Status Ihrer Bestellung können Sie auch jederzeit auf unserer Webseite im  Bereich "Mein Konto" - "Meine Bestellungen" abrufen: {{ rawUrl('frontend.account.order.single.page', { 'deepLinkCode': order.deepLinkCode }, salesChannel.domains|first.url) }}
    </br>
    Für Rückfragen stehen wir Ihnen jederzeit gerne zur Verfügung.
</p>
<br>
</div>

So gehts, so bekomme ich eine Mail - dann ist nur die Rechnungsadresse oben und die Lieferadresse weiterhin unter „gewählte Versandart“ - aber weshalb wieso warum wird keine Mail verschickt, wenn ich die Position der Lieferadresse an den Anfang der Mail oberhab der Tabelle verschiebe?

Es handelt sich, wie gesagt, um das Original-Template der Bestellbestätigung, ich habe keine neue Variable hinzugefügt, sondern nur die Position von Rechnungs- und Lieferadresse verschoben.

Ich kann bis jetzt nur so viel berichten, dass der Shopware Support dazu eigene Tickets angelegt hat. Ich hoffe ja, dass in zukünftigen Versionen das mal sauber und verständlich angelegt wird. Der Shop-Betreiber verlässt sich darauf, was ihm in der rechten Sidebar als Variablen angezeigt wird. Wenn er diese dann kopiert, erwartet man auch, dass diese dann auch funktionieren. Bei einer Vielzahl von Variablen ist das zumind. bei SW 6.5.x nicht der Fall :frowning:

Mein Problem mit dem versetzen der Rechnungsadresse- und Lieferadresse konnte ich lösen - man muss die Zeile 93 vom HTML-Standard-Template an den Anfang versetzen - also {% set delivery = order.deliveries.first %} ganz nach oben vom Code packen und man kann die Position von Rechnungs- und Lieferadresse auch nach oben holen.

Hast Du mal im Logfile von Shopware ( z.B. var/log/prod-2024-05-12.log) geschaut (hatte das Problem noch nicht, daher bin ich nicht sicher, ob die da landen)?

Das Logfile habe ich mir angesehen, aber leider keine Fehlermeldung gefunden, die eindeutig auf Fehler in den Mails hinweist.

Ich habe es jetzt so gemacht, das ich die Bestellbestätigung Schritt für Schritt neu aufgebaut und nach jeder neuen Variable und jeder Umgestaltung eine Testbestellung gemacht habe. Damit habe ich meine Problemvariable gefunden - bei mir war es die für die vom Kunden gewählte Zahlart.

Wer diese ebenfalls sucht, sie lautet: {{ order.transactions.first.paymentMethod.name }} sowie {{ order.transactions.first.paymentMethod.translated.description }} für die Beschreibung zur Zahlart. Das „.first.“ war hier meine Fehlstelle.

Diese merkwürdige Fehlverhalten produziert leider keine Fehler im Log. Hätte ich mir vor kurzem auch gewünscht.

Genau so musste ich auch verfahren um an die Variablen zu kommen, die diesen Mist veranstalten.

Hallo @R4M, vom Frosch gibt es ein Plugin „Mail Templates aus dem Theme verwenden“ hast Du das schon einmal ausprobiert?
Ich hatte das mal in meinem Devshop installiert, bin aber dann nicht weitergekommen.

Steffen Winde

Wie gesagt, ich würde mir wünschen, die ganze E-Mail-Template-Sache wäre so, dass das System IMMER eine Mail versendet, auch wenn eine ungültige Variable enthalten ist.

Im Idealfall schreibt das System dann statt der variable einfach „Error order.transactions.paymentMethod.name“ oder sowas hin. Dann wüsste man schneller, wo das Problem liegt.

Du kannst hier Verbesserungsvorschläge machen: https://feedback.shopware.com/forums/942607-shopware-6-product-feedback-ideas