即使是在即时通讯系统如此便捷的今天,邮件作为一种历史悠久的信息传输方式依然活跃在人们的视野中。通常你只需要编辑好发送的内容,点击发送按钮,就可以将这封信件投递到对方的邮箱中。那么在这其中,到底发生了什么呢?
邮件发送的过程
image.png
- 发信人在用户代理上编辑邮件,并写清楚收件人的邮箱地址;
- 用户代理根据发信人编辑的信息,生成一封符合邮件格式的邮件;
- 用户代理把邮件发送到发信人的的邮件服务器上,邮件服务器上面有一个缓冲队列,发送到邮件服务器上面的邮件都会加入到缓冲队列中,等待邮件服务器上的SMTP客户端进行发送;
- 发信人的邮件服务器使用SMTP协议把这封邮件发送到收件人的邮件服务器上(它会自动根据收件人的邮箱来分析出收件人的邮箱服务器);
- 收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的信箱中;
- 收件人使用用户代理来收取邮件。首先用户代理使用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
- 连接到本地的SMTP服务器
telnet localhost 9025
- greeting to server
helo localhost
- 表明发送者
mail from:<test@example.com>
- 表明接受房
rcpt to:<test@localhost>
5. 发送数据,以单独的**.**开头的行结束
```bash
data
hello world, form xxxx
.
- 断开
quit
上面的helo, mail from, rcpt to,data, quit都是SMTP的命令,用来定义在连接中的动作。详情
在上面的例子中,我们成功地发送了一封邮件到我们本地的邮件服务器中。但是如果我们想按照上面的步骤发送一封邮件给现有的邮件服务器,如xxxx@qq.com,却会失败。
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
网友评论