简单邮件传输协议SMTP
1、SMTP是由源地址到目的地址传送邮件的一组规则,用来控制信件的中转方式。
2、SMTP服务器是遵循SMTP协议的发送邮件服务器,用来发送或者中转发出的邮件,客户端通过SMTP命令与SMTP服务器进行交互。
3、连接和发送邮件步骤如下:
(1)建立TCP连接;
(2)客户端发送HELO命令以标识发件人的身份,服务器以OK作为响应,表明准备接收;
(3)使用AUTH命令登录SMTP服务器,输入用户名和密码(用户名和密码要用base64进行加密);
(4)客户端发送MAIL命令输入发件人邮箱地址,服务器以OK作为响应;
(5)客户端发送RCPT命令,标识该电子邮件的计划接收人,服务器以OK作为响应;
(6)协商结束后,使用DATA命令发送;
(7)以"."号表示结束,输入内容一起发送出去,
(8)结束此次发送,用QUIT命令退出。
下面给出一个使用telnet创建一个smtp会话的例子

注意:上述命令不一定一次性成功,服务器可能会返回错误响应,如上图,我输入了很多次才成功的
4、上面我们进行了SMTP连接和发送,接下来我们认识下SMTP协议的常用命令
DATA:开始信息写作
EXPN:验证给定的邮箱列表是否存在,扩充邮箱列表,常被禁用
HELO:向服务器标识用户身份,返回邮件服务器身份
HELP:查询服务器支持什么命令,返回命令中的信息
MAIL FROM:在主机上初始化一个邮件回话
NOOP:无操作,服务器响应OK
QUIT:终止邮件会话
RCPT TO:标识单个的邮件接收人,MAIL命令后面可以有多个RCPT TO
RSET:重置会话,当前传输被取消
SAML FROM:发送邮件到用户终端和邮箱
SEND FROM:发送邮件到用户终端
SOML FROM:发送邮件到用户终端或邮箱
TURN:接收端和发送端交换角色
5、下面我们看一个用socket发送邮件的例子,看完这个例子,基本上能理解清楚SMTP是如何发邮件的
首先,我们先来认识一个函数
fsockopen($hostname, $port, [$errno], [$errstr], [$timeout]);
$hostname:要连接的服务器路径
$port:要绑定的端口
$errno:保存连接发生错误时的错误代号
$errstr:保存错误信息
$timeout:设置连接的超时时间,单位为秒
先创建一个smtp.class.php类
<?php class smtp_email
{
private $host; //保存要连接的smtp服务器
private $port; //要绑定的端口,默认为25
private $user; //要登录SMTP服务器的用户名
private $pass; //要登录SMTP服务器的密码
private $debug = false; //标识是都开启调试模式,默认关闭
private $sock; //保存与SMTP服务器连接的句柄
private $mail_format = 0; //表示使用什么格式发送邮件,0位普通文本,1为HTML邮件 //初始化
public function __construct($host, $port, $user, $pass, $format = 1, $debug = 0)
{
$this->host = $host;
$this->port = $port;
$this->user = base64_encode($user);
$this->pass = base64_encode($pass);
$this->mail_format = $format;
$this->debug = $debug; $this->sock = fsockopen($this->host, $this->port, &$errno, &$errstr, 10); //使用fsockopen()连接服务器 if (!$this->sock) {
exit("Error Number:$errno, Error Message:$errstr");
} $response = fgets($this->sock); //获取服务器信息
if (strstr($response, "220") == false) {
exit("server error:$response\n");
}
} //根据用户是否开启调试模式显示调试信息
private function show_debug($message)
{
if ($this->debug) {
echo "<p>Debug:$message</p>\n";
}
} //把命令发送到服务器中执行,然后取的服务器的反馈信息
private function do_command($cmd, $return_code)
{
fwrite($this->sock, $cmd); $response = fgets($this->sock);
if (strstr($response, $return_code) == false) {
$this->show_debug($response);
return false;
} return true;
} //验证邮箱地址是否合法
private function is_email($email)
{
$pattern = '/^[^_][\w]*@[\w.]+[\w]*[^_]$/';
if (preg_match_all($pattern, $email, $matches)) {
return true;
} else {
return false;
}
} //发送邮件 $from:发件人email $to:收件人email $subject:邮件主题 $body:邮件内容
public function send_email($from, $to, $subject, $body)
{
if (!$this->is_email($from) || !$this->is_email($to)) {
$this->show_debug("please enter vaild from/to email.");
return false;
} if (empty($subject) || empty($body)) {
$this->show_debug("please enter subject/content.");
return false;
} $detail = "From:{$from}\r\n";
$detail .= "To:{$to}\r\n";
$detail .= "Subject:{$subject}\r\n"; if ($this->mail_format == 1) {
$detail .= "Content-Type:text/html;\r\n";
} else {
$detail .= "Content-Type:text/plain;\r\n";
} $detail .="charset = gb2312\r\n\r\n" ;
$detail .= "$body"; $this->do_command("HELO smtp.qq.com\r\n", 250);
$this->do_command("AUTH LOGIN\r\n", 334);
$this->do_command($this->user."\r\n", 334);
$this->do_command($this->pass."\r\n", 235);
$this->do_command("MAIL FROM:<".$from.">\r\n", 250);
$this->do_command("RCPT TO<".$to.">\r\n", 250);
$this->do_command("DATA\r\n", 354);
$this->do_command($detail."\r\n.\r\n", 250);
$this->do_command("QUIT\r\n", 221); return true;
}
} ?>
接着创建一个sendEmail.php测试文件进行测试
<?php
include("smtp.class.php");
$host = "smtp.163.com";
$port = 25;
$user = "onedream_kelly@163.com";
$pass = "**********";
$from = "onedream_kelly@163.com";
$to = "****@163.com";
$subject = "记得收衣服啊";
$content = "今天我不回家,你记得收到衣服,免得到时衣服淋湿了没得穿";
$mail = new smtp_email($host, $port, $user, $pass, 1);
$res = $mail->send_email($from, $to, $subject, $content);
if ($res == true) {
echo "send success";
} else {
echo "send fail";
}
?>
发送成功!
其实,现成有一个比较有名气的邮件类,Emailer,大家可以看看这个是如何实现邮件发送和邮件接收的,理解清楚了,基本上会应用此来发送邮件了。
接下来我们思考一个问题:PHP与C语言怎么交互呢??
你可能会想到用C语言写扩展,或则使用exec、system等命令,但我们可以换一个思路,就是用C语言提供服务,用PHP请求这个服务,PHP就能借助C语言完成很多看似不能完成的任务了。现在流行的WebGame正是利用C语言、java等重量级语言在底层完成复杂的运算,通过Socket把接口提供给PHP使用。
简单邮件传输协议SMTP的更多相关文章
- 45.简单邮件传输协议 SMTP
一丶简单邮件传输协议 简单邮件传输协议 简单邮件传输协议 SMTP smtplib 模块:(在 Python3版本中,可以通过 SMTP协议发送邮件的模块常为 smtplib, 并且这个模块属于内置模 ...
- SMTP 简单邮件传输协议
SMTP 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传 ...
- 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识
第33章 SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...
- C#使用简单邮件传输协议(SMTP)发送邮件
1.首先引入命名空间: using System.Net.Mail; 2.定义邮件配置类: public class EmailServiceConfig { /// <summary> ...
- C#System.Net.Mail采用简单邮件传输协议发送邮件
引用: using System.Net.Mail; public class EmailHelper { public static bool SendEmail(string title, str ...
- 理解邮件传输协议(SMTP、POP3、IMAP、MIME)
http://blog.csdn.net/xyang81/article/details/7672745 电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递,就必须遵循一定的规则 ...
- POP3是收邮件的协议,SMTP是发邮件的协议,IMAP是一种邮箱通信协议。
我也是第一次接触这种服务,是因为我自己在做一个小小的自动推送天气情况到自己邮箱.所以才碰到这个的/ 看一下标题,我们可以先这样理解. POP3(Post Office Protocol - Versi ...
- JavaMail学习之一-邮件传输协议
协议:规定好的格式就是协议.就像http协议有请求协议和响应协议,邮件传输也分为发.收邮件的协议. 邮件协议分3种: 发邮件的:SMTP (Simple Mail Transport Protoca ...
- TCP/IP详解学习笔记(11)-- TFTP:简单文本传输协议,BOOTP:引导程序协议
1.TFTP: TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,基于UD ...
随机推荐
- 你还在用notifyDataSetChanged?
想到发这篇帖子是源于我的上一篇帖子#Testin杯#多线程断点续传后台下载 .帖子中讲述的项目使用了listView这个控件,而且自定义了adapter.在更新item的进度条时发现每次使用notif ...
- 正确理解WPF中的TemplatedParent
(注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于名称不是很统一,文中统一用英文名称代表两个概念,况且VisualTreeHelper和Logical ...
- git设置不需要密码
https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credenti ...
- linux上抓包
使用tcpdump命令. 使用tcpdump -help查看其用法. -i eth0:在第一块网卡上进行抓包. -w filename.cap:将抓的保存到当前目录下的filename.cap文件中, ...
- [洛谷P1822] 魔法指纹
洛谷题目连接:魔法指纹 题目描述 对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值.这样,得到了一个新数,去掉前导0,则定义为ma ...
- Flash Sort
FlashSort依然类似桶排,主要改进了对要使用的桶的预测,或者说,减少了无用桶的数量从而节省了空间,例如 待排数字[ 6 2 4 1 5 9 100 ]桶排需要100个桶,而flash sort则 ...
- flask 自定义url转换器
from werkzeug.routing import BaseConverter app = Flask(__name__) class TeleConveter(BaseConverter): ...
- 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制
第2课 CC2530的通用I/O端口输入和输出控制 小蜜蜂科教 / 广东职业技术学院 欧浩源 [通用I/O端口视频教程:https://v.qq.com/x/page/x0793aol7us.ht ...
- 深入理解 JavaScript(五)
根本没有“JSON 对象”这回事! 前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为 JSON 对象,把 JSON 对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下 ...
- jsp之jstl核心标签库
JSTL核心标签库技术 1. JSTL介绍 在JSP页面中即可书写html,也可以书写Java代码,导致页面混乱,维护,修改,升级难度加大,于是国际上不同的公司在实际应用中,根据页面的需求将Java代 ...