Magento: Verschiedene E-Mail-Templates für
Bestellbestätigungen intern sowie an den Kunden
Für Betreiber eines Magento-Shops, die diesen ausschließlich zur Erfassung von Bestellungen verwenden, die eigentliche Bestellabwicklung aber extern erledigen, ist es ein sinnvolles Vorgehen, Bestätigungsmails nach erfolgreichem Bestellvorgang parallel an den Kunden und an die eigene Adresse zu versenden. Dies ist auch im Backend unter
System - Configuration - Sales - Sales Emails leicht einzurichten, entweder als separate E-Mail oder als Blindkopie (BCC).
Allerdings gibt es Fälle, in denen es vom Shopbetreiber gar nicht erwünscht ist, die Bestellbestätigungen im selben Layout wie der Kunde zu erhalten. In manchen Unternehmen werden Bestellmails zur weiteren Vorgangsbearbeitung in Papierform ausgedruckt und weitergeleitet, so dass aus Gründen der Übersichtlichkeit und Wirtschaftlichkeit (Papier-/Tonerverbrauch) darauf Wert gelegt wird, dass die für den internen Gebrauch bestimmten Mails so kurz, kompakt und frei von unwichtigen Informationen wie möglich sind. Beispielsweise sind Bereiche einer Bestätigungsmail, in der Adress- und Kontaktangaben des Unternehmens vermerkt sind, für die Bestellbearbeitung ebenso irrelevant wie Ansprache- oder Erklärungstexte.
Diese Funktion - also, die Bestellbestätigungen an den Kunden in Layout A und die internen Bestätigungen in Layout B zu versenden - stellt Magento ab Werk nicht zur Verfügung. Wir basteln uns also dazu eine kleine Extension unter der Bezeichnung
Kotori_Myextension (für weitere Erläuterungen, wie eine Extension aufgebaut ist,
siehe den entsprechenden Wissensartikel hier auf kotori.de), um die Klasse
Mage_Sales_Model_Order, in der der Mailversand normalerweise stattfindet, zu überschreiben, und zwar mit der Klasse
Kotori_Myextension_Model_Order.
Die
config.xml der Extension unter
/app/code/local/Kotori/Myextension/etc/ sieht dann folgendermaßen aus:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| <?xml version="1.0"?>
<config>
<modules>
<Kotori_Myextension>
<version>0.1.0</version>
</Kotori_Myextension>
</modules>
<global>
<blocks>
</blocks>
<models>
<sales>
<rewrite>
<order>Kotori_Myextension_Model_Order</order>
</rewrite>
</sales>
</models>
<events>
</events>
</global>
<frontend>
<routers>
</routers>
</frontend>
<default>
</default>
</config>
|
Bevor wir uns mit der Klassendefinition selbst beschäftigen, müssen wir allerdings noch eine Kleinigkeit vorbereiten: nämlich das Template, das für den internen Gebrauch bestimmt ist, einrichten. Dies erledigen wir nach der Vorgehensweise
im Infotext Eigene E-Mail-Templates für Kundentransaktionen. Anschließend (Abb. 1) sehen wir in der
Transactional Emails-Liste das neue Template unter dem Titel
Neues Kotori-Template. Die Nummer des Templates - hier 42 - sollte notiert oder gemerkt werden, wir werden diese Nummer gleich bei der Klassendefinition von
Kotori_Myextension_Model_Order brauchen!

Abbildung 1: Die Nummer vor dem erstellten Template für den internen Gebrauch sollte notiert bzw. gemerkt werden. Wir benötigen sie in der Klassendefinition von
Kotori_Myextension_Model_Order.
Nachfolgend die Klassendefinition von
Kotori_Myextension_Model_Order, abgelegt in
/app/code/local/Kotori/Myextension/Model. Besonders wichtig für unsere gewünschte Funktion ist der Zeilenbereich von 71 bis 92; hier wird mit
$internmailer ein zweites Mailer-Objekt referenziert, dem über die entsprechenden Methoden anschließend die Zieladresse (hier
info@kotori.de) und als Absender Name und E-Mail-Adresse des Kunden übergeben werden. In Zeile 85 wird das Template gesetzt, das für den Mailer relevant sein soll, und zwar über die ID-Nummer, die wir uns oben notiert haben, in diesem Beispiel eben 42. Das Absenden übernimmt die
send()-Methode in Zeile 95.
001: 002: 003: 004: 005: 006: 007: 008: 009: 010: 011: 012: 013: 014: 015: 016: 017: 018: 019: 020: 021: 022: 023: 024: 025: 026: 027: 028: 029: 030: 031: 032: 033: 034: 035: 036: 037: 038: 039: 040: 041: 042: 043: 044: 045: 046: 047: 048: 049: 050: 051: 052: 053: 054: 055: 056: 057: 058: 059: 060: 061: 062: 063: 064: 065: 066: 067: 068: 069: 070: 071: 072: 073: 074: 075: 076: 077: 078: 079: 080: 081: 082: 083: 084: 085: 086: 087: 088: 089: 090: 091: 092: 093: 094: 095: 096: 097: 098: 099: 100: 101:
| <?php
class Kotori_Myextension_Model_Order extends Mage_Sales_Model_Order
{
public function sendNewOrderEmail()
{
$storeId = $this->getStore()->getId();
if (!Mage::helper('sales')->canSendNewOrderEmail($storeId)) {
return $this;
}
$copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
$copyMethod = Mage::getStoreConfig(self::XML_PATH_EMAIL_COPY_METHOD, $storeId);
$appEmulation = Mage::getSingleton('core/app_emulation');
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
try {
$paymentBlock = Mage::helper('payment')->getInfoBlock($this->getPayment())
->setIsSecureMode(true);
$paymentBlock->getMethod()->setStore($storeId);
$paymentBlockHtml = $paymentBlock->toHtml();
} catch (Exception $exception) {
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
throw $exception;
}
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
if ($this->getCustomerIsGuest()) {
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $storeId);
$customerName = $this->getBillingAddress()->getName();
} else {
$templateId = Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE, $storeId);
$customerName = $this->getCustomerName();
}
$mailer = Mage::getModel('core/email_template_mailer');
$emailInfo = Mage::getModel('core/email_info');
$emailInfo->addTo($this->getCustomerEmail(), $customerName);
if ($copyTo && $copyMethod == 'bcc') {
// Add bcc to customer email
foreach ($copyTo as $email) {
$emailInfo->addBcc($email);
}
}
$mailer->addEmailInfo($emailInfo);
if ($copyTo && $copyMethod == 'copy') {
foreach ($copyTo as $email) {
$emailInfo = Mage::getModel('core/email_info');
$emailInfo->addTo($email);
$mailer->addEmailInfo($emailInfo);
}
}
// Mail an Kunden vorbereiten und senden
$mailer->setSender(Mage::getStoreConfig(self::XML_PATH_EMAIL_IDENTITY, $storeId));
$mailer->setStoreId($storeId);
$mailer->setTemplateId($templateId);
$mailer->setTemplateParams(array(
'order' => $this,
'billing' => $this->getBillingAddress(),
'payment_html' => $paymentBlockHtml
)
);
$mailer->send();
// Interne Mail vorbereiten und senden
$internmailer = Mage::getModel('core/email_template_mailer');
$internemailInfo = Mage::getModel('core/email_info');
$internemailInfo->addTo('info@kotori.de','Kotori Test');
$internmailer->addEmailInfo($internemailInfo);
// Interne Bestellmails mit Kunden-E-Mail-Adresse und -Name als Absender!
$internsender = Array('name' => $this->getCustomerName(), 'email' => $this->getCustomerEmail());
$internmailer->setSender($internsender);
$internmailer->setStoreId($storeId);
// ID 42 ist im Backend fuer diese Kurzmails festgelegt
$internmailer->setTemplateId(42);
$internmailer->setTemplateParams(array(
'order' => $this,
'billing' => $this->getBillingAddress(),
'payment_html' => $paymentBlockHtml
)
);
$internmailer->send();
$this->setEmailSent(true);
$this->_getResource()->saveAttribute($this, 'email_sent');
return $this;
}
}
|
Eine Testbestellung ergibt für die interne Mailadresse eine Rückmeldung wie in Abbildung 2 sowie für die Kundenmailadresse die Optik in Abbildung 3; beides entspricht genau dem erwünschten Verhalten.

Abbildung 3: ... und was den Kunden erreicht.

Abbildung 2: Was intern ankommt...