• 售前

  • 售后

热门帖子
入门百科

详解PHP发送邮件知识点

[复制链接]
123457018 显示全部楼层 发表于 2021-10-25 19:54:04 |阅读模式 打印 上一主题 下一主题
发送邮件是网站的常用功能,用户激活、找回密码等场景常必要发送邮件到用户邮箱。本文先回顾发送邮件的干系概念,再给出使用PHP发送邮件的示例代码。
发送短信
从功能上看,短信和邮件雷同,用途常是通知和安全校验。发送短信(根本上)必要向供应商付费,以是短信供应商有动力提供清晰的文档,易用的接口方便用户接入。一样平常而言,发送短信的是:
探求供应商,例如阿里大鱼、聚合数据等;

注册账户,获取appid和appkey;

申请模板;

检察接口文档,集成到应用中;

调用API发送短信。

流程简单易懂,接入和使用也十分便捷,根本上一两小时内就能对接和测试好。用户无需考虑讯息在通讯过程中的编码、寻址下发等细节,缺点是要付费。
邮件一样平常是免费服务,干系支持没那么到位,这也要明白。各种编程语言发送邮件的类库不少,从信源角度看根本可以分成两类:从本机发送和从第三方邮件服务商发送。为了明白邮件发送的流程,先先容一些干系概念。
干系概念
大部门接触到互联网的人都有使用邮件的履历,但根本上限于邮件客户端、网页端和提供商这几个概念。作为一个开发,明白本节中的以下概念能更好的帮你掌握邮件通讯中的细节。
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获取信件的过程涉及到上述的概念。流程和概念关系可用如下简图表现:
  1. 用户A --发送邮件--> 用户B
  2. M|S         M|I
  3. U|M         R|M
  4. A|T         A|A
  5. |P         |P
  6. v          v
  7. MTA(163)--转发(SMTP)->MTA(gmail)
复制代码
注:上图给出的是邮件发送的大体流程,其他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(本博客多年前有篇文章写怎样设置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下令是:
mail或mailx,发送邮件。tlanyan用户向root发送邮件:mail -s "Greetings" root@localhost -r tlanyan@localhost,接着终端中输入A nice day!,然后回车,按ctrl+D结束正文编辑,邮件就已经发送出去。登录到root账号,会提示在/var/spool/mail/root中有新邮件。用tail或者其他下令可检察邮件的具体信息。

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:
  1. composer require "swiftmailer/swiftmailer:^6.0"
复制代码
然后准备好邮件内容(以文本文件为例,不带附件):
  1. $message = (new Swift_Message('Test Message'))
  2.   ->setFrom(['tlanyan@tlanyan.me' => 'tlanyan'])
  3.   ->setTo(['tlanyan1@tlanyan.me'])
  4.   ->setBody('Hello, this is a test mail from Swift Mailer!');
复制代码
接着,设置好邮件传输方式(使用Gmail邮箱):
  1. $transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))
  2.   ->setUsername('username')
  3.   ->setPassword('password');
复制代码
或者使用sendmail/postfix的方式(不保举):
  1. $transport = (new Swift_SendmailTransport());
复制代码
末了,使用transport构造mailer实例,发送邮件:
  1. $mailer = new Swift_Mailer($transport);
  2. $result = $mailer->send($message);
复制代码
老板再也不消担心发送邮件收不到了,So easy!
总结
本文先回顾了发送邮件的干系概念,阐明不保举使用内置的mail函数缘故原由,末了给出了使用第三方类库发送邮件的代码示例。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作