美文网首页OpsDev
SMTP简单邮件传输协议

SMTP简单邮件传输协议

作者: Bruselee | 来源:发表于2019-05-21 16:04 被阅读9次

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

邮件发送的过程

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

相关文章

  • Python电子邮件

    一、SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它...

  • python实现SMTP发送邮件

    SMTP协议 SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMT...

  • Python模块·SMTP发送邮件

    一、SMTP概念: SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,使...

  • Python学习九十四天:Python批量发送邮件

    1.SMTP协议 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一个...

  • springboot配置邮件服务

    什么是SMTP? SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它...

  • 辨析IMAP、SMTP、POP3

    SMTP SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它...

  • SMTP协议研究

    SMTP简介 SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向...

  • SMTP协议

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议。 邮件协议的理解 首先要...

  • 013 Rust 网络编程,SMTP 介绍

    概念 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用来传输电子邮件的...

  • Python发送QQ邮件

    QQ邮箱传输协议 SMTP:简单邮件传输协议(由源地址到目的地址的传输规则) smtp.qq.com :QQ邮箱服...

网友评论

    本文标题:SMTP简单邮件传输协议

    本文链接:https://www.haomeiwen.com/subject/kvdjzqtx.html