Почему nodemailer отправляет дубликаты писем? - PullRequest
1 голос
/ 07 ноября 2019

Так что это очень странный вопрос, и я не ожидаю, что кто-то действительно ответит на него, но я здесь, чтобы попытаться выяснить, сталкивался ли кто-либо с такой же проблемой.

Проблема, которую я замечаю, заключается в том, что наше приложение, похоже, отправляет повторяющиеся электронные письма. Например, я могу отправить отчет из нашего приложения, и оно отправит это электронное письмо один раз, а затем похоже, что другое письмо будет отправлено ровно через минуту.

Я использую 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"
    }
  }

Если кто-толюбые идеи или предложения, я был бы очень признателен, спасибо!

1 Ответ

2 голосов
/ 07 ноября 2019

Ваше электронное письмо отправляется по любому запросу, отправленному на ваш сервер, поэтому, если вы обращаетесь к нему через браузер, браузер отправит два запроса, один для запрошенного пути и один для favicon.ico, и вы также отправляетеэлектронная почта при запросе /favicon.ico.

Это может произойти, потому что ваш обработчик маршрута настроен следующим образом:

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

Это означает, что вы пытаетесь отправить электронное письмо для каждого входящегоHTTP-запрос независимо от пути.

Итак, если вы заходите на свой хост с браузером на http://yourdomain/, он сначала запросит /, а затем браузер запросит /favicon.ico, в результате чего вы затем отправитевторое электронное письмо.

Я предлагаю изменить это значение:

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

на следующее:

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

или, еще более конкретно, например:

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

Таким образом, вы отправляете электронное письмо только по одному конкретному запросу пути, и оно не отправляет электронное письмо никаким другим запросам, таким как favicon. Возможно, вы захотите добавить универсальный обработчик Express 404. Для любых других маршрутов.


Примечание. В схеме REST вы, вероятно, отправите электронное письмо с запросом POST, а не с запросом GET. GET будет извлекать ресурс способом, предназначенным только для чтения, который не меняет никакого состояния, поэтому он не будет иметь побочного эффекта при отправке электронной почты. Примечание: это вообще не связано с вашей проблемой, просто комментарий о типичном дизайне REST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...