NodeMailer ставит в очередь исходящую почту, но электронная почта никогда не отправляется - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь отправить электронное письмо со своего собственного домена без использования внешнего SMTP-сервера. Я использую SMTP-соединение NodeMailer :

let options = {
    secure: true,
    port: consts.portOut,//465
    host: consts.host, //mydomain.com
    transactionLog: true,
    debug: true,
    requireTLS: true,
    authMethod: 'PLAIN',
};

let connection = new SMTPConnection(options);

connection.connect(function() {
    let auth = {
        user: 'abc',
        pass: 'def'
    };

    connection.login(auth, function(err) {
        if (err) {
            console.log("Authentication failed!", err);
        }
        console.log("Authentication to SMTP server successful.");

        let envelope = {
            from: 'fee@mydomain.com',
            to: 'myemail@gmail.com'
        };

        let message = 'message hello world';

        connection.send(envelope, message, function(err, info) {
            if (err) {
                console.log("err:::", err);
            } else {
                console.log('info?', info);
                //connection.quit();
            }
        });

        connection.quit();

    });

});

connection.on("error", function(err) {
    console.log(err);
});

Код моего сервера с использованием SMTP-сервера NodeMailer :

const options = {
    secure: true,
    size: 25000000, //25MB
    authMethods: ['PLAIN'],
    key: hskey,
    cert: hscert,
    ca: [hschain],
    onAuth(auth, session, callback) {
        if(auth.username !== 'abc' || auth.password !== 'def') {
            return callback(new Error('Invalid username or password'));
        }
        callback(null, {user: 123}); // where 123 is the user id or similar property
    },
    onConnect(session, callback) {
        console.log("the address is:", session.remoteAddress)
        if (session.remoteAddress === consts.ip) {
            return callback(); // Accept the address
        } else {
            return callback(new Error('Only connections from %s allowed', consts.ip));
        }

    },
    onData(stream, session, callback) {
        simpleParser(stream, (err, parsed) => {
            if(err) {
                console.error(err);
            } else {
                console.log(parsed);
            }

        });
        stream.on('end', function () {
            let err;
            if(stream.sizeExceeded){
                err = new Error('Message exceeds fixed maximum message size');
                err.responseCode = 552;
                return callback(err);
            }
            callback(null, 'Message queued as abcdef');
        });
    }

};

const emailServer = new SMTPServer(options);

emailServer.listen(consts.portOut, function () {
    processSMTPConnection(consts, hskey);
});

emailServer.on("error", function (err) {
    console.error("Error %s", err.message);
});

Итак, после того, как мой клиент подключился к моему локальному SMTP-серверу, последнее сообщение, которое я получаю, это «Сообщение, помещенное в очередь как abcdef», и ничего не отправляется (ничего не приходит в мой почтовый ящик gmail или любые другие службы тестирования электронной почты) ...

Не заблокированы неправильные порты, поэтому я должен что-то упустить (?). Разве это не как правильно использовать NodeMailer? Могу ли я отправлять электронные письма с моего локального домена с помощью NodeMailer?

1 Ответ

0 голосов
/ 06 декабря 2018

Документация здесь имеет примечание, в котором говорится:

Этот модуль не осуществляет доставку электронной почты сам по себе. SMTP-сервер позволяет прослушивать порты 25/24/465/587 и т. д. с использованием SMTP или LMTP протокол и все. Ваше собственное приложение отвечает за Принятие и доставка сообщения по назначению.

(акцент мой)

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

Чтобы немного рассказать о том, как отправить сообщение, как только оно поступит на ваш SMTP-сервер. Если адрес TO является локальным, просто поместите сообщение в их почтовый ящик. Но если вы хотите «переслать» сообщение, вам необходимо связаться с почтовым обменом TO с сообщением.

Что-то вроде:

const toExchange = getMX(parsed.to);
const outMessage = createMessageFromParsed(parsed);

const transporter = createTransport({
    port: 25,
    host: toExchange,
    name: os.hostname(),
});

transporter.sendMail(outMessage);
...