站应用中向客户发送邮件是常见的一个功能。SMTP协议貌似简单,而且资料繁多,但要彻底搞清楚客户端服务器之间的身份和关系处理,也不是件容易的事。

本文简明扼要对smtp交换过程中身份和条件进行说明,使初次接触smtp开发的能有个清晰的处理思路。错误之处请多指正。

先说说smtp的基本原理, 邮件客户端(outlook)和发送方smtp服务器之间,  发送方smtp服务器和接受方smtp服务器之间,走的都是smtp协议.

先说说我们最常见的情况:用outlook发邮件,从 www.linuxidc@linuxidc.com 发往 www.linuxidc.net@linuxidc.net。 outlook里写好邮件后发送,会连接到帐号里登记的smtp服务器25端口,开始smtp会话:

mail from:

rcpt to:

linuxidc.com服务器发现邮件的mail from 是本域的(linuxidc.com),这种情况下smtp服务器一般需要验证用户身份,验证通过提交邮件,邮件进入服务器的发送队列。 服务器投递邮件的进程或线程,扫描发送队列,取出邮件后分析要往哪发。 服务器发现邮件是发往 linuxidc.net,不是本域,先通过dns服务器查询 linuxidc.net域的mx记录,假设为 smtp.linuxidc.net,邮件投递进程连接 smtp.linuxidc.net 的25端口,开始smtp会话

mail from:

rcpt to:

linuxidc.net服务器判断邮件是来自别的域,发往本域,所以不需要验证用户。不过有可能的情况是linuxidc.net服务器先检查一下发信服务器的ip地址,和mail from 里的域名对应的mx记录是否匹配,不匹配的拒收。如果没有符合什么拒收条件,那么linuxidc.net手下这封信,放入rose的邮件夹,rose可以通过pop3收取邮件。

如果 linuxidc.com发送邮件失败的话,邮件进入发送失败队列,可能直接扔掉,或者再试着重发n次,如果都不成功,会通知发件人或别的什么,这要看服务器的处理。

现在再说说php发邮件,首先要搞清楚,要用什么身份发送邮件。第一种:把自己当作outlook之类的客户端,先连到发信服务器,提交邮件后让发件服务器往外发送。第二种:把自己当作发信服务器,直接通过smtp连接收件人的服务器发送邮件。

这里我不推荐第二种方式,原因是:如果你php所在服务器的域名,ip,mx记录没有严格设置好的话,一般收件服务器有很大的几率会拒收;发送邮件本身的传输过程时间无法控制,如果和收件服务器有很大的延时,会严重影响自己的web服务器的工作,另外也不具有失败重发等处理。

对于发送邮件,windows和unix和很大的差别。windows一般来说都是像outlook那样的方式,用smtp协议连到发件服务器发送邮件。unix有自己的传统方式,就是unix主机自带 smtp server,传统的就是sendmail。另外还有个“sendmail”的概念,这里说的是一个程序的名字,无论是sendmail,qmail,postfix等等,都提供这个命令程序,通过它,可以把邮件放入本地邮件发送队列,让sendmail,qmail,postfix之类的投递程序去投递发送。sendmail程序一般是从标准输入里读入邮件内容。php的mail()函数实际上会打开sendmail程序,通过标准输入把邮件内容传给它,由sendmail程序来发送,剩下的就不管了。

所以大家可以看到,php里关于mail() 这个函数的说明,如果是在windows上,一般是设置 php.ini里 SMTP 和 smtp_port 选项的值,通过类outlook客户端的方式发送,但是这种方式的致命弱点是不支持smtp验证,而现在邮件服务器基本都是需要smtp验证的。uxni下一般需要设置 sendmail_path ,来说明sendmail程序的路径。当然windows上也可以用sendmail程序发送。

如果是unix,最理想的情况是,你的php所在的web服务器本身也是个smtp server,并设置好了mx记录等等,或者你有个能发送邮件的sendmail程序(自己写,封装smtp发送)那么先配置好 php.ini 里的sendmail_path,通过mail()函数就直接发送了。

如果没有能用的sendmail程序,那么就要通过socket 用smtp协议发送了,php这方面有很多扩展的库,可以直接拿来用。建议连上一个服务器让他帮你发,不建议直接连收件服务器(原因前面说了)。这里还有就是不建议直接在网页上php里连接发送,推荐的方式是把邮件写到数据库或文件里,让另一个程序(php,perl,Python 都可以写)扫描后通过sokcet连接发送。这样既给用户有了好的响应体验,也可以控制发送的过程。

linux php 邮件_PHP发送邮件之头头是道完全释疑相关推荐

  1. Linux利用Esmtp 选择邮件服务器发送邮件(解决手机接收乱码)

    因公司业务需求,需要定时发送一些业务邮件.使用Linux 自带的mail 命令 发送邮件 ,能正常发送但是领导们都用手机收取邮件,很崩溃 他们接收到的邮件乱码.不得不想办法解决此问题. 就在googl ...

  2. 磁盘配额超出 linux,使用linux的warnquota命令发送邮件给超出配额的用户

    使用linux的warnquota命令发送邮件给超出配额的用户 发布时间:2020-07-16 09:23:56 来源:亿速云 阅读:66 作者:清晨 栏目:服务器 小编给大家分享一下使用linux的 ...

  3. Linux mail 邮件发送

    Linux mail 邮件介绍 在Linux系统下我们可以通过"mail"命令,发送邮件,在运维中通常我们它来实现邮件告警. 安装 (方案1) 一.安装邮件服务 yum insta ...

  4. linux下用mail发送邮件

    利用外部邮箱发送邮件的方法 bin/mail会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动Sendmail服务,配置很麻烦,并且会带来不必要的 资源占用.而通过改动配置文件能 ...

  5. Linux at命令定时发送邮件具体用法

    Linux at命令定时发送邮件具体用法 Linux at命令定时发送邮件具体用法 - 51CTO.COM Linux at命令定时发送邮件具体用法 2010-06-22 12:58 佚名 Linux ...

  6. linux创建邮件列表,如何订阅linux-kernel邮件列表

    花了很长时间才将linux kernel邮件列表订阅成功,与大家分享 简单的方法附在最后,前面的方法不知道为什么不成功 使用163,sina,qq,hotmail邮箱均失败 方法 1 用邮箱向majo ...

  7. linux从命令行发送邮件

    原文 ubuntu server 14.04 从命令行发邮件 安装mailutils sudo apt-get install mailutils 接下来进行默认安装就行了.Postfix Confi ...

  8. 在 linux 上使用 sendmail 发送邮件

    还是记录一个小点:如何在 linux上使用 sendmail发送邮件? 总共分为以下几个步骤: 1.安装 sendmail 在 CentOS上使用 yum即可安装,具体步骤略过 2.配置主机名 在 / ...

  9. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两 ...

最新文章

  1. 360展示广告智能化演进
  2. 线程池的使用(线程池重点解析)
  3. 求n个数的最大公因数和最小公倍数(c)
  4. 【渝粤题库】陕西师范大学164202 市场营销学 作业(专升本)
  5. int main(int argc,char* argv[])讲解
  6. 权限管理系统设计_多校区的教育培训机构,如何选择培训学校crm管理系统?
  7. 编写安全的驱动程序之验证驱动的调用者
  8. iOS开发之抓包工具的Charles的初步安装使用:一步一步教你学会抓包工具Charles的使用(下载破解+代理设置+证书配置)
  9. Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群
  10. UE4下载与存储图片
  11. Gantt - attachEvent事件监听 - 一个参数事件
  12. Chango的数学Shader世界(十六)RayTrace三维分形(一)—— ue4中最简单的RayMarch
  13. 大学生笔记本购买指南——扫盲版(2019)
  14. 7-12 清点代码库 (25 分)
  15. C语言 IO多路复用——poll函数
  16. 爬虫爬数据时,post数据乱码解决办法
  17. R语言-股票数据库(4)-股票行业和概念板块数据-Wind
  18. 2015第16本:协同学--大自然构成的奥秘
  19. python基于广度优先(BFS)的迪杰斯特拉(Dijkstra)算法 求最短路径
  20. bootstrap网格系统,下拉菜单

热门文章

  1. 2.1嵌入式微处理器的结构和类型
  2. 普罗米修斯(Promethus)介绍及安装与配置
  3. JAVA数据结构和算法:第一章(时间复杂度和空间复杂度)
  4. 物联网的发展前景怎么样?
  5. linux之创建守护进程
  6. 腾讯地图 省市区县 信息展示
  7. C语言“我的家谱”程序
  8. SX1278 LoRa通讯的频率设定
  9. 初一年级上学期计算机课知识总结,精选七年级上册信息技术教案范文3篇
  10. 编译安装0bda 8179无线网卡