专栏首页python3SMTP/POP3/IMAP 命令简介

SMTP/POP3/IMAP 命令简介

SMTP 命令简介

什么是 SMTP SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。

什么是 ESMTP ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。

SMTP 命令 SMTP 命令包括: HELO 向服务器标识用户身份。 EHLO 向服务器标识用户身份。说明是通过认证发信. MAIL FROM 命令中指定的地址是发件人地址 RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。 DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束 VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令 EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用 HELP 查询服务器支持什么命令 NOOP 无操作,服务器应响应 OK RSET 重置会话,当前传输被取消 QUIT 结束会话

连接到 Postfix 使用 SMTP 命令发送邮件 例如:安装 Postfix 的邮件服务器IP是mail.test.com (蓝色字体内容由客户端输入,红色字体内容是服务返回的)

telnet mail.test.com --------------------------------------- 使用 telnet 命令连接服务器 25 端口 Trying mail.test.com... --------------------------------------- 正在连接服务器 25 端口 Connected to mail.test.com. ----------------------------------- 连接服务器 25 端口成功 220 localhost ESMTP Postfix - by mail.test.com -------------------- 显示服务器标识 ( 修改main.cf 的smtpd_banner) helo test.com ----------------------------------------------- 向服务器标识用户身份,发信不要认证,跳过下面几步直接发送 mail from 命令 250 localhost ehlo test.com ------------------------------------------------ ESMTP 命令,发信需要认证。 250-localhost 250-PIPELINING 250-SIZE 102400000 250-VRFY 250-ETRN 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth login ------------------------------------------------- 进行用户身份认证 334 VXNlcm5hbWU6 Y29zdGFAYW1heGl0Lm5ldA== ----------------------------------- BASE64 加密后的用户名 334 UGFzc3dvcmQ6 MTk4MjIxNA== ----------------------------------------------- BASE64 加密后的密码 235 authentication successfully ---------------------------- 身份认证成功 (535 authentication failed --------------------------------- 身份认证失败) 发到本系统中域名下的账户可跳过身份认证。 mail from: <test1@domain.com> ------------------------------ mail from 地址 test1@domain.com 250 ok ----------------------------------------------------- 命令执行成功 rcpt to: <test2@domain.com> -------------------------------- 递送给地址 test2@domain.com 250 ok ----------------------------------------------------- 命令执行成功 data ------------------------------------------------------- 数据传输初始化 354 End data with .----------------------------------------- 开始传输数据 From: test1@domain.com To: test2@domain.com Date: Mon, 25 Oct 2004 14:24:27 +0800 Subject: test mail

Hi, test2 This is a test mail, you don't reply it.

. ------------------------------------------------------------ 数据内容,包括BASE64加密后的邮件内容, 以 CRLF.CRLF 结束数据传输 250 OK: queued as 2F6DE3929--------------------------------- 命令执行成功 quit ------------------------------------------------------- 结束会话 221 Bye Connection closed by foreign host .------------------------- 断开连接

POP3命令简介 什么是 POP3 POP3 (Post Office Protocol 3) 即邮局协议的第 3 个版本,它规定怎样将个人计算机连接到 Internet 的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的         第一个离线协议标准, POP3 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3 协议的接收邮件服务器,用来接收电子邮件的。

POP3 命令 POP3 命令包括: USER username 认证用户名         PASS password 认证密码认证,认证通过则状态转换         APOP name,digest 认可一种安全传输口令的办法,执行成功导致状态转换,请参见 RFC 1321 。         STAT 处理请求 server 回送邮箱统计资料,如邮件数、 邮件总字节数         UIDL n 处理 server 返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。         LIST n 处理 server 返回指定邮件的大小等         RETR n 处理 server 返回邮件的全部文本         DELE n 处理 server 标记删除,QUIT 命令执行时才真正删除         RSET 处理撤消所有的 DELE 命令         TOP n,m 处理 返回 n 号邮件的前 m 行内容,m 必须是自然数         NOOP 处理 server 返回一个肯定的响应         QUIT 希望结束会话。如果 server 处于"处理" 状态,则现在进入"更新"状态,删除那些标记成删除的邮件。如果 server 处于"认可"状态,则结束会话时 server 不进入"更新"状态 。

使用 telnet 连接 Winmail Server 收信 例如:安装 Winmail 的邮件服务器 IP 是 mail.test.com(蓝色字体内容由客户端输入,红色字体内容是服务返回的)   telnet mail.test.com 110 ----------------------------- 使用 telnet 命令连接服务器 110 端口         Trying mail.test.com... ------------------------------ 正在连接服务器 110 端口         Connected to mail.test.com. -------------------------- 连接服务器 110 端口成功         +OK Winmail Mail Server POP3 ready           user username ------------------------------------------ 输入用户名, username 为具体的用户名         +OK ---------------------------------------------------- 执行命令成功   pass password ------------------------------------------ 输入用户密码,password 为具体的密码,这里要注意,当密码输入错误后要重新user username后再运行此命令,否则提示命令无效         +OK 2 messages ----------------------------------------- 密码认证通过   (-ERR authorization failed ----------------------------- 密码认证失败)         stat --------------------------------------------------- 邮箱状态   +OK 2 6415 --------------------------------------------- 2 为该信箱总邮件数,6415 为总字节数         list --------------------------------------------------- 列出每封邮件的字节数   +OK ---------------------------------------------------- 执行命令成功,开始显示,左边为邮件的序号,右边为该邮件的大小   1 537 -------------------------------------------------- 第 1 封邮件,大小为 537 字节         2 5878 ------------------------------------------------- 第 2 封邮件,大小为 5878 字节         .   top 1 -------------------------------------------------- 接收第 1 封邮件   +OK ---------------------------------------------------- 接收成功, 返回第 1 封邮件头   Return-Path: <test1@look.com>   Delivered-To: test2@look.com   Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800   From: test1@look.com   To: test2@look.com   Date: Mon, 25 Oct 2004 14:24:27 +0800   Subject: test mail   .       retr 1 ------------------------------------------------- 接收第 1 封邮件       +OK ---------------------------------------------------- 接收成功, 返回第 1 封邮件全部内容   Return-Path: <test1@look.com>   Delivered-To: test2@look.com   Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800 From: test1@look.com   To: test2@look.com   Date: Mon, 25 Oct 2004 14:24:27 +0800   Subject: test mail   Hi, test2   This is a test mail, you don't reply it.   .   dele 1 ------------------------------------------------- 删除第 1 封邮件     +OK ---------------------------------------------------- 删除成功       dele 2 ------------------------------------------------- 删除第 2 封邮件     +OK ---------------------------------------------------- 删除成功       quit --------------------------------------------------- 结束会话   +OK ---------------------------------------------------- 执行命令成功

IMAP命令概要 IMAP协议中的命令与POP3中最大的不同是每条命令前都一有一个由Client指定的标签,同一个会话中,Client发出的每条命令都会有不同的标签;而Server对每个Client发出的命令都必须以相同的标签作应答。这就使得IMAP会话中Client可以同时送出多个命令,而Server则完全可以并发处理这些命令,不必等待上一个命令执行完毕才处理下一个。 下面是若干常用的IMAP命令 <TAG> LOGIN <user name> <password> LOGIN命令用于登录IMAP服务器,与POP3显著不同的是用户名和口令同时作为参数提交给Server,而POP3完成同样的操作需要USER和PASS两条命令。 C: a001 LOGIN SMITH SESAME S: a001 OK LOGIN completed <TAG> CREATE <folder> CREATE可以创建指定名字的文件夹。文件夹名字通常是带路径的文件夹全名。 C: A003 CREATE owatagusiam/ S: A003 OK CREATE completed C: A004 CREATE owatagusiam/blurdybloop S: A004 OK CREATE completed <TAG> DELETE <folder> DELETE命令删除指定名字的文件夹。文件夹名字通常是带路径的文件夹全名。 C: A683 DELETE blurdybloop S: A683 OK DELETE completed C: A684 DELETE foo S: A684 NO Name "foo" has inferior hierarchical names C: A685 DELETE foo/bar S: A685 OK DELETE Completed <TAG> RENAME <old folder> <new folder> RENAME命令可以修改文件夹的名称。 C: A683 RENAME blurdybloop sarasoop S: A683 OK RENAME completed C: A684 RENAME foo zowie S: A684 OK RENAME Completed <TAG> LIST <BASE> <template> LIST命令用于列出邮箱中已有的文件夹,有点像操作系统的列目录命令。这个命令可以包含起始的路径位置和需要列出的文件夹所符合的特征,可以使用通配符"*"。 C: A101 LIST "" "" S: * LIST (\Noselect) "/" "" S: A101 OK LIST Completed C: A102 LIST #news.comp.mail.misc "" S: * LIST (\Noselect) "." #news. S: A102 OK LIST Completed C: A103 LIST /usr/staff/jones "" S: * LIST (\Noselect) "/" / S: A103 OK LIST Completed C: A202 LIST ~/Mail/ % S: * LIST (\Noselect) "/" ~/Mail/foo S: * LIST () "/" ~/Mail/meetings S: A202 OK LIST completed <TAG> APPEND <folder> <attributes> <size> <mail data> APPEND命令允许Client上载一个邮件到指定的Folder中。命令中包含了新邮件的属性、大小,随后是邮件数据。 C: A003 APPEND saved-messages (\Seen) {310} C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) C: From: Fred Foobar <foobar@Blurdybloop.COM> C: Subject: afternoon meeting C: To: mooch@owatagu.siam.edu C: Message-Id: <B27397-0100000@Blurdybloop.COM> C: MIME-Version: 1.0 C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII C: C: Hello Joe, do you think we can meet at 3:30 tomorrow? C: S: A003 OK APPEND completed <TAG> SELECT <folder> SELECT命令让Client选定某个Folder,表示即将对该Folder内的邮件作操作。 C: A142 SELECT INBOX S: * 172 EXISTS S: * 1 RECENT S: * OK [UNSEEN 12] Message 12 is first unseen S: * OK [UIDVALIDITY 3857529045] UIDs valid S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited S: A142 OK [READ-WRITE] SELECT completed <TAG> FETCH … FETCH命令是IMAP协议里最复杂的命令。FETCH的命令参数很多、很复杂,难以一一列举,但基本的特征是允许将邮件按照MIME结构拆解为零碎的部件来提取。例如,可以利用FETCH命令提取邮件头、某一个附件、或某一邮件附件头部的某一字段,等等。 <TAG> STORE <mail id> <new attributes> STORE命令用于修改指定邮件的属性,包括给邮件打上已读标记、删除标记,等等。 C: A003 STORE 2:4 +FLAGS (\Deleted) S: * 2 FETCH FLAGS (\Deleted \Seen) S: * 3 FETCH FLAGS (\Deleted) S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) S: A003 OK STORE completed <TAG> CLOSE CLOSE命令表示Client结束对当前Folder的访问,随后可以SELECT另一Folder。 C: A341 CLOSE S: A341 OK CLOSE completed <TAG> EXPUNGE EXPUNGE将邮箱中所有打了删除标记的邮件彻底删除。EXPUNGE删除的邮件将不可以恢复。 C: A202 EXPUNGE S: * 3 EXPUNGE S: * 3 EXPUNGE S: * 5 EXPUNGE S: * 8 EXPUNGE S: A202 OK EXPUNGE completed <TAG> LOGOUT LOGOUT命令结束本次IMAP会话。 C: A023 LOGOUT S: * BYE IMAP4rev1 Server logging out S: A023 OK LOGOUT completed (Server and client then close the connection)

简单例子: 1 LOGIN liyp@test.com 123456 2 LIST "" "" 3 LIST "" "*" 4 SELECT INBOX.Sent 5 FETCH 0 body[header] 6 LOGOUT telnet liyp@test.com 143 A LOGIN username password A SELECT INBOX A UID SEARCH ALL A UID FETCH 0:100 FLAGS A LIST "" "*" A COPY 2 INBOX.Trash A STORE 2 FLAGS (\Seen) A UID STORE 16:17 +FLAGS.SILENT (\Flagged) A FETCH 1 body[header] A FETCH 1 body[text][/code]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Pycharm远程调试服务器代码(使用P

    1.随便准备一个项目工程,在本地用Pipenv创建一个虚拟环境并生成Pipfile和pipfile.lock文件,如下:

    用户2398817
  • python r不转义变量

    用户2398817
  • 利用python监控天气

    计划任务可以采用Task Scheduler(windows)、launchd(OS X)、cron(linux)等系统工具。

    用户2398817
  • 利用python监控天气

    计划任务可以采用Task Scheduler(windows)、launchd(OS X)、cron(linux)等系统工具。

    用户2398817
  • 我不想过一眼可以看到头的人生

    很多创业的小伙伴,可能和我一样。早已厌倦在大公司做一个华丽的螺丝钉,或是一直以来都怀揣一个创业的梦想,希望在年轻的时候做一番轰轰烈烈的大事。选择创业,应该会有很...

    光荣与梦想1987
  • CentOS 傻瓜式部署uWSGI + nginx + flask

    这篇帖子是为了提供我自己的July Novel站点的小说数据支撑。解决分布式部署爬虫程序的繁琐过程,由于本人对shell编程并不熟悉,故而先逐步记录操作步骤,通...

    从今若
  • MySQL SQL优化之覆盖索引

    内容概要 利用主索引提升SQL的查询效率是我们经常使用的一个技巧,但是有些时候MySQL给出的执行计划却完全出乎我们的意料,我们预想MySQL会通过索引扫描完成...

    数据和云
  • BAT面试题53:了解如何重置索引和多级索引吗?

    二维数据通常称一个维度为行,另一个为列。且行有行索引,列有列索引。如下图,行索引为:[falcon,barrot,lion,monkey],列索引为:[clas...

    double
  • 原 荐 用 ActFramework 写一个

    老码农
  • 写了个Python小工具,再也不怕孩子偷偷玩电脑游戏啦

    马上要过年啦,中小学生也都放假了,自然要放松放松。但难免有的孩子打起游戏来就控制不住自己。怎么办呢,今天小编就带领大家来做一个防止孩子玩游戏的Python小程序...

    Crossin先生

扫码关注云+社区

领取腾讯云代金券