Versenden von E-Mails
Wollen Sie E-Mails wie Newsletter oder Auftragsbestätigungen versenden? Nette Framework bietet die notwendigen Werkzeuge mit einer sehr schönen API. Wir werden es zeigen:
- wie man eine E-Mail erstellt, einschließlich Anhängen
- wie man sie versendet
- wie man E-Mails und Vorlagen kombiniert
Einrichtung
Laden Sie das Paket herunter und installieren Sie es mit Composer:
composer require nette/mail
Emails erstellen
E-Mail ist ein Nette\Mail\Message Objekt:
$mail = new Nette\Mail\Message;
$mail->setFrom('John <john@example.com>')
->addTo('peter@example.com')
->addTo('jack@example.com')
->setSubject('Order Confirmation')
->setBody("Hello, Your order has been accepted.");
Alle Parameter müssen in UTF-8 kodiert sein.
Neben der Angabe von Empfängern mit der Methode addTo()
können Sie auch den Empfänger einer Kopie mit
addCc()
oder den Empfänger einer Blindkopie mit addBcc()
angeben. Alle diese Methoden, einschließlich
setFrom()
, akzeptieren den Adressaten auf drei Arten:
$mail->setFrom('john.doe@example.com');
$mail->setFrom('john.doe@example.com', 'John Doe');
$mail->setFrom('John Doe <john.doe@example.com>');
Der Textkörper einer in HTML geschriebenen E-Mail wird mit der Methode setHtmlBody()
übergeben:
$mail->setHtmlBody('<p>Hello,</p><p>Your order has been accepted.</p>');
Sie müssen keine Textalternative erstellen, Nette generiert sie automatisch für Sie. Und wenn die E-Mail keinen Betreff hat,
wird dieser aus dem <title>
Element.
Auch Bilder lassen sich sehr einfach in den HTML-Text einer E-Mail einfügen. Übergeben Sie einfach den Pfad, in dem sich die Bilder physisch befinden, als zweiten Parameter, und Nette fügt sie automatisch in die E-Mail ein:
// fügt automatisch /path/to/images/background.gif in die E-Mail ein
$mail->setHtmlBody(
'<b>Hello</b> <img src="background.gif">',
'/path/to/images',
);
Der Algorithmus zum Einbetten von Bildern unterstützt die folgenden Muster: <img src=...>
,
<body background=...>
, url(...)
innerhalb des HTML-Attributs style
und die spezielle
Syntax [[...]]
.
Kann das Versenden von E-Mails noch einfacher sein?
E-Mails sind wie Postkarten. Senden Sie niemals Passwörter oder andere Anmeldeinformationen per E-Mail.
Anhänge
Sie können natürlich auch Anhänge an E-Mails anhängen. Verwenden Sie dazu die
addAttachment(string $file, ?string $content = null, ?string $contentType = null)
.
// fügt die Datei /path/to/example.zip in die E-Mail unter dem Namen example.zip ein
$mail->addAttachment('/path/to/example.zip');
// fügt die Datei /path/to/example.zip in die E-Mail mit dem Namen info.zip ein
$mail->addAttachment('info.zip', file_get_contents('/path/to/example.zip'));
// Hängt den Inhalt der neuen Datei example.txt an "Hello John!"
$mail->addAttachment('example.txt', 'Hello John!');
Schablonen
Wenn Sie HTML-E-Mails versenden, ist es eine gute Idee, diese im Latte-Vorlagensystem zu schreiben. Wie man das macht?
$latte = new Latte\Engine;
$params = [
'orderId' => 123,
];
$mail = new Nette\Mail\Message;
$mail->setFrom('John <john@example.com>')
->addTo('jack@example.com')
->setHtmlBody(
$latte->renderToString('/path/to/email.latte', $params),
'/path/to/images',
);
Datei email.latte
:
<html>
<head>
<meta charset="utf-8">
<title>Order Confirmation</title>
<style>
body {
background: url("background.png")
}
</style>
</head>
<body>
<p>Hello,</p>
<p>Your order number {$orderId} has been accepted.</p>
</body>
</html>
Nette fügt automatisch alle Bilder ein, setzt den Betreff entsprechend dem <title>
Element ein und erzeugt
einen Alternativtext für den HTML-Body.
Verwendung in der Nette-Anwendung
Wenn Sie E-Mails zusammen mit Nette Application verwenden, z.B. Moderatoren, möchten Sie vielleicht Links in Vorlagen mit dem
n:href
Attribut oder dem {link}
Tag erstellen. Latte kennt diese grundsätzlich nicht, aber es ist sehr
einfach, sie hinzuzufügen. Das Erstellen von Links kann das Objekt Nette\Application\LinkGenerator
tun, das Sie
durch Übergabe mittels Dependency Injection erhalten.
use Nette;
class MailSender
{
public function __construct(
private Nette\Application\LinkGenerator $linkGenerator,
private Nette\Bridges\ApplicationLatte\TemplateFactory $templateFactory,
) {
}
private function createTemplate(): Nette\Application\UI\Template
{
$template = $this->templateFactory->createTemplate();
$template->getLatte()->addProvider('uiControl', $this->linkGenerator);
return $template;
}
public function createEmail(): Nette\Mail\Message
{
$template = $this->createTemplate();
$html = $template->renderToString('/path/to/email.latte', $params);
$mail = new Nette\Mail\Message;
$mail->setHtmlBody($html);
// ...
return $mail;
}
}
In der Vorlage wird der Link wie in einer normalen Vorlage erstellt. Alle über LinkGenerator erstellten Links sind absolut:
<a n:href="Presenter:action">Link</a>
Emails verschicken
Mailer ist die Klasse, die für den Versand von E-Mails zuständig ist. Sie implementiert die Schnittstelle Nette\Mail\Mailer und es gibt mehrere fertige Mailer, die wir vorstellen werden.
Das Framework fügt dem DI-Container automatisch einen auf der Konfiguration basierenden
Nette\Mail\Mailer
-Dienst hinzu, den Sie durch Übergabe mittels Dependency Injection erhalten.
SendmailMailer
Der Standard-Mailer ist SendmailMailer, der die PHP-Funktion mail verwendet. Beispiel für die Verwendung:
$mailer = new Nette\Mail\SendmailMailer;
$mailer->send($mail);
Wenn Sie returnPath
setzen wollen und der Server es trotzdem überschreibt, verwenden Sie
$mailer->commandArgs = '-fmy@email.com'
.
SmtpMailer
Um E-Mails über den SMTP-Server zu versenden, verwenden Sie SmtpMailer
.
$mailer = new Nette\Mail\SmtpMailer(
host: 'smtp.gmail.com',
username: 'franta@gmail.com',
password: '*****',
encryption: 'ssl',
);
$mailer->send($mail);
Die folgenden zusätzlichen Parameter können an den Konstruktor übergeben werden:
port
– wenn nicht gesetzt, wird der Standardwert 25 oder 465 fürssl
verwendettimeout
– Timeout für SMTP-Verbindungpersistent
– persistente Verbindung verwendenclientHost
– Client-BezeichnungstreamOptions
– ermöglicht die Einstellung von SSL-Kontextoptionen für die Verbindung
FallbackMailer
Der FallbackMailer versendet keine E-Mails, sondern sendet sie über eine Reihe von Mailern. Wenn ein Mailer fehlschlägt, wiederholt er den Versuch beim nächsten Mailer. Wenn der letzte fehlschlägt, beginnt er wieder mit dem ersten.
$mailer = new Nette\Mail\FallbackMailer([
$smtpMailer,
$backupSmtpMailer,
$sendmailMailer,
]);
$mailer->send($mail);
Weitere Parameter im Konstruktor sind die Anzahl der Wiederholungen und die Wartezeit in Millisekunden.
DKIM
DKIM (DomainKeys Identified Mail) ist eine vertrauenswürdige E-Mail-Technologie, die auch hilft, gefälschte Nachrichten zu erkennen. Die gesendete Nachricht wird mit dem privaten Schlüssel der Domäne des Absenders signiert, und diese Signatur wird in der Kopfzeile der E-Mail gespeichert. Der Server des Empfängers vergleicht diese Signatur mit dem öffentlichen Schlüssel, der in den DNS-Einträgen der Domäne gespeichert ist. Durch den Abgleich der Signatur wird nachgewiesen, dass die E-Mail tatsächlich von der Domäne des Absenders stammt und dass die Nachricht während der Übertragung nicht verändert wurde.
Sie können den Mailer in der Konfiguration so einrichten, dass er E-Mails signiert. Wenn Sie die Dependency Injection nicht verwenden, wird sie wie folgt eingesetzt:
$signer = new Nette\Mail\DkimSigner(
domain: 'nette.org',
selector: 'dkim',
privateKey: file_get_contents('../dkim/dkim.key'),
passPhrase: '****',
);
$mailer = new Nette\Mail\SendmailMailer; // oder SmtpMailer
$mailer->setSigner($signer);
$mailer->send($mail);
Konfigurieren von
Überblick über die Konfigurationsmöglichkeiten für Nette Mail. Wenn Sie nicht das gesamte Framework, sondern nur diese Bibliothek verwenden, lesen Sie , wie Sie die Konfiguration laden.
Standardmäßig wird zum Versenden von E-Mails der Mailer Nette\Mail\SendmailMailer
verwendet, der nicht weiter
konfiguriert ist. Wir können ihn jedoch auf Nette\Mail\SmtpMailer
umstellen:
mail:
# SmtpMailer verwenden
smtp: true # (bool) ist standardmäßig auf false eingestellt
host: ... # (string)
port: ... # (int)
username: ... # (string)
password: ... # (Zeichenkette)
timeout: ... # (int)
encryption: ... # (ssl|tls|null) Standardwert ist null (hat den Alias 'secure')
clientHost: ... # (string) Standardwert ist $_SERVER['HTTP_HOST']
persistent: ... # (bool) Standardwert ist false
# Kontext für die Verbindung zum SMTP-Server, Standardwert ist stream_context_get_default()
context :
ssl: # alle Optionen unter https://www.php.net/manual/en/context.ssl.php
allow_self_signed: ...
...
http: # alle Optionen unter https://www.php.net/manual/en/context.http.php
header: ...
...
Sie können die Authentifizierung von SSL-Zertifikaten mit der Option context › ssl › verify_peer: false
deaktivieren. Es wird strengstens empfohlen, dies nicht zu tun, da es die Anwendung angreifbar macht. Fügen Sie
stattdessen Zertifikate zum Vertrauensspeicher hinzu.
Um die Vertrauenswürdigkeit zu erhöhen, können wir E-Mails mit der DKIM-Technologie signieren:
mail:
dkim:
domain: myweb.com
selector: lovenette
privateKey: %appDir%/cert/dkim.priv
passPhrase: ...
DI-Dienste
Diese Dienste werden dem DI-Container hinzugefügt:
Name | Typ | Beschreibung |
---|---|---|
mail.mailer |
Nette\Mail\Mailer | E-Mail-Versandklasse |
mail.signer |
Nette\Mail\Signer | DKIM-Signierung |