发送短信

从功能上看,短信和邮件类似,用场常是关照和安全校验。
发送短信(基本上)须要向供应商付费,以是短信供应商有动力供应清晰的文档,易用的接口方便用户接入。
一样平常而言,发送短信的是:

探求供应商,例如阿里大鱼、聚合数据等;注册账户,获取appid和appkey;申请模板;查看接口文档,集成到运用中调用API发送短信。

流程大略易懂,接入和利用也十分便捷,基本上一两小时内就能对接和测试好。
用户无需考虑讯息在通讯过程中的编码、寻址下发等细节,缺陷是要付费。

邮箱phpPHP回想之发送邮件 Webpack

邮件一样平常是免费做事,干系支持没那么到位,这也要理解。
各种编程措辞发送邮件的类库不少,从信源角度看基本可以分成两类:从本机发送和从第三方邮件做事商发送。
为了理解邮件发送的流程,先先容一些干系观点。

干系观点

大部分打仗到互联网的人都有利用邮件的履历,但基本上限于邮件客户端、网页端和供应商这几个观点。
作为一个开拓,理解本节中的以下观点能更好的帮你节制邮件通讯中的细节。

MUA : Mail User Agent,邮件用户代理。
用户代理是开拓中常常打仗到的词,紧张指 理解人的意图并代表用户向资源方要求的工具。
例如浏览器是最常用的用户代理,以HTTP/HTTPS协议格式向web做事器发送要求,并解析相应,渲染后呈现给用户。
邮件用户代理,常见的是Foxmail、Outlook这类工具,人们写好邮件后,按格式封装邮件内容与邮件做事器通讯。

MTA : Mail Transfer Agent,邮件传输代理,帮用户收发邮件的程序。
常说的邮件做事器指的便是MTA,开源的程序有sendmail,postfix,QMail等。

MRA : Mail Retrieval Agent,邮件收取代理,将用户的邮件从邮件做事器取回本地。
邮件客户端是常见的MRA。

SMTP : Simple Mail Transfer Protocol,大略邮件传输协议。
用户与邮件做事器、邮件做事器相互通报邮件均利用该协议(默认明文,可利用SSL\TLS加密)。

POP3/IMAP : Post Office Protocol version 3/Internet Message Access Protocol,邮局协议版本3或网络信息获取协议,客户端从做事端获取邮件时利用的协议。

用户A(163邮箱)向用户B(Gmail邮箱)发信,用户B获取信件的过程涉及到上述的观点。
流程和观点关系可用如下简图表示:

注:上图给出的是邮件发送的大体流程,其他MSA、MDA、ESMTP、SMTPS等可能会涌如今全体流程中,但不影响邮件收发的理解。
下文中会提到的缩写和观点会注明,其他请自行查询。

postfix

Linux下发送邮件的软件紧张是sendmail和postfix,它们在系统中充当上文观点中的MTA/MDA(Mail Delivery Agent,邮件投递代理)角色。
它帮助用户向外发送邮件,吸收邮件投递到用户信箱(默认位置/var/spool/mail/用户名)。

sendmail是老牌的邮件软件,有名度非常高。
但是Wietse(Wietse Zweitze Venema)用的不爽,于是有了postfix。
postfix命令(险些)兼容于sendmail,但更高效和安全(后缀fix的由来),是目前大部分Linux发行版的默认邮件收发软件,推举利用postfix而非sendmail。

postfix的紧张配置文件是/etc/postfix/main.cf,配置文件的注释非常全,选项基本是自阐明的。
最主要的几个配置是:myhostname、myorigin、inet_interfaces、inet_protocols以及mydestination(如果你打算收外网来信的话)。

须要把稳inet_interfaces配置为localhost时,inet_protocols的值应为ipv4,否则可能会涌现类似postfix: fatal: parameter inet_interfaces: no local interface found for ::1的缺点提示。

与邮件干系的几个常用postfix命令是:

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的邮件发送;postsuper -d ALL,删除行列步队中的所有邮件。

以上先容对付发送邮件基本已足够。
把稳,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函数缘故原由,末了给出了利用第三方类库发送邮件的代码示例。

感谢阅读,欢迎评论示正!

参考

http://cn.linux.vbird.org/linux_server/0380mail.php

http://doc.ewomail.com/ewomail/285649

http://php.net/manual/en/function.mail.php

https://swiftmailer.symfony.com