Nodemailer очень медленный после отправки электронной почты

Я использую nodemailer для отправки электронной почты после того, как пользователь отправит контактную форму, а затем пользователь будет перенаправлен на страницу благодарности. Я работал над этим проектом на cloud9 сейчас. Вот мой код:

var express                 = require("express"),
    bodyParse               = require("body-parser"),
    multer                  = require("multer"),
    nodemailer              = require("nodemailer");

var app = express();

app.use(bodyParse.urlencoded({extended: true}));

var smtpTransport = nodemailer.createTransport({
service: "Gmail",
auth: {
    type: "OAuth2",
    user: "[email protected]",
    clientId: "xxxxxx",
    clientSecret: "xxxxx",
    refreshToken: "xxxxx",
    accessToken: "xxxxx"
    }
});
app.post("/upload", function(req, res){
  var mailOptions = {
    from: "xxxx <[email protected]", // sender address
    to: "[email protected]", // list of receivers
    subject: "xxxx", // Subject line
    text: "xxxx",
    attachments: [
       {   // file on disk as an attachment
        filename: 'xxxx.txt',
        path: './uploads/' + req.body.filename // stream this file
      }
    ]
  };

 // send mail with defined transport object
 smtpTransport.sendMail(mailOptions, (error, info) => {
   if (error) {
       return console.log(error);
   }
   console.log('Message %s sent: %s', info.messageId, info.response);
   });
 })

Электронное письмо может быть успешно отправлено, и я могу увидеть его через несколько секунд после отправки формы, но страница будет продолжать загружаться до тех пор, пока не появится какая-то ошибка (я прикрепил сообщение об ошибке ниже). В течение этого периода я получу еще 1 или 2 таких же письма.

<html>
<head>
  <meta charset='utf-8'> 
  <title>Error 502 - Bad Gateway</title>
  <link rel="stylesheet" type="text/css" 
  href="https://cdn.c9.io/errors/style.css" />
  <style type="text/css">
  .error_content {
    background: rgba(255, 255, 255, 0.23);
    padding: 10px;
    width: 641px;
    margin: 25px 0;
    display: none;
  }

  #error-msg {
    display: block;
  }
  </style>
</head>
<body class="errorUnknown light">
  <div id="wrapper">
    <h1>Error 502 - Bad Gateway</h1>
    <div class="error_content" id="error-msg">
      <p>Please click <a href="javascript:location.reload(true)">here</a> to try again, if the issue persists please contact <a href="https://c9.io/support">support</a></p>
    </div>

    <a href="http://status.c9.io">Status Page</a> |
    <a href="https://c9.io/support">Support</a> |
    <a href="https://c9.io/dashboard.html">Dashboard</a> |
    <a href="https://c9.io">Home</a>
  </div>
</body>
</html>

QQQQQ: Что мне делать, чтобы это исправить? QQQQQ: Это проблема моего кода или сервера cloud9?


person simonhb1990    schedule 17.04.2017    source источник


Ответы (1)


Это потому, что вы никогда не отправляете ответ браузеру в своем обработчике app.post(). Таким образом, браузер просто ждет ответа от вашего сервера, и он никогда этого не делает - в конечном итоге истекает время ожидания. Это полностью ваш код, он не имеет ничего общего с вашим облачным провайдером.

Внутри вашего обработчика app.post() вам нужно какое-то содержимое ответа, например res.send(xxx), которое сообщит браузеру, что почтовый запрос завершен. Если этот POST из вызова ajax, вы можете просто отправить любой ответ, который вы хотите, обратно на ваш Javascript на стороне клиента. Если запрос POST представляет собой отправку формы в браузере, вам необходимо отправить обратно HTML-страницу, которую браузер загрузит и покажет пользователю.

person jfriend00    schedule 17.04.2017
comment
Спасибо, это проблема. - person simonhb1990; 18.04.2017
comment
Спасибо, что дали мне знать. - person simonhb1990; 18.04.2017
comment
@jfriend00 Не могли бы вы проверить это? Я отправляю ответ, но он не работает. stackoverflow.com/q/61552971/3878760 - person Ivan; 02.05.2020