Aktuelle und frühere Versionen

Damit die Ausgangsmail nicht als schnöde Text-Mail versendet werden, müssen diese als HTML-Mails und nicht als Plain-Text erzeugt werden. In früheren Versionen von BreezingForms gab es hierzu noch keinen Templategenerator und es musste etwas speziell erzeugt werden. Das wird nachfolgend ausführlich beschrieben. Diese Beschreibung habe ich auch hier stehen lassen, weil es ja doch den einen oder anderen noch mal betreffen und interessieren könnte. Für neuere Version zumindest ab 1.8.7 ist das so umständlich nicht mehr, weil jedes Formular auch schon eine Möglichkeit hat die Ausgabe über ein Template im AdminBereich zu formatieren. Wie das erfolgt sei hier nun ganz kurz vorangestellt, ehe mit der "Alt"-Variante fortgesetzt wird.

Sie rufen über die Formularverwaltung das Formular auf, für welches die Mail-Ausgabe formatiert werden soll. Neben dem Registerreiter Einstellungen gibt es einen weitere Erweitert. In der dortigen Formularoptionenliste gibt es einen sehr unscheinbaren Link mehr Optionen den Sie anklicken. Nicht ganz links sehen Sie eine vertikale Liste mit farbigen Registern und dort die beiden Links Admin Emails und Rückantwort Emails. Wenn Sie mit den Admin-Emails beginnen wollen, finden Sie in dem erscheinenden Formular ganz unten die Option Emails bearbeiten. Statt des standard-Radiobuttons wählen Sie spezial. Jetzt erhalten Sie eine Editorfeld und neben diesem eine vertikale Liste mit den Feldbezeichner die Sie in Ihrem Formular angelegt haben als sogenannte Makro-Paltzhalter. Im Editorfeld können Sie nun nach Wuschn Ihren HTML-Text eingeben. An den Stellen, wo Datenausgaben erfolgen sollen, können Sie sich durch Klicks auf die Marko-Platzhalter bedienen. Bevor Sie dann Ihr fertiges Template speichern müssen Sie gleich über dem Editorfeld noch die Option Als HTML versenden mit ja aktivieren.

In gleicher Weise, vermutlich mit leicht geänderten Formulierungen wäre dann auch die Rückantwortmail an den Kunden zu erstellen.

 

In frühere Versionen von BreezingForms 

  • Im Ordner /administrator/components/com_facileforms/mailtpl/ gibt es zwei Scripte mailbacktpl.txt.php und mailtpl.txt.php. Wenn diese umbenannt werden zu *.html.php werden diese automatisch als HTML-Mails interpretiert und versendet. Diese Templates sind dann noch entspr. zur designen. Werden in BreezingForms mehrere Formulare verwaltet, kann für jedes Formular ein eigenes Mail-Template erstellt werden in dem o.g. Dateien kopiert werden und alles vor dem .html.php von z.B. /mailtpl/ in den Formularnamen umbenannt wird. Dazu in der Komponent breezingforms das betreffende Formular aufrufen. Ganz oben rechts auf den Button „Formulareinstellungen" klicken. Im Modal-Dialog steht unter dem Reiter Einstellungen das Feld Titel. Hier steht der vergebene Formulartitel. Aus „EasyForm_Kontakt" wurde im Projektfall die Datei EasyForm_Kontakt.html.php mit folgendem Inhalt: 



Inhalt der EasyForm_Kontakt.html.php

<?php
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
?>
 
<table border="0">
<?php foreach ($MAILDATA as $DATA): ?>
<tr><?php echo $NL ?>
 <td valign="top"><?php
 $fieldname = str_replace("title_ff_Kontakt","", $DATA[_FF_DATA_TITLE]);
 $fieldname = str_replace("title_ff_","",$fieldname);
 echo $fieldname ?>:</td><?php echo $NL ?>
 <td><?php 
 switch ($fieldname) {
 case "Nachricht" :
 $DATA[_FF_DATA_VALUE] = preg_replace('/(\\r\\n|\\r|\\n)/m','<br />',$DATA[_FF_DATA_VALUE]);
 break;
 case "Anschrift" :
 $DATA[_FF_DATA_VALUE] = preg_replace('/(\\r\\n|\\r|\\n)/m','<br />',$DATA[_FF_DATA_VALUE]);
 break;
 case "Infomat" :
 $DATA[_FF_DATA_VALUE] = ( $DATA[_FF_DATA_VALUE] == "cb") ? "gew&uuml;nscht" : "nicht gew&uuml;nscht";
 break;
 default :
 }
 echo $DATA[_FF_DATA_VALUE] ?>
 </td>
</tr><?php echo $NL ?>
<?php endforeach; ?>
 
<?php if ( $SUBMITTERID != 0 ) : ?>
<tr><?php echo $NL ?>
 <td>registriert als: </td><?php echo $NL ?>
 <td><?php echo $SUBMITTERFULLNAME ?> (User: <?php echo $SUBMITTERUSERNAME ." / ID: ". $SUBMITTERID ?>)</td><?php echo $NL ?>
</tr>
<?php endif; ?>
</table>
 
<br /><br /><?php echo $NL ?>
<hr />
<?php if ($RECORD_ID != ''): ?>
<?php echo $PROCESS_RECORDSAVEDID?> <?php echo $RECORD_ID ?><?php echo $NL ?>
<?php endif; ?>
<hr />
Interne techn. Angaben:<br /><?php echo $NL ?>
<font size="1" color="#A0A0A4">
<?php echo $PROCESS_FORMTITLE ?>: <?php echo $TITLE ?>(ID: <?php echo $FORM ?>)<br /><?php echo $NL ?>
<!-- <?php echo $PROCESS_FORMNAME ?>: <?php echo $NAME ?> --><?php echo $NL ?>
<!-- <?php echo $PROCESS_SUBMITTEDAT ?>: <?php echo $SUBMITTED ?> --><?php echo $NL ?>
<?php echo $PROCESS_SUBMITTERIP ?>: <?php echo $IP ?><br /><?php echo $NL ?>
<!-- <?php echo $PROCESS_PROVIDER ?>: <?php echo $PROVIDER ?> --><?php echo $NL ?>
<!-- <?php echo $PROCESS_BROWSER ?>: <?php echo $BROWSER ?> --><?php echo $NL ?>
<!-- <?php echo $PROCESS_OPSYS ?>: <?php echo $OPSYS ?> --><?php echo $NL ?>
</font>

  

  • Damit die an den Seitenbetreiber gesendeten Kontaktmail-Daten einfach beantwortet werden können, soll als automatische Antwort-Adresse die Adresse des Formular-absendenden Kunden genutz werden. Dazu ist im Mail-Header die Angabe für Reply-To zu setzten (nicht return-path, denn dieser ist für die Zustellung von Fehlermeldungen beim Absenden des Formulars relevant). Die Reply-To-Angabe wird einfach mit an den From-Paramter auf neuer Zeile (also getrennt durch ein \n übergeben). Also wichtig: Nach dem Absender muss erst ein \n folgen, dann die weiteren Angaben je auf neuer Zeile wie z.B. in diesem Mail-Header-Auszug zu sehen:
$empfaenger = "empf(at)domain.de";
$betreff = "Die Mail-Funktion";
$from = "From: Nils Reimers <absender(at)domain.de>\n";
$from .= "Reply-To: absender(at)domain.de\n";
$from .= "Content-Type: text/html\n";
$text = "Hier lernt Ihr, wie man mit <b>PHP</b> Mails verschickt";
 
mail($empfaenger, $betreff, $text, $from);

 

  • Das wichtigste Script in FacileForms ist components/com_facileforms/facileforms.process.php. Hier enthalten ist auch ab ca. Zeile 3183 die Funktion sendMail() die für das Versenden der Mails verantwortlich ist. Genutzt wird dazu allerding ein Breezing-Forms-Classobjekt bf_createMail() mit seiner Instanz $mail. bf_createMail wird definiert in components/com_facileforms/libraries/crosstec/functions/helpers.php und nutzt uneingeschränkt JFactory::getMailer() (in: /libraries/joomla/utitlities/utility.php). Diese Joomla-Mail-Funktion kennt einen Parameter $replyto und $replaytoname. Dem J!Mailobjekt können diese Informationen in der Form mit Mail-Adresse und Name als Array übergeben werden: $mail->addReplyTo(array($replytp,$replytoname).
  • In facileforms.process.php wird die Funktion sendMail() zweimal aufgerufen, einmal in sendEmailNotification() und einmal in sendEmailBackNotification(). Erstes ist relevant für das Absenden der Mail an den Betreiber und zweites für das evtl. - aber im projektfall aus Spam-Schutzgründen - deaktivierte Versenden der Rückmail an den Nutzer. Die Kunden/Absendermail wird nicht an die sendMail-Funktion als Parameter übergeben, weil sie nicht Bestandteil des Headers ist, sondern des Mail-Inhaltes. Deshalb liegt Sie lediglich im Array maildata und muss dort ausgelesen und der Funktion zusätzlich mit übergeben werden.
  • Dazu wird also in facileforms.process.php (FACILEFORMS-CORE-MODIFIKATION) am Anfang der Funktion sendMail() (beginnend ab Zeile 3182) ein Parameter $replyto hinzugefügt und damit erwartet und anschließend auch dem Objekt übergeben (erwartet wird ein Array). $replyto wird nach $html und vor $cc und $bcc eingefügt damit diese meist leeren nicht zwingend vor $replyto angegeben werden müssen, sondern weggelassen werden können:
function sendMail($from, $fromname, $recipient, $subject, $body
 , $attachment = NULL, $html = NULL
 , $replyto = NULL
 , $cc = NULL, $bcc = NULL)
 { 
 if ($this->dying) return;
 $mail = bf_createMail($from, $fromname, $subject, $body);
 
 $mail->addReplyTo( $replyto );
 
 if (is_array($recipient))
 foreach ($recipient as $to) $mail->AddAddress($to);

 

  • Am Ende der Funktion sendEmailNotification() (beginnend ab ca. Zeile 3281) wird zunächst aus den Formular-Inhaltsdaten die eMail-Adresse des Absenders aus dem Datenarray maildata ermittelt und der Kontaktname. Beide werden im Array $replyto abgelegt und anschließend erwartungskonform mit der Funktion sendMail() als zusätzlicher Parameter übergeben:

sendEmailNotification()

if ( $foundTpl && count($this->maildata) ) {
 foreach ( $this->maildata as $data ) {
 if ( $data[_FF_DATA_TITLE] == "title_ff_KontaktEMail" ) 
 $replytoMailAddr = $data[_FF_DATA_VALUE];
 if ( $data[_FF_DATA_TITLE] == "title_ff_KontaktName" )
 $replytoMailName = $data[_FF_DATA_VALUE];
 }
 if ( $replytoMailAddr ) $replyto = array($replytoMailAddr,$replytoMailName);
 }
 
 for($i = 0; $i < $recipientsSize;$i++){
 $this->sendMail($from, $fromname, $recipients[$i], $subject, $body, $attachment, $isHtml, $replyto );
 }
} // sendEmailNotification

 

UTF-8 Codiert

Damit die Mails umlautkorrekt sind, muss folgendes beachtet werden (Diese Erkenntnis gilt auf für Newsletter u.a. Ausgaben): Das Template muss gespeichert werden als UTF-8. Dazu im Dreamweaver am besten eine neue Datei anlegen. Wenn in der Konfig. für DW für neue Datei die Codierung UTF-8 eingestellt wird, wird diese automatisch als UTF-8 angelegt. Aufpassen, dass im Dateifenster unten rechts nicht „Westeuropäisch" steht. Im Template können dann ganz normale Umlaute geschrieben werden. Da Joomla auch auf UTF-8 eingerichtet ist wird im Mail-header ein Eintrag geschrieben

Content-Type: text/html; charset = "utf-8"
Content-Transfer-Encoding: 8bit 

Damit ist dann schon gewährleistet, dass die Mails sonderzeichenkonform dargestellt werden. Eine Kodierung in der Form &XX; ist nicht notwendig. Alternativ kann auch alles auf westeuropäisch umgestellt werden, was dann aber konsequent erfolgen muss (Joomla, Scripte, ...)

 

 

Wenn Ihnen dieser Beitrag geholfen und viel Zeit gespart hat, zeigen Sie sich erkenntlich: Über einen Klick auf Google+1 oder Rückmeldungen freue ich mich. Zeigen Sie mir, dass sich die Mühe für die Beitragerstellung gelohnt hat. Schenken Sie auch den Produktwerbungen Ihre Beachtung, denn damit wird mein Aufwand für diese Beiträge refinanziert.