SMTP简单邮件传输协议

即使是在即时通讯系统如此便捷的今天,邮件作为一种历史悠久的信息传输方式依然活跃在人们的视野中。通常你只需要编辑好发送的内容,点击发送按钮,就可以将这封信件投递到对方的邮箱中。那么在这其中,到底发生了什么呢?

邮件发送的过程

image.png
  1. 发信人在用户代理上编辑邮件,并写清楚收件人的邮箱地址;
  2. 用户代理根据发信人编辑的信息,生成一封符合邮件格式的邮件;
  3. 用户代理把邮件发送到发信人的的邮件服务器上,邮件服务器上面有一个缓冲队列,发送到邮件服务器上面的邮件都会加入到缓冲队列中,等待邮件服务器上的SMTP客户端进行发送;
  4. 发信人的邮件服务器使用SMTP协议把这封邮件发送到收件人的邮件服务器上(它会自动根据收件人的邮箱来分析出收件人的邮箱服务器);
  5. 收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的信箱中;
  6. 收件人使用用户代理来收取邮件。首先用户代理使用POP3协议来连接收件人所在的邮件服务器,身份验证成功后,用户代理就可以把邮件服务器上面的收件人邮箱里面的邮件读取出来,并展示给收件人。

节选自邮件发送的原理


什么是SMTP协议

从客户端或者邮件服务器发送邮件,都需要用到SMTP协议,即简单邮件传输协议
SMTP协议负责发送邮件,与之对应的协议是IMAP/POP3协议,负责从服务器接收邮件。

SMTP通讯示例

首先我们需要在本地启动一个SMTP 服务器,用来接受SMTP请求。

var smtp = require('smtp-protocol');

var server = smtp.createServer(function (req) {
  req.on('to', function (to, ack) {
    console.log('to', to)
    var domain = to.split('@')[1] || 'localhost';
    if (domain === 'localhost') ack.accept()
    else ack.reject()
  });

  req.on('message', function (stream, ack) {
    console.log('from: ' + req.from);
    console.log('to: ' + req.to);

    stream.pipe(process.stdout, { end: false });
    ack.accept();
  });
});

server.listen(9025);
console.log('listening 9025')

然后我们在控制台使用telnet命令演示SMTP协议工作的过程


image.png
  1. 连接到本地的SMTP服务器
telnet localhost 9025
  1. greeting to server
helo localhost
  1. 表明发送者
mail from:<test@example.com>
  1. 表明接受房
rcpt to:<test@localhost>
5. 发送数据,以单独的**.**开头的行结束
```bash
data
hello world, form xxxx
.
  1. 断开
quit

上面的helo, mail from, rcpt to,data, quit都是SMTP的命令,用来定义在连接中的动作。详情

在上面的例子中,我们成功地发送了一封邮件到我们本地的邮件服务器中。但是如果我们想按照上面的步骤发送一封邮件给现有的邮件服务器,如xxxx@qq.com,却会失败。

image.png

qq.com 会拒绝我们的HELO。究其原因是qq邮箱将我们的邮件标记为了垃圾邮件,所以主动断开了我们的发送请求。在现在的邮件联盟中,对邮件服务器存在信用打分的情况,如果你的邮件服务器被qq.com屏蔽了,那么你也就不能发送邮件到qq邮箱了。具体的解释可以看这篇文章

ESMTP

ESMTP协议采用EHLO 命令来向服务器表明身份。这个命令支持客户端验证之后登录到邮件服务器,然后使用登录的账户发送邮件。

控制台登录的例子可以查看这篇文章
下面我将演示如何使用node.js 来发送第三方邮件。

var express = require('express');
var nodemailer = require("nodemailer");
var app = express();
/*
    Here we are configuring our SMTP Server details.
    STMP is mail server which is responsible for sending and recieving email.
*/
var smtpTransport = nodemailer.createTransport({

  host: "smtp.qq.com",
  auth: {
    user: "yourname@qq.com", // 你的邮箱地址
    pass: "xxxxxx" // 你的邮箱授权码
  }
});
app.get('/', function (req, res) {
  res.sendfile('index.html');
});
app.get('/send', function (req, res) {
  var mailOptions = {
    to: req.query.to,
    subject: req.query.subject,
    text: req.query.text,
    from: 'xxxxxx@qq.com'
  }
  console.log(mailOptions);
  smtpTransport.sendMail(mailOptions, function (error, response) {
    if (error) {
      console.log(error);
      res.end("error");
    } else {
      console.log("Message sent: " + response.message);
      res.end("sent");
    }
  });
});

/*--------------------Routing Over----------------------------*/

app.listen(3000, function () {
  console.log("Express Started on Port 3000");
});

我们需要在自己的QQ邮箱账户中获得SMTP授权码用来AUTH登录。


image.png

最后,这里有几篇介绍SMTP的文章同样值得一读
利用SMTP发送邮件
Understanding the SMTP Protocol

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354