Achtung: bei den Passwörtern für die Postfächer scheint imap_open() keine %-Zeichen zu mögen.
Mit composer require symfony/mailer den Mailer installieren.
Für den Fall, dass unter DDEV gearbeitet wird, muss in die config.yaml der Befehl webimage_extra_packages: ["php${DDEV_PHP_VERSION}-imap"] eingefügt werden.
Im Verzeichnis src/Service die Datei MailerService.php erstellen:
<?php
namespace App\Service;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
class MailerService {
private $mailer;
private $imapInfo;
private $imapSent;
private $imapInvoice;
public function __construct(MailerInterface $mailer)
{
$this->mailer = $mailer;
$this->imapInvoice = imap_open('{' . $_SERVER["IMAP_HOSTNAME"] . ':993/imap/ssl}INBOX', $_SERVER["IMAP_MAILBOX"], $_SERVER["IMAP_USERPW"]);
$this->imapInfo = imap_open('{' . $_SERVER["IMAP_HOSTNAME"] . ':993/imap/ssl}INBOX', $_SERVER["IMAP_COMM"], $_SERVER["IMAP_COMM_PW"]);
$this->imapSent = '{' . $_SERVER["IMAP_HOSTNAME"] . ':993/imap/ssl}Sent Items';
}
/**
* @param Email $email
* @param $box which mailbox to use: invoice or info
* @return string|true
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
*/
public function sendEmail(Email $email, $box)
{
try {
$this->mailer->send($email);
} catch (\Exception $e) {
return "Fehler: " . $e->getMessage();
}
if ($box == "info") {
try {
imap_append($this->imapInfo, $this->imapSent, $email->toString(), '');
} catch (\Exception $e) {
return "Fehler: " . $e->getMessage();
}
return true;
} elseif ($box == "invoice") {
try {
imap_append($this->imapInvoice, $this->imapSent, $email->toString(), '');
} catch (\Exception $e) {
return "Fehler: " . $e->getMessage();
}
} else {
return "Fehler: gewähltes Postfach gibt es nicht";
}
return true;
}
Dieser Code geht davon aus, dass zwei eMailadressen für den Versand möglich sind: rechnung und info. Definiert werden beide, wie auch die anderen Serverdaten, in der .env. Das heißt, diese Informationen dürfen nicht fehlen und wenn es mehr eMailadressen zur Auswahl gibt, dann die .env und den Code entsprechend ergänzen.
Im Controller dann wie gewohnt zunächst die eMail aufbauen und dann den eben erstellen Service aufrufen:
$email = (new Email())
->from($_SERVER["MAIL_ABSENDER"])
->to($user->getEmail())
->subject("Passwort zurücksetzen")
->html($text);
// send email
$success = false;
$success = $mailerService->sendEmail($email, "info");
if ($success) {
$this->addFlash("success", "Wenn diese eMailadresse gefunden wird, wird eine eMail mit einem Link dorthin geschickt.");
} else {
$this->addFlash("error", "Fehlermeldung konnte nicht gemailt werden: $success");
}