yakamara / yform

YForm für REDAXO 5 – Formulare im Frontend und Backend mit Verwaltung von Datenbank-Tabellen.
MIT License
77 stars 54 forks source link

Action email : Reply Adresse als Parameter hinzufügen #1506

Open dalliclick opened 2 months ago

dalliclick commented 2 months ago

Bei der Verwendung der action in Kontaktformularen, lassen es die Policies von vielen Hostern nicht mehr zu, daß die from Adresse auf den Wert eines email Feldes des Formulars gesetzt wird. Hier wäre ein zusätzlicher Parameter für eine reply Adresse nützlich, auch wenn das eine gewisse Aufmerksamkeit des Benutzers erfordert, der die Mail beantwortet.

Besonders praktisch, wenn der Wert für den Parameter auch noch optional das Format NAME<MAILADRESSE> haben kann.

Hier wäre der von mir dazu geschriebene Code

` class rex_yform_action_email extends rex_yform_action_abstract {

    public function executeAction(): void
    {
        // see getDescription() below
        $aFormParams = array(
            'from' => $this->getElement(2),
            'reply' => $this->getElement(3),
            'to' => $this->getElement(4),
            'subject' => $this->getElement(5),
            'body' => $this->getElement(6)
        );

        // Arrays fuer Suchpattern und Ersetzung erstellen
        $aPregData = array();
        foreach ($this->params['value_pool']['email'] as $search => $replace) {
            $aPregData['pattern'][] = ":[#]{3}" . $search . "[#]{3}:";
            $aPregData['replace'][] = $replace;
            // wenn in +++ eingeschlossen -> urlencode() verwenden
            $aPregData['pattern'][] = ":[+]{3}" . $search . "[+]{3}:";
            $aPregData['replace'][] = urlencode($replace);
        }

        // Werte ersetzen
        foreach ($aFormParams as $label => $value) {
            $aFormParams[$label] = preg_replace($aPregData['pattern'], $aPregData['replace'], $aFormParams[$label]);
        }

        $mail = new rex_mailer();
        $mail->AddAddress($aFormParams['to'], $aFormParams['to']);

        // reply zerlegen in Name und Adresse
        if (! preg_match(":(.*)\<(.*)\>:", $aFormParams['reply'], $aHits)) {
            // nur Adresse
            $aReply = array("addr"=>$aFormParams['reply'],"name"=>"");
        }
        else {
            // Adresse & Name
            $aReply = array("addr"=>$aHits[2],"name"=>$aHits[1]);
        }
        $mail->AddReplyTo($aReply['addr'], $aReply['name']);

        $mail->WordWrap = 80;
        $mail->FromName = $aFormParams['from'];
        $mail->From = $aFormParams['from'];
        $mail->Sender = $aFormParams['from'];
        $mail->Subject = $aFormParams['subject'];
        $mail->Body = nl2br($aFormParams['body']);
        $mail->AltBody = strip_tags($aFormParams['body']);
        if (isset($this->params['value_pool']['email_attachments']) && is_array($this->params['value_pool']['email_attachments'])) {
            foreach ($this->params['value_pool']['email_attachments'] as $v) {
                $mail->AddAttachment($v[1], $v[0]);
            }
        }
        // $mail->IsHTML(true);
        $mail->Send();
    }

    public function getDescription(): string
    {
        return 'action|email|from@email.de|[ReplyName]&lt;reply@email.de&gt;|to@email.de|Mailsubject|Mailbody###name###';
    }
}

`