Problembeschreibung

Immer mehr Provider stellen Ihre Mail-Server um, so dass ein Spam-Mißbrauchsloch geschlossen wird. Häufig werden Mail-Server als Relayserver mitbraucht. Hierbei nutzt ein Mailabsender eine Absenderadresse die nicht dem Domainbereich des Mail-Servers entspricht. Das wird nicht immer nur im Bösen getan, manchmal sind das auch ganz reguläre praktische Beweggründe. Bsp. Wenn man mit seinem Webshop Bestellmails an den Shopbetreiber und Kunden automatisch herausschickt, nutzt man einen SMPT-Account auf dem Host. Als Absender regulär würde dann z.B. stehen Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.. Diese Adresse soll aber nur vom Webserver verwendet werden. Gerne wird auf derlei Mails geantwortet. Aber an diese Adresse will man keine Mails empfangen. Man selbst müßte beim Beantworten immer erst die Kundenadresse heraussuchen und statt dessen als Anwortadresse eintragen. Das ist mühselig und geht regelmäßig schief. Deshalb wäre es bequemer wenn als Absender nicht diese Webserver-Adresse stünde, sondern die Adresse des Kunden, der die Bestellung aufgibt. Das entspräche aber genau dem Spam-Missbrauchs-Modell wie oben beschrieben. Fast alle Provider unterdrücken mittlerweile diese Verfahrensweise.



 

Der richtig Weg wäre, den Absender des Webserver zu belassen. Statt dessen wird zusätzlich die Kunden-E-Mail-Adresse als Antwort-Adresse als Parameter beim Mailversenden angeben. Diese wird dann als reply-to Adresse verwendet.

Hier sind wir jetzt bei VirtueMart angekommen. Denn genau das geht in VM der Version 1.x nicht. Dieser Parameter ist dort nicht bekannt.

 

Etwas Grundwissen

Beim Versenden von Bestellmails durch das Script classes/ps_checkout.php nutzt VM die Methode vmMail(). vmMail wird definiert im Klassen-Script classes/ps_mail.php. vmMail kennt folgende Parameter:

vmMail(
            Absender-Mail,
            Absender-Name,
            Empfängermail,
            Betreff,
            Inhalt (Body),
            alternat.txt.Inhalt (Body),
            Modus: 0=ist Plain-Text, 1=ist HTML,
            CC-Mailadr.,
            BCC-Mailadr.,
            eingebettete Images,
            Anhänge)

vmMail selbst nutzt seit Version 1.1.3 die Methode vmCreateMail() aus dem gleichen Script ps_main.php. Das dort verwendete Basisobjekt mail ist eine Instanz der phpMailer-Klasse und besitzt sämtliche derer Methoden.

Das Object mail wird deklariert im Script libraries/phpmailer/phpmailer.php. Hier gibt es - oh welche Freude - eine Methode AddReplyTo().

 

Lösung des Problems

Mit obiger Erkenntnis sind wir schon fast am Ziel, aber wir kommen nicht umhin Eingriffe in VM-Core-Scripten vorzunehmen.

1. Anpassen des VM-Core-Scriptes administrator/components/com_virtuemart/classes/ps_main.php.

Wir müssen die Funktion vmMail() ca. Zeile 541 mit Parametern erweitern und im Fall dessen, dass der Parameter $replyto befüllt ist diesen per Methode $mail->AddReplyTo($replyto, $replytoname) an das Mail-Objekt übergeben:

 

function vmMail($from, $fromname, $recipient, $subject, $body, $Altbody='', $mode=false, $cc=NULL, $bcc=NULL, $images=null, $attachment=null
, $replyto=null, $replytoname=null ) { # Neue Zeile
	global $mosConfig_debug;
		// Filter from, fromname and subject
	if (!vmValidateEmail( $from ) || !vmValidateName( $fromname ) || !vmValidateName( $subject )) {
		return false;
	}
	$mail = vmCreateMail( $from, $fromname, $subject, $body );
	if ($replyto) $mail->AddReplyTo($replyto, $replytoname); # Neue Zeile

 

 

2. Anpassen des VM-Core-Scriptes  administrator/components/com_virtuemart/classes/ps_checkout.php.

Dem Aufruf von vmMail müssen die beiden neuen Parameter für reply-to übergeben werden.

 

 

$shopper_mail = vmMail( $from_email, $mosConfig_fromname, $shopper_email, $shopper_subject, $shopper_mail_Body, $shopper_mail_AltBody, true, null, null, $EmbeddedImages, null, "shop(AT)shop-gmbh.de", "Verkauf Shop GmbH");
$vendor_mail = vmMail( 'webshop(AT)shop-gmbh.de', "Webshop-Server Shop GmbH", $vendor_email, $vendor_subject, $vendor_mail_Body, $vendor_mail_AltBody
, true, null, null, null, null
, $shopper_email, $shopper_name);

 

 

In der Vendor-Mail, werden die Kundendaten nicht mehr als Absender verwendet sondern korrekt als Antwort-Adressen. Als Absender sollte eine Mailadresse verwendet werden, die auf dem Host als Domain zu Hause ist.