如何使用 Express、Jade、Imap 将电子邮件附件传递到 NodeJs 上的消息
How to deliver email attachments to message on NodeJs using Express, Jade, Imap
我目前正在为我们的 NodeJs 应用程序开发电子邮件客户端。
我的一切正常,(列出消息、打开消息等),附件除外。
我应该如何将附件 传送到页面,以便 'cid:someId' 源会将其呈现到正确的位置。
我尝试google如何在不了解如何使用 cid 源的情况下使用它们。
我可以在 NodeJs 上看到这样的邮件附件:
attachments: [
{
contentType: 'image/jpg',
filename: "somePicture.jpg",
contents: "" //BASE64 string
cid: 'someId'
}
]
mailer.js
var Mailer = function() {
this.getMessages = function(cb) {
------ IMAP MESSAGES READ ------
cb(messages);
------ IMAP MESSAGES READ ------
};
this.getMessage = function(seqNo, cb) {
------ IMAP MESSAGE READ ------
cb(messages);
------ IMAP MESSAGE READ ------
};
};
module.exports = new Mailer();
router.js
var mailer = require('./mailer');
app.get('/mailer', function(req, res) {
var data = { title: 'Mailer' };
mailer.getMessages(function(messages) {
data.messages = messages;
res.render('index', data);
});
});
app.get('/message/:seqNo', function(req, res) {
mailer.getMessage(req.param.seqNo, function(message) {
res.render('message', {message: message);
});
});
index.jade
html
head
script(type='text/javascript', src='main.js')
body
div
each message in messages
div(id=message.seqNo)
header
p= message.from
p= message.to
p= message.subject
div.content
p= message.message
message.jade
!{message.html}
生成如下内容:
<html>
<head>
</head>
<body>
--- some content ---
<img src='cid:someId' />
--- some content ---
</body>
</html>
Chrome 上的开发者工具,我看到 cid:Request
Name cid:someid
Method GET
Status (failed)
Initiator (index):1
Size 0 B
Time 2ms
和header显示
General
Request URL: cid:someId
Request Headers
Provisional headers are shown
Accept:image/webp,image/*,*/*;q=0.8
Referer:http://localhost:5000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
看起来您正在向 cid:someId 发出直接请求,而服务器或浏览器不知道如何处理该协议。
如果您只需要渲染,您可以在提供消息之前解析消息并注入内容。例如:
var message = "<img src='panda.jpg' /><img src='cid:someId' />";
function fetchContent(cid) {
// Lookup goes here
// return actual content url or base64 content, which will render
return '/pictures/dog.png';
}
var result = message.replace(/('|")(cid:.*?)('|")/g, fetchContent(''));
这将 return
<img src='panda.jpg' /><img src=/pictures/dog.png />
我目前正在为我们的 NodeJs 应用程序开发电子邮件客户端。
我的一切正常,(列出消息、打开消息等),附件除外。
我应该如何将附件 传送到页面,以便 'cid:someId' 源会将其呈现到正确的位置。
我尝试google如何在不了解如何使用 cid 源的情况下使用它们。
我可以在 NodeJs 上看到这样的邮件附件:
attachments: [
{
contentType: 'image/jpg',
filename: "somePicture.jpg",
contents: "" //BASE64 string
cid: 'someId'
}
]
mailer.js
var Mailer = function() {
this.getMessages = function(cb) {
------ IMAP MESSAGES READ ------
cb(messages);
------ IMAP MESSAGES READ ------
};
this.getMessage = function(seqNo, cb) {
------ IMAP MESSAGE READ ------
cb(messages);
------ IMAP MESSAGE READ ------
};
};
module.exports = new Mailer();
router.js
var mailer = require('./mailer');
app.get('/mailer', function(req, res) {
var data = { title: 'Mailer' };
mailer.getMessages(function(messages) {
data.messages = messages;
res.render('index', data);
});
});
app.get('/message/:seqNo', function(req, res) {
mailer.getMessage(req.param.seqNo, function(message) {
res.render('message', {message: message);
});
});
index.jade
html
head
script(type='text/javascript', src='main.js')
body
div
each message in messages
div(id=message.seqNo)
header
p= message.from
p= message.to
p= message.subject
div.content
p= message.message
message.jade
!{message.html}
生成如下内容:
<html>
<head>
</head>
<body>
--- some content ---
<img src='cid:someId' />
--- some content ---
</body>
</html>
Chrome 上的开发者工具,我看到 cid:Request
Name cid:someid
Method GET
Status (failed)
Initiator (index):1
Size 0 B
Time 2ms
和header显示
General
Request URL: cid:someId
Request Headers
Provisional headers are shown
Accept:image/webp,image/*,*/*;q=0.8
Referer:http://localhost:5000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
看起来您正在向 cid:someId 发出直接请求,而服务器或浏览器不知道如何处理该协议。
如果您只需要渲染,您可以在提供消息之前解析消息并注入内容。例如:
var message = "<img src='panda.jpg' /><img src='cid:someId' />";
function fetchContent(cid) {
// Lookup goes here
// return actual content url or base64 content, which will render
return '/pictures/dog.png';
}
var result = message.replace(/('|")(cid:.*?)('|")/g, fetchContent(''));
这将 return
<img src='panda.jpg' /><img src=/pictures/dog.png />