PHP开发者一般都是使用PHPMailer发送邮件,不知道你有没有看过它的源码呢?其实并不难,核心在于SMTP协议,下面我分享下如何不依赖PHPMailer来发送邮件。

我选择使用QQ邮箱的SMTP服务器,其他邮箱服务商比如网易、新浪都是可以的。

首先建立TCP连接:

$hostname = 'smtp.qq.com'; // 邮件服务器

$port = 465; // 服务器端口

$username = 'crazymus@foxmail.com'; // 你的邮箱账号

$password = '*************'; // 你的邮箱密码,QQ邮箱使用的不是密码,是授权码,登录邮箱设置

$sendTo = '291445576@qq.com'; // 收件人

$socket = fsockopen('ssl://' . $hostname, $port, $errno, $errmsg);

if (!$socket) throw new \RuntimeException('create socket failed', 1);

为什么要使用ssl连接?因为QQ邮箱提供了ssl加密的通道,我们和服务器之间的数据传输都将是加密的。你也可以不使用ssl连接,去掉ssh://前缀,使用端口25就行,但并不推荐这样。在如今复杂的互联网环境中,明文传输数据是非常危险的,很容易被他人截获敏感信息。

然后,我们按照SMTP协议准备好需要发送的命令。

$array = [

"HELO crazymus\r\n", // 打招呼

"auth login\r\n", // 请求认证

base64_encode($username) . "\r\n", // 用户名,需要base64编码

base64_encode($password) . "\r\n", // 密码,需要base64编码

"mail from:\r\n", // 发件人

"rcpt to:\r\n", // 收件人

"data\r\n", // 即将发送的是邮件内容

"subject:这是邮件标题\r\nfrom:$username\r\nto:$sendTo\r\n\r\n这是邮件内容\r\n.\r\n", // 邮件内容

];

每条命令都用换行符结束,windows下是\r\n,如果你使用Linux或者Mac,就换成\n和\r。需要注意的是最后一条命令,它是邮件的内容。邮件内容包含header和body两部分,用换行符隔开。如果你熟悉HTTP协议,就会发现这很容易理解。最后用\r\n.\r\n (两个换行符包裹的点号)来标识邮件结束。服务器收到这个标识后,就会开始发送邮件了。

接下来,我们依次向服务器发送上面的命令,并输出服务器返回值:

foreach ($array as $command) {

fwrite($socket, $command); // 发送命令

$resp = fgets($socket); // 获取一行响应内容

echo $resp;

}

flose($socket); // 关闭TCP连接

如果顺利的话,应该会依次输出下面的内容:

220 newxmesmtplogicsvrszc5.qq.com XMail Esmtp QQ Mail Server.

250-newxmesmtplogicsvrszc5.qq.com-100.77.8.93-115229658

250-SIZE 73400320

250 OK

334 VXNlcm5hbWU6

334 UGFzc3dvcmQ6

235 Authentication successful

250 OK.

250 OK

354 End data with ..

250 OK: queued as.

最后一行是250状态码,表示邮件发送完毕,我们可以根据它来判断邮件是否发送成功。下面列出SMTP协议常见的状态码:

501 参数格式错误

502 命令不可实现

503 错误的命令序列

504 命令参数不可实现

211 系统状态或系统帮助响应

214 帮助信息

220 <domain>服务就绪

221 <domain>服务关闭

421 <domain>服务未就绪,关闭传输信道

250 要求的邮件操作完成

251 用户非本地,将转发向<forward-path>

450 要求的邮件操作未完成,邮箱不可用

550 要求的邮件操作未完成,邮箱不可用

451 放弃要求的操作;处理过程中出错

551 用户非本地,请尝试<forward-path>

452 系统存储不足,要求的操作未执行

552 过量的存储分配,要求的操作未执行

553 邮箱名不可用,要求的操作未执行

354 开始邮件输入,以"."结束

554 操作失败

这样我们就用SMTP协议简单的实现了发送邮件。上面的例子只是发送了纯文本,其实HTML也是支持的,只要在邮件header中定义了正确的content-type,就可以发送HTML内容了,这里就不再深入讲解了,大家可以在自行查阅相关资料!

php中如何使用smtp,PHP使用SMTP协议发送邮件相关推荐

  1. c#中邮件收发处理(POP3,IMAP,SMTP)的实现方法

    对于还没用动手写过程序的人来说,动手是必须的,只有自己动手写写程序才能在锻炼中不断提高,今天和大家一起探讨一个程序c#中邮件收发处理(POP3,IMAP,SMTP)的实现方法,程序有点长,希望大家坚持 ...

  2. outlook服务器信息查看器,允许最终用户在 Outlook Web App 中查看 POP3、IMAP4 和 SMTP 服务器设置...

    允许最终用户在 Outlook Web App 中查看 POP3.IMAP4 和 SMTP 服务器设置 2021/6/1 本文内容 适用于:Exchange Server 2013 如果您有使用 PO ...

  3. Python 使用SMTP协议发送邮件

    引言 问题基于<计算机网络自定向下>第二章的课后套接字编程作业:邮件客户 题目的下载链接:python 压缩包 题目如下: 这个实验结束时,您将能够更好地了解SMTP协议.您还将获得使用P ...

  4. 阿里云服务器用SMTP的25号端口发送邮件问题

    这几天自己闲着没事就用阿里云服务器部署了一个项目,这个项目中包含了一个发送邮件到我的邮箱的功能出错了,这个功能在我的电脑上用本地服务器没有问题,但是部署到阿里云的Centos服务器上这个功能出了问题, ...

  5. qq stmp php_sockets.dll 端口,QQ邮箱开启SMTP服务与SMTP信息(密码、服务器、端口) - 老王博客...

    无论是 WordPress 自动回复,还是写代码发送邮件,我们都需要用到 SMTP 服务,这时候我们就需要一个稳定靠谱的 SMTP 账号.老王一般喜欢使用 QQ 邮箱的 SMTP 服务,简单方便,反正 ...

  6. SMTP协议发送邮件

    网上找了一个smtp邮箱的发送工具类,还行,用我自己的qq测试可以发送package com.exampleimport javax.mail.Address; import javax.mail.S ...

  7. Linux 平台使用smtp协议发送邮件

    Linux平台使用smtp协议 发送邮件 前言 项目简介 项目开发环境 项目代码 测试结果以及存在问题 写在最后 前言 本人第一次写博客,主要目的是想记录一下自己的学习结果,本篇博客内容纯手打,参考资 ...

  8. E-mail概述 | 邮件发送协议SMTP与邮件读取协议POP3、IMAP

    文章目录 电子邮件系统的组成 用户代理UA(User Agent) 邮件服务器 邮件发送协议 邮件读取协议 POP3 IMAP POP3与IMAP的对比 基于万维网的电子邮件 补充与思考 摘抄于文献 ...

  9. smtp协议源ip是服务器地址吗,Smtp协议发送邮件

    Smtp协议发送邮件,是最全面的smtp协议发送邮件教程!有助于新手快速入门,从而跟好的进阶学习.本文档内容丰富,知识全面,简单易懂 Smtp协议发送邮件 MTP(Simple Mail Transf ...

  10. smtp发送服务器的协议,smtp协议总结

    Smtp简介: 简易邮件传输通讯协议smtp是互联网上的一种通讯协议,主要功能是用在传送电子邮件,当我们通过电子邮件程序,寄e-mail给另外一个时,必须通过smtp通讯协议,将邮件送到对方的邮件服务 ...

最新文章

  1. Dev-C++安装和使用教程(手把手傻瓜式教学)
  2. 开源一个基于cocos2d-x的游戏--超级六边形(SuperSector)
  3. 物料主数据(SAP屠夫)
  4. 利用系统滴答时间计算实际程序运行时间
  5. BGP重分布进IGP-EIGRP
  6. gorm查询降序排列
  7. MAC使用终端DISKUTIL命令给U盘分区(解决window优盘只有200M)
  8. 光骓者的荣耀(洛谷P5638题题解,弃坑Java拥抱C++)
  9. JavaScript中语句与函数的执行辨析
  10. Redis集合 安装 哨兵集群 安全配置 redis持久化
  11. 服务器上安装声卡稳定吗,服务器加装声卡的故障
  12. 【开发神器】自动化测试、用 Apipost!
  13. 在html语言中读取txt文件中的内容,Javascript写入txt和读取txt文件示例详解
  14. pdf合并页面大小不一样
  15. 【查缺补漏 | JAVA 基础知识 | 粗略复习②】
  16. gwas snp 和_新的高密度玉米SNP芯片可用于基因组选择、GWAS和群体遗传学
  17. docker安装xware 实现迅雷远程下载
  18. SEO的道与术,因果关系的选择
  19. 计算机丢失client,FsPiscesClient.dll
  20. 题解 CF174A 【Problem About Equation】

热门文章

  1. Apple Developer 注册及DUNS编码申请
  2. 千锋网络安全学习笔记部分3
  3. 套接字服务器打开显示未知文件异常,TCP-socket异常情况
  4. 高并发-高可用-高性能
  5. 文件绑定java socket多线程网络传输多个文件Strut2教程-java教程
  6. puppet的web管理工具foreman安装配置简明步骤
  7. 四十以上软件开发人员没有出路了吗?
  8. 黑客利用美国国税局工具窃取学生的贷款信息
  9. TVM系列 #002_About VTA
  10. 为什么需要分布式系统