SMTP Nodemailer не работает на производственном сервере - PullRequest
0 голосов
/ 23 мая 2019

У меня проблемы с отправкой электронной почты через nodemailer - SMTP (с другого хоста) на производстве

Я загрузил свой API на сервер (Scaleway Dev), я использую Ubuntu Bionic и во время тестирования заметил, что этоне отправлять электронные письма (которые мне нужны для проверки пользователя).

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

Я попытался проверить его на localhost, подумав, что это может быть зависимость от dotenv, но она работает там, что дает?

версия узла на моем сервере 8.10.0 , а на моем персональном компьютере 11.12.0

это мои зависимости

    enter code here
    "dependencies": {

    "bcrypt": "^3.0.6",
    "body-parse": "^0.1.0",
    "client-sessions": "^0.8.0",
    "connect": "^3.6.6",
    "cookie-parser": "~1.4.4",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "dotenv": "^8.0.0",
    "express": "~4.16.1",
    "express-session": "^1.16.1",
    "express-validator": "^5.3.1",
    "http-errors": "~1.6.3",
    "moment": "^2.24.0",
    "mongoose": "^5.5.8",
    "morgan": "~1.9.1",
    "nodemailer": "^6.1.1",
    "nodemon": "^1.19.0",
    "passport": "^0.4.0",
    "pug": "2.0.0-beta11",
    "randomstring": "^1.1.5",
    "session": "^0.1.0",
    "session-mongoose": "^0.5.2"
}

эти параметры указаны хостом, которым я пользуюсь

//this is my transporter constant

    const transporter   = nodemailer.createTransport({
    host: '*different host from the server*',
    port: 465,
    secure: true,
    auth: {
        user: my used email(hardcoded),
        pass: process.env.EMAILPASS
    },
    tls: {
        rejectUnauthorized: false
    }
});

//my email options

    let mailOptions ={
                from: '"Company Name <noreply@*different host DNS*>',
                to: req.body.email,
                subject: *subject*
                html: `Email Content with confirmation token`
            }

//emailing the message itself

    transporter.sendMail(mailOptions, (err, info) => {
                if(err){
                    return console.log(err);
                }
                console.log("message sent");
            });

Я использую этот генератор электронной почты (https://generator.email/) для быстрых одноразовых писем. Рассылка начинается после того, как я сохраню пользователя.

Я в недоумениичто мне делать ... любая помощь приветствуется

1 Ответ

0 голосов
/ 23 мая 2019

В прошлом у меня были проблемы с nodemailer.Я использую mailgun (https://www.mailgun.com/) для отправки своих электронных писем. Они предлагают 10000 электронных писем в месяц бесплатно. Вот код, который работает с mailgun:

зависимости:

"express": "4.16.4",
"config": "3.0.1",
"nodemailer": "5.1.1",
"nodemailer-mailgun-transport": "1.4.0"
*Код 1007 * (он находится внутри экспресс-маршрутизатора):
const config = require('config');
const nodemailer = require('nodemailer');
const mg = require('nodemailer-mailgun-transport');
const express = require('express');
const router = express.Router();

router.post('/', async (req, res) => {

    //the data has to be an array. It will send as many emails as the number of items in the array
    var emailsList = ["test@test.com"];
    emailsList[0].name = "Test Name";

    var auth = {
        auth: {
            api_key: config.get('mailgunApiKey'),
            domain: config.get('mailgunDomain')
        }
    };

    transporter = nodemailer.createTransport(mg(auth)),
    EmailTemplate = require('email-templates').EmailTemplate,
    path = require('path'),
    Promise = require('bluebird');

    function sendEmail (obj) {
        return transporter.sendMail(obj);
    }

    function loadTemplate (templateName, contexts) {
        let template = new EmailTemplate(path.join(__dirname, '../templates', templateName));
        return Promise.all(contexts.map((context) => {
            return new Promise((resolve, reject) => {
                template.render(context, (err, result) => {
                    if (err) reject(err);
                    else resolve({
                        email: result,
                        context,
                    });
                });
            });
        }));
    }

    loadTemplate('dailyReferralEmail', emailsList).then((results) => {
        return Promise.all(results.map((result) => {
            sendEmail({
                to: result.context.email,
                from: 'Your Name <your-email@test.com>',
                'h:Reply-To': 'your-email@test.com',
                subject: result.email.subject,
                html: result.email.html,
                text: result.email.text,
            });
        }));
    }).then(() => {

        var response = {
            text: "Email sent"
        }
        JSON.stringify(response);
        res.status(200).send(response);
    });
});

module.exports = router; 

В качестве генератора шаблонов я использую HBS, поэтому у вас должна быть папка шаблонов в корневой папке вашего проекта, с этимдерево:

enter image description here

Вы можете использовать свои переменные внутри своей электронной почты с {{}}.

Внутри html.hbs:

<p>Hello {{name}}</p>

Внутри subject.hbs

Subject of your email

Внутри text.hbs

Preview text of your email

Надеюсь, это поможет!

...