Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου
Ετοιμάζεστε να στείλετε μηνύματα ηλεκτρονικού ταχυδρομείου, όπως ενημερωτικά δελτία ή επιβεβαιώσεις παραγγελιών; Το Nette Framework παρέχει τα απαραίτητα εργαλεία με ένα πολύ φιλικό API. Θα δείξουμε:
- πώς να δημιουργήσετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου, συμπεριλαμβανομένων των συνημμένων
- πώς να το στείλετε
- πώς να συνδυάσετε μηνύματα ηλεκτρονικού ταχυδρομείου και templates
Εγκατάσταση
Μπορείτε να κατεβάσετε και να εγκαταστήσετε τη βιβλιοθήκη χρησιμοποιώντας το Composer:
composer require nette/mail
Δημιουργία μηνύματος ηλεκτρονικού ταχυδρομείου
Το μήνυμα ηλεκτρονικού ταχυδρομείου είναι ένα αντικείμενο της κλάσης Nette\Mail\Message. Ας το δημιουργήσουμε ως εξής:
$mail = new Nette\Mail\Message;
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->addTo('jirka@example.com')
->setSubject('Potvrzení objednávky') // Order Confirmation
->setBody("Dobrý den,\nvaše objednávka byla přijata."); // Hello,\nyour order has been accepted.
Όλες οι παρεχόμενες παράμετροι πρέπει να είναι σε UTF-8.
Εκτός από τον καθορισμό του παραλήπτη με τη μέθοδο addTo()
,
μπορείτε επίσης να καθορίσετε έναν παραλήπτη CC addCc()
ή έναν
παραλήπτη BCC addBcc()
. Σε όλες αυτές τις μεθόδους,
συμπεριλαμβανομένης της setFrom()
, μπορούμε να γράψουμε τον
παραλήπτη με τρεις τρόπους:
$mail->setFrom('franta@example.com');
$mail->setFrom('franta@example.com', 'Franta');
$mail->setFrom('Franta <franta@example.com>');
Το σώμα του μηνύματος ηλεκτρονικού ταχυδρομείου γραμμένο σε HTML
περνιέται χρησιμοποιώντας τη μέθοδο setHtmlBody()
:
$mail->setHtmlBody('<p>Dobrý den,</p><p>vaše objednávka byla přijata.</p>'); // <p>Hello,</p><p>your order has been accepted.</p>
Δεν χρειάζεται να δημιουργήσετε μια εναλλακτική λύση κειμένου, το Nette
θα τη δημιουργήσει αυτόματα για εσάς. Και αν το μήνυμα ηλεκτρονικού
ταχυδρομείου δεν έχει ορισμένο θέμα, θα προσπαθήσει να το πάρει από το
στοιχείο <title>
.
Μπορείτε επίσης να εισαγάγετε εικόνες στο σώμα HTML εξαιρετικά εύκολα. Απλώς περάστε τη διαδρομή όπου βρίσκονται φυσικά οι εικόνες ως δεύτερη παράμετρο, και το Nette θα τις συμπεριλάβει αυτόματα στο μήνυμα ηλεκτρονικού ταχυδρομείου:
// automatically adds /path/to/images/background.gif to the email
$mail->setHtmlBody(
'<b>Hello</b> <img src="background.gif">',
'/path/to/images',
);
Ο αλγόριθμος που εισάγει εικόνες αναζητά αυτά τα πρότυπα:
<img src=...>
, <body background=...>
, url(...)
μέσα στο attribute HTML
style
, και την ειδική σύνταξη [[...]]
.
Μπορεί η αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου να γίνει ακόμα πιο εύκολη;
Ένα μήνυμα ηλεκτρονικού ταχυδρομείου είναι σαν μια ταχυδρομική κάρτα. Ποτέ μην στέλνετε κωδικούς πρόσβασης ή άλλα διαπιστευτήρια μέσω μηνύματος ηλεκτρονικού ταχυδρομείου.
Συνημμένα
Φυσικά, μπορείτε να επισυνάψετε συνημμένα στο μήνυμα ηλεκτρονικού
ταχυδρομείου. Η μέθοδος
addAttachment(string $file, ?string $content = null, ?string $contentType = null)
χρησιμοποιείται
για αυτόν τον σκοπό.
// inserts the file /path/to/example.zip into the email under the name example.zip
$mail->addAttachment('/path/to/example.zip');
// inserts the file /path/to/example.zip named info.zip into the email
$mail->addAttachment('info.zip', file_get_contents('/path/to/example.zip'));
// inserts the file example.txt with the content "Hello John!" into the email
$mail->addAttachment('example.txt', 'Hello John!');
Templates
Αν στέλνετε μηνύματα ηλεκτρονικού ταχυδρομείου HTML, είναι φυσικό να τα γράφετε στο σύστημα προτύπων Latte. Πώς να το κάνετε;
$latte = new Latte\Engine;
$params = [
'orderId' => 123,
];
$mail = new Nette\Mail\Message;
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->setHtmlBody(
$latte->renderToString('/path/to/email.latte', $params),
'/path/to/images',
);
Αρχείο email.latte
:
<html>
<head>
<meta charset="utf-8">
<title>Potvrzení objednávky</title> <!-- Order Confirmation -->
<style>
body {
background: url("background.png")
}
</style>
</head>
<body>
<p>Dobrý den,</p> <!-- Hello, -->
<p>Vaše objednávka číslo {$orderId} byla přijata.</p> <!-- Your order number {$orderId} has been accepted. -->
</body>
</html>
Το Nette εισάγει αυτόματα όλες τις εικόνες, ορίζει το θέμα σύμφωνα με το
στοιχείο <title>
και δημιουργεί μια εναλλακτική λύση κειμένου
για το HTML.
Χρήση στην εφαρμογή Nette
Αν χρησιμοποιείτε μηνύματα ηλεκτρονικού ταχυδρομείου μαζί με την Nette
Application, δηλαδή με presenters, μπορεί να θέλετε να δημιουργήσετε συνδέσμους
στα templates χρησιμοποιώντας το attribute n:href
ή το tag {link}
. Το Latte
δεν τα γνωρίζει από προεπιλογή, αλλά είναι πολύ εύκολο να τα
προσθέσετε. Το αντικείμενο Nette\Application\LinkGenerator
μπορεί να
δημιουργήσει συνδέσμους, και μπορείτε να το αποκτήσετε περνώντας το
χρησιμοποιώντας dependency
injection:
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;
}
}
Στο template, δημιουργούμε συνδέσμους όπως έχουμε συνηθίσει. Όλοι οι σύνδεσμοι που δημιουργούνται μέσω του LinkGenerator θα είναι απόλυτοι.
<a n:href="Presenter:action">Odkaz</a> <!-- Link -->
Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου
Ο Mailer είναι μια κλάση που χειρίζεται την αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου. Υλοποιεί το interface Nette\Mail\Mailer και υπάρχουν αρκετοί προκατασκευασμένοι mailers διαθέσιμοι, τους οποίους θα παρουσιάσουμε.
Το Framework προσθέτει αυτόματα μια υπηρεσία τύπου Nette\Mail\Mailer
στο DI
container, διαμορφωμένη βάσει της konfigurace, στην οποία
μπορείτε να αποκτήσετε πρόσβαση περνώντας την χρησιμοποιώντας dependency injection.
SendmailMailer
Ο προεπιλεγμένος mailer είναι ο SendmailMailer, ο οποίος χρησιμοποιεί τη συνάρτηση PHP mail. Παράδειγμα χρήσης:
$mailer = new Nette\Mail\SendmailMailer;
$mailer->send($mail);
Αν θέλετε να ορίσετε το returnPath
και ο διακομιστής σας το
αντικαθιστά συνεχώς, χρησιμοποιήστε $mailer->commandArgs = '-fMuj@email.cz'
.
SmtpMailer
Ο SmtpMailer
χρησιμοποιείται για την αποστολή αλληλογραφίας μέσω
ενός διακομιστή SMTP.
$mailer = new Nette\Mail\SmtpMailer(
host: 'smtp.gmail.com',
username: 'franta@gmail.com',
password: '*****',
encryption: 'ssl',
);
$mailer->send($mail);
Οι ακόλουθες πρόσθετες παράμετροι μπορούν να περάσουν στον κατασκευαστή:
port
– αν δεν οριστεί, χρησιμοποιείται η προεπιλογή 25 ή 465 γιαssl
timeout
– timeout για τη σύνδεση SMTPpersistent
– χρήση μόνιμης σύνδεσηςclientHost
– ρύθμιση της κεφαλίδας Host του clientstreamOptions
– επιτρέπει τη ρύθμιση των SSL context options για τη σύνδεση
FallbackMailer
Δεν στέλνει απευθείας μηνύματα ηλεκτρονικού ταχυδρομείου, αλλά μεσολαβεί στην αποστολή μέσω ενός συνόλου mailers. Αν ένας mailer αποτύχει, επαναλαμβάνει την προσπάθεια με τον επόμενο. Αν και ο τελευταίος αποτύχει, ξεκινά ξανά από τον πρώτο.
$mailer = new Nette\Mail\FallbackMailer([
$smtpMailer,
$backupSmtpMailer,
$sendmailMailer,
]);
$mailer->send($mail);
Ως πρόσθετες παράμετροι στον κατασκευαστή, μπορούμε να καθορίσουμε τον αριθμό των επαναλήψεων και τον χρόνο αναμονής σε χιλιοστά του δευτερολέπτου.
DKIM
Το DKIM (DomainKeys Identified Mail) είναι μια τεχνολογία για την αύξηση της αξιοπιστίας των μηνυμάτων ηλεκτρονικού ταχυδρομείου, η οποία βοηθά επίσης στην ανίχνευση πλαστών μηνυμάτων. Το απεσταλμένο μήνυμα υπογράφεται με το ιδιωτικό κλειδί του τομέα του αποστολέα και αυτή η υπογραφή αποθηκεύεται στην κεφαλίδα του μηνύματος ηλεκτρονικού ταχυδρομείου. Ο διακομιστής του παραλήπτη συγκρίνει αυτήν την υπογραφή με το δημόσιο κλειδί που είναι αποθηκευμένο στις εγγραφές DNS του τομέα. Εάν η υπογραφή ταιριάζει, αποδεικνύεται ότι το μήνυμα ηλεκτρονικού ταχυδρομείου προέρχεται πράγματι από τον τομέα του αποστολέα και ότι δεν υπήρξε τροποποίηση κατά τη μεταφορά του μηνύματος.
Μπορείτε να ρυθμίσετε την υπογραφή μηνυμάτων ηλεκτρονικού ταχυδρομείου για τον mailer απευθείας στη διαμόρφωση. Αν δεν χρησιμοποιείτε dependency injection, χρησιμοποιείται με αυτόν τον τρόπο:
$signer = new Nette\Mail\DkimSigner(
domain: 'nette.org',
selector: 'dkim',
privateKey: file_get_contents('../dkim/dkim.key'),
passPhrase: '****',
);
$mailer = new Nette\Mail\SendmailMailer; // or SmtpMailer
$mailer->setSigner($signer);
$mailer->send($mail);
Διαμόρφωση
Επισκόπηση των επιλογών διαμόρφωσης για το Nette Mail. Αν δεν χρησιμοποιείτε ολόκληρο το framework, αλλά μόνο αυτή τη βιβλιοθήκη, διαβάστε πώς να φορτώσετε τη διαμόρφωση.
Για την αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου,
χρησιμοποιείται από προεπιλογή ο mailer Nette\Mail\SendmailMailer
, ο οποίος
δεν διαμορφώνεται περαιτέρω. Ωστόσο, μπορούμε να τον αλλάξουμε σε
Nette\Mail\SmtpMailer
:
mail:
# use SmtpMailer
smtp: true # (bool) default is false
host: ... # (string)
port: ... # (int)
username: ... # (string)
password: ... # (string)
timeout: ... # (int)
encryption: ... # (ssl|tls|null) default is null (has alias 'secure')
clientHost: ... # (string) default is $_SERVER['HTTP_HOST']
persistent: ... # (bool) default is false
# context for connecting to the SMTP server, default is stream_context_get_default()
context:
ssl: # overview of options at https://www.php.net/manual/en/context.ssl.php
allow_self_signed: ...
...
http: # overview of options at https://www.php.net/manual/en/context.http.php
header: ...
...
Χρησιμοποιώντας την επιλογή context › ssl › verify_peer: false
, μπορείτε να
απενεργοποιήσετε την επαλήθευση των πιστοποιητικών SSL. Συνιστούμε
έντονα να μην το κάνετε αυτό, καθώς η εφαρμογή θα γίνει ευάλωτη. Αντ'
αυτού, προσθέστε τα πιστοποιητικά
στην αποθήκη.
Για να αυξήσουμε την αξιοπιστία, μπορούμε να υπογράφουμε τα μηνύματα ηλεκτρονικού ταχυδρομείου χρησιμοποιώντας την τεχνολογία DKIM:
mail:
dkim:
domain: myweb.com
selector: lovenette
privateKey: %appDir%/cert/dkim.priv
passPhrase: ...
Υπηρεσίες DI
Αυτές οι υπηρεσίες προστίθενται στο DI container:
Όνομα | Τύπος | Περιγραφή |
---|---|---|
mail.mailer |
Nette\Mail\Mailer | κλάση που στέλνει μηνύματα ηλεκτρονικού ταχυδρομείου |
mail.signer |
Nette\Mail\Signer | Υπογραφή DKIM |