Dieser Artikel fasst die relevanten Wissenspunkte und detaillierten Verwendungscodes zum Versenden von E-Mails in PHP zusammen. Freunde in Not können daraus lernen.
Das Versenden von E-Mails ist eine häufige Funktion von Websites, wie z. B. die Benutzeraktivierung und das Abrufen von Passwörtern, die häufig das Senden von E-Mails an Benutzerpostfächer erfordern. In diesem Artikel werden zunächst die zugehörigen Konzepte zum Senden von E-Mails erläutert und anschließend Beispielcode zum Senden von E-Mails mit PHP bereitgestellt.
Textnachrichten senden
Von der Funktion her ähneln Textnachrichten E-Mails und werden häufig für Benachrichtigungen und Sicherheitsüberprüfungen verwendet. Für das Versenden von Textnachrichten ist (grundsätzlich) eine Zahlung an den Anbieter erforderlich, sodass SMS-Anbieter einen Anreiz haben, eine klare Dokumentation und benutzerfreundliche Schnittstellen bereitzustellen, auf die Benutzer zugreifen können. Im Allgemeinen sind diejenigen, die Textnachrichten senden:
Suchen Sie nach Lieferanten wie Alibaba Big Fish, aggregierten Daten usw.
Registrieren Sie ein Konto und erhalten Sie App-ID und App-Schlüssel;
Vorlage beantragen;
Schnittstellendokument ansehen und in die Anwendung integrieren;
API zum Versenden von Textnachrichten aufrufen .
Der Vorgang ist einfach und leicht zu verstehen, außerdem ist er sehr bequem zugänglich und zu verwenden. Grundsätzlich kann er innerhalb von ein oder zwei Stunden angeschlossen und getestet werden. Benutzer müssen während des Kommunikationsprozesses keine Rücksicht auf Details wie die Verschlüsselung und Adressierung von Nachrichten nehmen. Der Nachteil besteht darin, dass sie dafür bezahlen müssen.
E-Mail ist im Allgemeinen ein kostenloser Dienst, aber der entsprechende Support ist nicht vorhanden, was selbstverständlich sein sollte. Es gibt viele Klassenbibliotheken zum Senden von E-Mails in verschiedenen Programmiersprachen. Aus Sicht der Quelle können sie grundsätzlich in zwei Kategorien unterteilt werden: Senden vom lokalen Computer und Senden von einem externen E-Mail-Dienstanbieter. Um den Prozess des E-Mail-Versands zu verstehen, stellen wir zunächst einige verwandte Konzepte vor.
Verwandte Konzepte
Die meisten Menschen, die mit dem Internet zu tun haben, haben Erfahrung im Umgang mit E-Mails, diese sind jedoch im Wesentlichen auf E-Mail-Clients, Webseiten und Anbieter beschränkt. Wenn Sie als Entwickler die folgenden Konzepte in diesem Abschnitt verstehen, können Sie die Details der E-Mail-Kommunikation besser beherrschen.
MUA: Mail User Agent, Mail-Benutzeragent. Benutzeragent ist ein Wort, das in der Entwicklung häufig vorkommt. Es bezieht sich hauptsächlich auf ein Tool, das menschliche Absichten versteht und im Namen des Benutzers Ressourcen anfordert. Beispielsweise ist der Browser der am häufigsten verwendete Benutzeragent. Er sendet eine Anfrage im HTTP/HTTPS-Protokollformat an den Webserver, analysiert die Antwort und stellt sie dem Benutzer zur Verfügung. E-Mail-Benutzeragenten sind üblicherweise Tools wie Foxmail und Outlook. Nachdem Benutzer E-Mails geschrieben haben, kapseln sie den E-Mail-Inhalt entsprechend dem Format und kommunizieren mit dem Mailserver.
MTA: Mail Transfer Agent, ein Programm, das Benutzern beim Senden und Empfangen von E-Mails hilft. Der häufig erwähnte Mailserver bezieht sich auf die MTA-Open-Source-Programme, darunter Sendmail, Postfix, QMail usw.
MRA: Mail Retrieval Agent, der Mail-Sammelagent, ruft die E-Mails des Benutzers lokal vom Mailserver ab. E-Mail-Clients sind gängige MRAs.
SMTP: Simple Mail Transfer Protocol, Simple Mail Transfer Protocol. Benutzer, Mailserver und Mailserver verwenden alle dieses Protokoll, um E-Mails untereinander zu übertragen (Standard ist Klartext, und SSLTLS-Verschlüsselung kann verwendet werden).
POP3/IMAP: Post Office Protocol Version 3/Internet Message Access Protocol, Post Office Protocol Version 3 oder Network Information Access Protocol, das Protokoll, das der Client verwendet, um E-Mails vom Server abzurufen.
Benutzer A (Postfach 163) sendet einen Brief an Benutzer B (Postfach Gmail). Der Vorgang, bei dem Benutzer B den Brief erhält, umfasst die oben genannten Konzepte. Der Prozess und die konzeptionelle Beziehung können durch das folgende vereinfachte Diagramm dargestellt werden:
用户A --发送邮件--> 用户B M|S M|I U|M R|M A|T A|A |P |P v v MTA(163)--转发(SMTP)->MTA(gmail)
Hinweis: Die obige Abbildung zeigt den allgemeinen Prozess des Versendens von E-Mails. Andere MSA, MDA, ESMTP, SMTPS usw. können im Ganzen vorkommen Dies wirkt sich jedoch nicht auf das Verständnis des Sendens und Empfangens von E-Mails aus. Die unten genannten Abkürzungen und Konzepte werden beachtet. Bei anderen prüfen Sie bitte selbst.
Postfix
Die Software zum Versenden von E-Mails unter Linux ist hauptsächlich sendmail und Postfix. Sie fungieren als MTA/MDA (Mail Delivery Agent, Mail Delivery Agent). obiges Konzept im System. Es hilft Benutzern, ausgehende E-Mails zu senden und E-Mails zu empfangen, die an das Postfach des Benutzers gesendet werden (Standardspeicherort /var/spool/mail/Benutzername).
Sendmail ist eine seit langem etablierte E-Mail-Software mit einem sehr hohen Ruf. Aber Wietse (Wietse Zweitze Venema) war damit nicht zufrieden, also hat er sich Postfix ausgedacht. Der Postfix-Befehl ist (fast) kompatibel mit Sendmail, aber effizienter und sicherer (der Ursprung des Suffix-Fixes). Er ist derzeit die Standardsoftware zum Senden und Empfangen von E-Mails für die meisten Linux-Distributionen. Es wird empfohlen, Postfix anstelle von Sendmail zu verwenden. Vor vielen Jahren gab es in diesem Blog einen Artikel über die Konfiguration von sendmail. Damals war ich jung und unwissend, also wollte ich mir die Zeit nehmen, diesen Artikel zu überarbeiten.
Die Hauptkonfigurationsdatei von Postfix ist /etc/postfix/main.cf. Die Konfigurationsdatei ist sehr gut kommentiert und die Optionen sind grundsätzlich selbsterklärend. Die wichtigsten Konfigurationen sind: myhostname, myorigin, inet_interfaces, inet_protocols und mydestination (wenn Sie vorhaben, Briefe von der Außenwelt zu empfangen). Es ist zu beachten, dass, wenn inet_interfaces als localhost konfiguriert ist, der Wert von inet_protocols ipv4 sein sollte, andernfalls wird möglicherweise eine Fehlermeldung ähnlich wie postfix: fatal: Parameter inet_interfaces: no local interface done for ::1 angezeigt.
Mehrere gängige Postfix-Befehle im Zusammenhang mit E-Mails sind:
mail oder mailx, um E-Mails zu senden. Der tlanyan-Benutzer sendet eine E-Mail an root: mail -s „Greetings“ root@localhost -r tlanyan@localhost, dann geben Sie „A nice day!“ in das Terminal ein, drücken Sie dann die Eingabetaste, drücken Sie Strg+D, um die Textbearbeitung zu beenden, und senden Sie die E-Mail wurde gesendet. Melden Sie sich beim Root-Konto an und Sie werden benachrichtigt, dass sich in /var/spool/mail/root neue E-Mails befinden. Verwenden Sie tail oder andere Befehle, um detaillierte Informationen der E-Mail anzuzeigen.
postquque,查看邮件发送队列。postqueue -p可取代sendmail中的mailq命令,postqueue -f刷新队列(强制尝试发送队列中的邮件)。
postcat,查看未发送邮件的信息。例如postcat -q xxxx(xxxx是postqueue或者mailq显示的未发送队列ID)可查看邮件的详细信息,postcat -b -q xxxxx只查看邮件正文。
postsuper,超级用户才可使用的邮件管理程序。postsuper -d xxxx,删除队列ID为xxxxx的邮件;postsuper -h xxxxx,暂停队列ID为xxxx的邮件发送,等。
以上介绍对于发送邮件基本已足够。注意,mail命令发送的邮件能投递的前提是postfix正在运行(ps aux | grep postfix | grep -v grep输出不为空)。
有了postfix,配置好后可以对外发送邮件,也能收取外网发送过来的邮件,但限于命令行操作。想用foxmail等客户端收发邮件,需要让服务器支持POP3/IMAP协议。开源的dovecot可以实现这个功能。dovecot服务于收邮件而非发送,了解其对开发中的帮助不大。如果想搭建一套完整的邮件系统(包括网页端支持、垃圾邮件过滤、病毒查杀、传输加密等),建议参考或使用国产开源的 EwoMail。
了解postfix对开发中发送邮件帮助有多大?说实话,几乎没有帮助。原因是为了防止垃圾邮件泛滥,各大云服务器厂商屏蔽了25端口(Google Cloud连465都干掉了)。亚马逊云通过申请还有放行的可能(但有速率和每日额度限制),其他厂商几乎不会让你使用自己的域名从本机直接发送邮件。封禁25端口,必须使用第三方的邮件服务,几乎是业界的标准做法。
聪明的人可能想到,使用465加密端口(基于SMTPS,SMTP over SSL协议)或587端口(SMTP over STARTTLS协议)发送邮件,是不是就能绕开限制了?阿里云/腾讯云等厂商并不封禁465端口,发送邮件可以使用该端口而无需申请。但注意465和587端口是客户端和邮件服务器通讯使用的端口,邮件服务器之间通讯使用25端口。你可以通过465端口连接到Gmail邮箱对外发送邮件,但无法让postfix使用465端口投递邮件到hotmail邮件服务器。
总结来说,sendmail/postfix作为垃圾和欺诈邮件泛滥前的邮件服务器软件,对业界贡献很大。随着云服务器的盛行,几乎无法以指向本机的域名向外发送邮件,sendmail/postfix除了在本机内发送提醒邮件,用处已然不大。要对外发送邮件,要么自建机房,要么使用第三方邮件系统。
PHP的mail函数
作为PHP开发中,了解sendmail/postfix还是有点用处。mail函数默认使用sendmail/postfix发送邮件,了解相关配置,就能知道为啥能工作/为啥不能工作。
简单来说,要让PHP自带的mail函数正常工作,需要做以下事情:
申请域名,在DNS解析中设置MX记录,指向本机(非合法主机(FQDN, Fully Qualified Domain Name)发送的邮件都会被当做垃圾邮件直接丢弃);
安装sendmail/postfix,配置软件并运行;
配置防火墙、安全组,放行端口。
发送效率低、非面向对象的调用方式,配置麻烦以及云服务器厂商的封锁,是使用mail函数的最大阻碍。所以做PHP以来,本人并未直接用过mail函数。
PHP发送邮件
发个邮件要了解这么多,会让人觉得很心累。说好的PHP是最好的语言呢?
PHP发送邮件也可以很简单,推荐方式就是使用Swift Mailer或PHPMailer等类库。引入这些类库后,注册第三方邮箱(比如Gmail、QQ等),填好用户名密码,配置好STMP地址和端口,就能像发送短信一样轻松发送邮件。当然这些类库也支持使用sendmail/postfix发送邮件,但我想你不会再这样做了。
以Swift Mailer为例,直接上代码说明使用PHP发送邮件也是一个非常简单的事情!
首先,在项目中引入Swift Mailer:
composer require "swiftmailer/swiftmailer:^6.0"
然后准备好邮件内容(以文本文件为例,不带附件):
$message = (new Swift_Message('Test Message')) ->setFrom(['tlanyan@tlanyan.me' => 'tlanyan']) ->setTo(['tlanyan1@tlanyan.me']) ->setBody('Hello, this is a test mail from Swift Mailer!');
接着,设置好邮件传输方式(使用Gmail邮箱):
$transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl')) ->setUsername('username') ->setPassword('password');
或者使用sendmail/postfix的方式(不推荐):
$transport = (new Swift_SendmailTransport());
最后,使用transport构造mailer实例,发送邮件:
$mailer = new Swift_Mailer($transport); $result = $mailer->send($message);
老板再也不用担心发送邮件收不到了,So easy!
总结
本文先回顾了发送邮件的相关概念,说明不推荐使用内置的mail函数原因,最后给出了使用第三方类库发送邮件的代码示例。
相关推荐:
几种PHP发送HTTP请求的方式分享
PHP sendet SMS-E-Mails und viele andere praktische PHP-Code-Sharing
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Wissenspunkte zum E-Mail-Versand mit PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!