nodejs 写一个完整的实时监听新邮件 处理了标记已读
时间: 2024-12-28 14:40:09 浏览: 3
Node.js 可以通过 IMAP (Internet Message Access Protocol) 和 POP3 (Post Office Protocol version 3) 来实现实时监控新邮件并处理标记已读的功能。这是一个简化的示例,展示如何使用 `imap` 和 `nodemailer` 这两个库:
首先,你需要安装所需的依赖:
```bash
npm install imap nodemailer dotenv
```
然后创建一个 `.env` 文件,配置IMAP/SMTP信息(密码部分请替换为实际值):
```
EMAIL_USER=your_email@example.com
EMAIL_PASS=your_password
MAILBOX_NAME=INBOX
SERVER_HOST=imap.example.com
SMTP_SERVER=smtp.example.com
SMTP_PORT=587
```
接下来,编写主程序:
```javascript
require('dotenv').config();
const imap = require('imap');
const nodemailer = require('nodemailer');
// 创建电子邮件客户端
const transporter = nodemailer.createTransport({
host: process.env.SMTP_SERVER,
port: parseInt(process.env.SMTP_PORT),
secure: true, // 使用TLS
auth: {
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS,
},
});
function checkNewMail(client) {
client.openBox(process.env.MAILBOX_NAME, true, (err, box) => {
if (err) throw err;
box.on('message', (msg, seqno) => {
msg.once('body', function (stream, info) {
stream.once('end', () => {
console.log(`New message found with ID ${seqno}`);
// 解析邮件内容,这里仅做简单示例,实际应用可能需要解析HTML或正文
const subject = msg.headers.subject;
const isRead = markAsRead(msg);
if (isRead) {
console.log(`Marked as read: ${subject}`);
}
// 发送确认邮件到开发者邮箱
sendConfirmationEmail(msg);
});
});
});
// 开始检查新邮件
client.search(['UNSEEN'], (err, results) => {
if (err) throw err;
results.forEach((id) => client.fetch(id, ({ body, sequence }) => {
let mailObject;
try {
mailObject = JSON.parse(body.toString());
} catch (e) {
console.error('Error parsing email:', e);
}
if (mailObject) {
checkNewMail(client, mailObject);
}
}));
});
});
}
// 标记已读的辅助函数
function markAsRead(msg) {
return new Promise((resolve, reject) => {
msg.removeFlags(['\\Seen'], (err) => {
if (err) reject(err);
else resolve(true);
});
});
}
// 发送确认邮件的辅助函数
function sendConfirmationEmail(mailObject) {
const mailOptions = {
from: process.env.EMAIL_USER,
to: 'developer@example.com',
subject: 'New unread email notification',
text: `Subject: ${mailObject.headers.subject}`,
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.error('Error sending confirmation email:', error);
} else {
console.log(`Confirmation email sent: ${info.response}`);
}
});
}
const client = imap.client({
host: process.env.SERVER_HOST,
port: parseInt(process.env.IMAP_PORT),
tls: true,
});
client.connect({ authTimeout: 90000 }, () => {
console.log('Connected to the server.');
checkNewMail(client);
});
```
这个示例中,我们创建了一个IMAP客户端,并开启一个无限循环来检查新邮件。当有新邮件到来时,它会解析邮件主题,将其标记为已读,并发送一封确认邮件给开发者。
注意这只是一个基础的框架,实际应用可能需要更复杂的错误处理、日志记录以及异步操作的优化。此外,为了持续运行此服务,你可以选择使用像PM2这样的进程管理器。
阅读全文