Ταχυδρομείο

Αποστολή
Emails

Αποστολή emails

Σκοπεύετε να στέλνετε μηνύματα ηλεκτρονικού ταχυδρομείου, όπως ενημερωτικά δελτία ή επιβεβαιώσεις παραγγελιών; Το Nette Framework παρέχει τα απαραίτητα εργαλεία με ένα πολύ ωραίο API. Θα σας δείξουμε:

  • πώς να δημιουργήσετε ένα email, συμπεριλαμβανομένων των συνημμένων αρχείων
  • πώς να το στείλετε
  • πώς να συνδυάζετε μηνύματα ηλεκτρονικού ταχυδρομείου και πρότυπα

Εγκατάσταση

Κατεβάστε και εγκαταστήστε το πακέτο χρησιμοποιώντας το Composer:

composer require nette/mail

Composer: Δημιουργία μηνυμάτων ηλεκτρονικού ταχυδρομείου

Το ηλεκτρονικό ταχυδρομείο είναι ένα αντικείμενο Nette\Mail\Message:

$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.");

Όλες οι παράμετροι πρέπει να είναι κωδικοποιημένες σε UTF-8.

Εκτός από τον προσδιορισμό των παραληπτών με τη μέθοδο addTo(), μπορείτε επίσης να προσδιορίσετε τον παραλήπτη της αντιγραφής με τη μέθοδο addCc() ή τον παραλήπτη της τυφλής αντιγραφής με τη μέθοδο addBcc(). Όλες αυτές οι μέθοδοι, συμπεριλαμβανομένου του setFrom(), δέχονται τον παραλήπτη με τρεις τρόπους:

$mail->setFrom('john.doe@example.com');
$mail->setFrom('john.doe@example.com', 'John Doe');
$mail->setFrom('John Doe <john.doe@example.com>');

Το σώμα ενός ηλεκτρονικού ταχυδρομείου γραμμένου σε HTML περνάει με τη μέθοδο setHtmlBody():

$mail->setHtmlBody('<p>Hello,</p><p>Your order has been accepted.</p>');

Η Nette θα το δημιουργήσει αυτόματα για εσάς. Και αν το μήνυμα ηλεκτρονικού ταχυδρομείου δεν έχει οριστεί θέμα, αυτό θα ληφθεί από το αρχείο <title> στοιχείο.

Οι εικόνες μπορούν επίσης να εισαχθούν εξαιρετικά εύκολα στο σώμα HTML ενός email. Απλώς περάστε τη διαδρομή όπου βρίσκονται φυσικά οι εικόνες ως δεύτερη παράμετρο και η Nette θα τις συμπεριλάβει αυτόματα στο email:

// προσθέτει αυτόματα το /path/to/images/background.gif στο email
$mail->setHtmlBody(
	'<b>Hello</b> <img src="background.gif">',
	'/path/to/images',
);

Ο αλγόριθμος ενσωμάτωσης εικόνων υποστηρίζει τα ακόλουθα πρότυπα: <img src=...>, <body background=...>, url(...) μέσα στο χαρακτηριστικό HTML style και ειδική σύνταξη [[...]].

Μπορεί η αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου να γίνει ακόμη πιο εύκολη;

Τα ηλεκτρονικά μηνύματα είναι σαν τις καρτ ποστάλ. Ποτέ μην στέλνετε κωδικούς πρόσβασης ή άλλα διαπιστευτήρια μέσω ηλεκτρονικού ταχυδρομείου.

Συνημμένα αρχεία

Μπορείτε, φυσικά, να επισυνάπτετε συνημμένα αρχεία στο ηλεκτρονικό ταχυδρομείο. Χρησιμοποιήστε το addAttachment(string $file, ?string $content = null, ?string $contentType = null).

// εισάγει το αρχείο /path/to/example.zip στο email με το όνομα example.zip
$mail->addAttachment('/path/to/example.zip');

// εισάγει το αρχείο /path/to/example.zip στο email με το όνομα info.zip
$mail->addAttachment('info.zip', file_get_contents('/path/to/example.zip'));

// επισυνάπτει τα περιεχόμενα του νέου αρχείου example.txt "Hello John!"
$mail->addAttachment('example.txt', 'Hello John!');

Πρότυπα

Εάν στέλνετε μηνύματα ηλεκτρονικού ταχυδρομείου HTML, είναι μια πολύ καλή ιδέα να τα γράψετε στο σύστημα προτύπων Latte. Πώς να το κάνετε;

$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',
	);

Αρχείο 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 εισάγει αυτόματα όλες τις εικόνες, θέτει το θέμα σύμφωνα με το <title> στοιχείο, και δημιουργεί εναλλακτικό κείμενο για το σώμα της HTML.

Χρήση στην εφαρμογή Nette

Εάν χρησιμοποιείτε e-mail μαζί με το Nette Application, δηλαδή παρουσιαστές, ίσως θελήσετε να δημιουργήσετε συνδέσμους σε πρότυπα χρησιμοποιώντας το χαρακτηριστικό n:href ή την ετικέτα {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;
	}
}

Στο πρότυπο, ο σύνδεσμος δημιουργείται όπως σε ένα κανονικό πρότυπο. Όλοι οι σύνδεσμοι που δημιουργούνται μέσω του LinkGenerator είναι απόλυτοι:

<a n:href="Presenter:action">Link</a>

Αποστολή Emails

Ο Mailer είναι η κατηγορία που είναι υπεύθυνη για την αποστολή emails. Υλοποιεί τη διεπαφή Nette\Mail\Mailer και υπάρχουν αρκετοί έτοιμοι mailers τους οποίους θα παρουσιάσουμε.

Το πλαίσιο προσθέτει αυτόματα μια υπηρεσία Nette\Mail\Mailer με βάση τη διαμόρφωση στο DI container, την οποία παίρνετε περνώντας την χρησιμοποιώντας dependency injection.

SendmailMailer

Ο προεπιλεγμένος αποστολέας είναι ο SendmailMailer που χρησιμοποιεί τη συνάρτηση PHP mail. Παράδειγμα χρήσης:

$mailer = new Nette\Mail\SendmailMailer;
$mailer->send($mail);

Αν θέλετε να ορίσετε το returnPath και ο διακομιστής εξακολουθεί να το αντικαθιστά, χρησιμοποιήστε το $mailer->commandArgs = '-fmy@email.com'.

SmtpMailer

Για να στείλετε μήνυμα μέσω του διακομιστή SMTP, χρησιμοποιήστε το SmtpMailer.

$mailer = new Nette\Mail\SmtpMailer(
	host: 'smtp.gmail.com',
	username: 'franta@gmail.com',
	password: '*****',
	encryption: 'ssl',
);
$mailer->send($mail);

Οι ακόλουθες πρόσθετες παράμετροι μπορούν να περάσουν στον κατασκευαστή:

  • port – εάν δεν οριστεί, θα χρησιμοποιηθεί η προεπιλεγμένη τιμή 25 ή 465 για το ssl.
  • timeout – χρονικό όριο για τη σύνδεση SMTP
  • persistent – χρήση μόνιμης σύνδεσης
  • clientHost – ονομασία πελάτη
  • streamOptions – σας επιτρέπει να ορίσετε SSL context options για τη σύνδεση

FallbackMailer

Δεν στέλνει μηνύματα ηλεκτρονικού ταχυδρομείου αλλά τα αποστέλλει μέσω ενός συνόλου αποστολέων αλληλογραφίας. Εάν ένας αποστολέας αποτύχει, επαναλαμβάνει την προσπάθεια στον επόμενο. Εάν ο τελευταίος αποτύχει, ξεκινά ξανά από τον πρώτο.

$mailer = new Nette\Mail\FallbackMailer([
	$smtpMailer,
	$backupSmtpMailer,
	$sendmailMailer,
]);
$mailer->send($mail);

Άλλες παράμετροι στον κατασκευαστή περιλαμβάνουν τον αριθμό των επαναλήψεων και το χρόνο αναμονής σε χιλιοστά του δευτερολέπτου.

DKIM

Το DKIM (DomainKeys Identified Mail) είναι μια αξιόπιστη τεχνολογία ηλεκτρονικού ταχυδρομείου που βοηθά επίσης στον εντοπισμό παραποιημένων μηνυμάτων. Το μήνυμα που αποστέλλεται υπογράφεται με το ιδιωτικό κλειδί του τομέα του αποστολέα και η υπογραφή αυτή αποθηκεύεται στην επικεφαλίδα του ηλεκτρονικού ταχυδρομείου. Ο διακομιστής του παραλήπτη συγκρίνει αυτή την υπογραφή με το δημόσιο κλειδί που είναι αποθηκευμένο στις εγγραφές DNS του τομέα. Με την αντιστοίχιση της υπογραφής αποδεικνύεται ότι το μήνυμα ηλεκτρονικού ταχυδρομείου προέρχεται πράγματι από τον τομέα του αποστολέα και ότι το μήνυμα δεν τροποποιήθηκε κατά τη διάρκεια της μετάδοσης του μηνύματος.

Μπορείτε να ρυθμίσετε το mailer να υπογράφει τα μηνύματα ηλεκτρονικού ταχυδρομείου στη ρύθμιση παραμέτρων. Εάν δεν χρησιμοποιείτε την έγχυση εξάρτησης, χρησιμοποιείται ως εξής:

$signer = new Nette\Mail\DkimSigner(
	domain: 'nette.org',
	selector: 'dkim',
	privateKey: file_get_contents('../dkim/dkim.key'),
	passPhrase: '****',
);

$mailer = new Nette\Mail\SendmailMailer; // ή SmtpMailer
$mailer->setSigner($signer);
$mailer->send($mail);

Διαμόρφωση του

Επισκόπηση των επιλογών διαμόρφωσης για το Nette Mail. Αν δεν χρησιμοποιείτε ολόκληρο το πλαίσιο, αλλά μόνο αυτή τη βιβλιοθήκη, διαβάστε πώς να φορτώσετε τη διαμόρφωση.

Από προεπιλογή, για την αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ο αποστολέας Nette\Mail\SendmailMailer, ο οποίος δεν ρυθμίζεται περαιτέρω. Ωστόσο, μπορούμε να το αλλάξουμε σε Nette\Mail\SmtpMailer:

mail:
	# χρήση SmtpMailer
	smtp: true       # (bool) προεπιλογή σε false

	host: ...        # (string)
	port: ...        # (int)
	username: ...    # (string)
	password: ...    # (string)
	timeout: ...     # (int)
	encryption: ...  # (ssl|tls|null) προεπιλογή null (έχει ψευδώνυμο 'secure')
	clientHost: ...  # (string) προεπιλογή σε $_SERVER['HTTP_HOST']
	persistent: ...  # (bool) προεπιλογή σε false

	# πλαίσιο για τη σύνδεση με τον διακομιστή SMTP, προεπιλογή stream_context_get_default()
	context:
		ssl:         # όλες οι επιλογές στη διεύθυνση https://www.php.net/manual/en/context.ssl.php
			allow_self_signed: ...
			...
		http:        # Όλες οι επιλογές στη διεύθυνση https://www.php.net/manual/en/context.http.php
			header: ...
			...

Μπορείτε να απενεργοποιήσετε τον έλεγχο ταυτότητας πιστοποιητικού SSL χρησιμοποιώντας την επιλογή context › ssl › verify_peer: false. Συνιστάται απολύτως να μην το κάνετε αυτό, καθώς θα καταστήσει την εφαρμογή ευάλωτη. Αντ' αυτού, προσθέστε πιστοποιητικά στο κατάστημα εμπιστοσύνης.

Για να αυξήσουμε την αξιοπιστία, μπορούμε να υπογράψουμε τα μηνύματα ηλεκτρονικού ταχυδρομείου χρησιμοποιώντας την τεχνολογία DKIM:

mail:
	dkim:
		domain: myweb.com
		selector: lovenette
		privateKey: %appDir%/cert/dkim.priv
		passPhrase: ...

Υπηρεσίες DI

Αυτές οι υπηρεσίες προστίθενται στο δοχείο DI:

Όνομα Τύπος Περιγραφή
mail.mailer Nette\Mail\Mailer κλάση αποστολής ηλεκτρονικού ταχυδρομείου
mail.signer Nette\Mail\Signer Υπογραφή DKIM
έκδοση: 4.0