javascript - 为什么 nodemailer 发送重复的电子邮件?

标签 javascript node.js express nodemailer

所以这是一个非常奇怪的问题,我不希望有人真正对此有答案,但我来这里是想看看是否有人遇到过同样的问题。

我注意到的问题是我们的应用程序似乎在发送重复的电子邮件。例如,我可以从我们的应用程序发送一份报告,它会发送一次该电子邮件,然后看起来恰好在一分钟后发送了另一封。

我正在使用 nodemailer从我们的应用程序服务器发送电子邮件,我们在办公室使用的默认电子邮件是 Outlook v16.0.12130.20272使用 IMAP。这些电子邮件是通过我们的 noreply 电子邮件发送的,我相信该电子邮件是通过 GoDaddy 托管的。

我自己发送了测试电子邮件并查看了网络选项卡以查看是否可能是超时问题,但响应以 200 OK status 完成时间也显示为已完成。此外,当我控制台记录响应时,它只发生一次,这让我相信它实际上只发送一封电子邮件。在主机发送电子邮件和我们的收件人实际收到电子邮件之间一定发生了一些事情,但我不太确定。

这是server.js 文件。这是 smtp 的位置正在提出请求。

var nodemailer = require("nodemailer");

const path = require('path');
const express = require('express');
const http = require('http');
const fs = require('fs');
const socketIO = require('socket.io');
const bodyParser = require('body-parser')



import env from '../env.config.json';

const PORT = require('../env.config.json').SERVER.PORT;
const publicPath = path.join(__dirname, '../public');
import api from './routers/api-routing';
//---------------------------------------------------------------------------

var smtpTransport = nodemailer.createTransport({
    service: env.EMAIL.SERVICE,
    host: env.EMAIL.HOST,
    auth: {
        user:env.EMAIL.AUTH.USER,
        pass:env.EMAIL.AUTH.PASS
    }
});

var mailCounter = 0;
var numPeople = 0;

var app = express();
var server = http.createServer(app);
const port = PORT || 3000;
app.use(express.static(publicPath));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true}));

const io = socketIO(server);
app.use('/api', api(app, io));
// require('./routers/api-routing')(app, io);
//$.get("/send", { to: to, subject: subject).value, text: 'html' }, function (data) { });
app.get('*', function (request, response) {
    if (request.get('x-auth')) console.log("x-auth: ", request.get('x-auth'));
    const proto = request.get('X-Forwarded-Proto');
    if (proto) {
        if (proto === 'http') response.redirect(301, "https://ourdomain.com".concat(request.url));
    }
    response.sendFile(path.resolve(__dirname, '../', 'public', 'index.html'))
    if ((request.url).substring(0, 5) == "/send") {
        var mailOptions = {
            to: request.query.to,
            bcc: request.query.bcc,
            subject: request.query.subject,
            text: request.query.text
        }
        //console.log(mailOptions); Read up on NodeMailer for details.
        smtpTransport.sendMail({  //email options
            from: "COMPANY <noreply@ouremail.com>", // sender address.  Must be the same as authenticated user if using Gmail.
            to: mailOptions.to,
            bcc: "COMPANY <noreply@ouremail.com>",    // sending to itself
            subject: mailOptions.subject, // subject
            html: mailOptions.text, // body
        }, function (error, response) {  //callback
            if (error) {
                console.log(error);
            } else {
                console.log("Message sent");
               //console.log("Amount of people getting this email: " + response.accepted.length);
            }

            smtpTransport.close(); // shut down the connection pool, no more messages.  Comment this line out to continue sending emails.
        });
    }

});



io.on('connection', (socket) => {

    require('./middleware/sockets')(socket);


});

server.listen(port, () => {
  console.log(`Server is up on port ${port}.`);
});

这是我们的 env.config.file 中与电子邮件相关的部分。

"EMAIL": {
    "SERVICE": "Godaddy",
    "HOST": "smtp.gmail.com",
    "AUTH": {
      "USER": "noreply@ouremail.com",
      "PASS": "OURPASS"
    }
  }

如果有人有任何想法或建议,我将不胜感激,谢谢!

最佳答案

您的电子邮件是根据发送到您的服务器的任何请求发送的,因此如果您通过浏览器访问它,浏览器将发送两个请求,一个用于请求的路径,一个用于 favicon.ico,您还发送了一个请求 /favicon.ico 时发送电子邮件。

这可能会发生,因为您的路由处理程序配置为:

app.get('*', ...);

这意味着无论路径如何,您都试图为每个传入的 http 请求发送一封电子邮件。

因此,如果您使用浏览器访问主机 http://yourdomain/,它将首先请求 /,然后浏览器将请求 /favicon.ico,导致您随后发送第二封电子邮件。

我的建议是改成这样:

app.get('*', ...);

为此:

app.get('/', ...);

或者,更具体如:

app.get('/sendemail', ...);

因此,您仅在一个特定路径请求上发送电子邮件,它不会在没有其他请求(例如网站图标)时发送电子邮件。您可能想为任何其他路由添加一个通用的 express 404 处理程序。


注意:在 REST 设计中,您可能会发送带有 POST 请求的电子邮件,而不是 GET 请求。 GET 将以不更改任何状态的只读方式检索资源,因此不会产生发送电子邮件的副作用。注意:这与您的问题完全无关,只是对典型 REST 设计的评论。

关于javascript - 为什么 nodemailer 发送重复的电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58751977/

相关文章:

javascript - 环境变量 - 未定义

mysql - 为什么在 Node.js 中使用 escape() 时 MySQL 不显示错误?

javascript - 有什么方法可以使用 Express3.x 将模板呈现为变量吗?

javascript - 距离测量逻辑

javascript if else 语句问题

javascript - API key 不以 "SG."SendGrid 开头

node.js - 错误: Cannot find module 'C:\server.js' in Node server for Meanjs

node.js - 使用 Google 的 reCAPTCHA 进行功能测试 Node/Express 应用程序

node.js - 如何为 express.js 服务器设置 SSL 证书?

javascript - 如何在 Angular2 的模板指令中使用 html?