zoukankan      html  css  js  c++  java
  • 一步一步从原理跟我学邮件收取及发送 3.telnet命令行发一封信

        首先要感谢博客园管理员的及时回复,本系列的第二篇文章得以恢复到首页,这是对作者的莫大鼓励.说实在的本来我真的挺受打击的.好在管理员说只是排版上有些问题,要用代码块修饰下相关的信息.说来惭愧因为常年编码已经习惯了用纯文本和空白行等处理文章,确实谈不上对文章排版,后面我会多学习应用排版功能.

        经过前面两篇文章,假设大家已经学会了使用 telnet 命令行登录邮箱,那么我们可以开始学习发送邮件了!

        这一次我先不讲原理,先上结果图和需要的命令行吧.

    图1.发送成功的命令行截图

    使用到的命令如下

     1 AUTH LOGIN
     2 dGVzdDFAbmV3YnQubmV0
     3 MTIzNDU2
     4 
     5 MAIL FROM: <test1@newbt.net>
     6 RCPT TO: <clq@newbt.net>
     7 DATA
     8 
     9 From: "test1@newbt.net" <test1@newbt.net>
    10 To: "clq@newbt.net" <clq@newbt.net>
    11 Subject: test
    12 Date: Sun, 21 Jan 2018 11:48:15 GMT
    13 
    14 Hello World.
    15 .


    命令比之前的多了好多行啊! 其实原理要比登录那一篇简单多了,而且没有那么多兼容性的问题,命令格式很清晰.
    具体要发送的命令其实只有三个:

    1 谁发的信(MAIL FROM:)
    2 发信给谁(RCPT TO:)
    3 信件的内容是什么(DATA)



    这里仍然有几个要注意的地方:
    1.目前真实的环境里要登录成功后才能用这些命令,虽然 smtp 协议没有这样规定;
    2.MAIL FROM,RCPT TO 命令后要带有一个英文的 ":" 符号和一个英文的 "空格",千万不要在中文输入法状态下输入这两个符号,很多初学者都错在这个地方.再强调一次,那个空格一定要有,绝对不能省略,否则很多邮箱会收不到.

    大家会问了,怎么只有三个命令,"from:" 那些不也是要输入的吗?
    对,那些要输入,但不是 smtp 的命令,而是邮件的内容,它们实际上是 DATA 命令的组成部分,看到最后那个 "." 了吗? 那个英文句号可不是什么信件内容的结束符号,而是 DATA 命令的结束符号,它也不是一个点那么简单,实际上它的完整表达式应该是 "<CR><LF>.<CR><LF>".这里就要说到一个网络编程中极其重要的概念 -- 就是<CR><LF> -- 回车换行,初学者马上会说了这个我知道不就是 " " 嘛.我要说的是这只说对了一半,因为只对了一半在实际开发中就很致命,因为换行符有很严重的兼容性问题,大多数程序员都是 C 语言出身,他们在所有的教程中都学会了用 " " 来换行,但真实的操作系统中换行有的却是 " ",有的则是两个字符" "(顺便提一下在 delphi 中是 #13#10),而 CRLF 概念就是用来解决这个问题的: 为了避免这种兼容性问题,rfc 规定网络通讯中的换行一律统一使用 " " 即 CR LF (Carriage Return, Line Feed) 两个字符一起固定表示网络命令的换行.

    具体到 "<CR><LF>.<CR><LF>" 那就是说邮件内容结束时请先换行输入一个点,然后再换一次行才能表示这封信是写完了.记住!有两个换行! 这个结束符号到 DATA 命令之间的内容都是信件的内容.

    好了,说到这里大家可以去试试了,不过这次得申请两个 newbt.net 的邮箱. 要注意信件中的内容 from,to 部分要和 MAIL FROM, RCPT TO 命令中的保持一致,否则在真实的环境中会被认成是垃圾邮件的.

    说到垃圾邮件,那就更没有什么认定标准了,虽然业界内推出过很多反垃圾邮件的建议和标准,但实际上都没有真实可行.明白这个概念后我们才好说怎么发信给 163 的邮箱.

    从理论上来说将邮件发送给 163 邮箱只要将前面的 RCPT TO 命令和邮件内容中的 to 部分改成 163 地址就可以了,例如:

     1 MAIL FROM: <test1@newbt.net>
     2 RCPT TO: <clq_work@163.com>
     3 DATA
     4 
     5 From: "test1@newbt.net" <test1@newbt.net>
     6 To: "clq_work@163.com" <clq_work@163.com>
     7 Subject: test
     8 Date: Sun, 21 Jan 2018 11:48:15 GMT
     9 
    10 Hello World.
    11 .



    图2.发送给163的命令行截图


    图3.163 收到的信件

        这里的 clq_work@163.com 是我的邮箱,我确实能收到,但换成你的地址后恐怕就不行了. why? 你会百思不得其解.解决的办法是你要先用你的 163 邮箱先给 test1@newbt.net 发一封信,或者是联系地址中加上这个地址.当然了这里要换成你自己申请的 newbt.net 邮箱. 这就是 163 邮箱收不到很多网站注册邮件的最主要的原因,也是为什么我要推荐 newbt.net 的原因.(当然这还不是唯一的原因) 如果你没用 newbt.net 而是 gmail 结果也是一样的,你会说 gmail 本来就发不了嘛,这个说法不对,不过换 qq 邮箱吧.运气好的话 qq 邮箱是能收到前几封 ... 这在学习过程中会造成很大的困扰, 163 的这种做法有好有坏也不能全盘否定. 另外我还要提醒一下大家,在很多很多时候163邮箱甚至收不到自己邮箱的来信,因为触发了它的反垃圾机制,这种情况在开发过程中很多见,比如你在上面的邮件内容中少写了一个标志,这时候你就会想,怎么没收到呢? from 不对? 密码不对? 地址不对? dns 不对? 我的邮箱服务器没连上163? 163服务器还没分发到我的邮箱?

        所以 163 邮箱真是不适合用来开发,不过我很推荐您一切都测试无误后用 163 确认一下.因为在 163 的环境下都实现了还有什么环境不行的!(当然了实际还是有的) 所以 163 环境我每篇文章基本上都是要走一轮的.(163快给广告费)

    好了,这一篇总算是结束了,我会排版好文章,也请读者们多给建议.

    --------------------------------------------------

    注1:需要说明的是这是最简单的电子邮件格式,真实的邮件内容要复杂得多,具体要等到我们说到 mime 格式后才能详细说了.

    注2:要换用 163 邮箱发送的话记得登录前先发送 EHLO 命令(具体原因看本系列第二篇文章)


  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/-clq/p/8328568.html
Copyright © 2011-2022 走看看