Как мне обновить nodemailer для использования https (SSL) - PullRequest
0 голосов
/ 16 января 2019

Я настраиваю угловой веб-сайт, и последнее, что мне нужно сделать, чтобы он заработал, это исправить контактную форму. У меня он работал на небезопасной версии сайта, но с тех пор, как я заставил пользователей перейти на версию https с помощью правила перезаписи URL, я больше не могу отправлять электронные письма.

Я получил следующую ошибку: «Смешанное содержимое: страница в« https://www.MyWebsite.com/home#contact-us' была загружена через HTTPS, но запросил небезопасную конечную точку XMLHttpRequest »http://www.MyWebsite.com:3000/send'. Этот запрос был заблокирован; содержимое должно обслуживаться по протоколу HTTPS. "

Я изменил конечную точку на https ('https://www.MyWebsite.com:3000/send'), и теперь я получаю другую ошибку: "ОПЦИИ https://www.MyWebsite.com:3000/send net :: ERR_SSL_PROTOCOL_ERROR". Я не уверен, в чем причина ошибки, но я думаю, что мне нужно что-то изменить в server.js, работающем на сервере.

NodeMailer Service:

import { Injectable } from "@angular/core";
import { HttpClient, HttpHeaders } from "@angular/common/http";
@Injectable({
    providedIn: "root"
})
export class NodeMailerService {
    constructor(private http: HttpClient) {}

    sendEmail(name, email, phone, message) {
        const url = "https://www.MyWebsite.com:3000/send";

        const obj = {
            name: name,
            email: email,
            phone: phone,
            message: message
        };

        return this.http.post(url, obj, {
            headers: new HttpHeaders({ "Content-Type": "application/json" }),
            responseType: "text"
        });
    }
}

server.js:

const express = require("express");
const nodemailer = require("nodemailer");
const app = express();
const port = 3000;
const bodyParser = require("body-parser");

const hostServer = "mail.MyWebsite.com";
const receiverAddress = ["website@MyWebsite.com"]; // Enter the email address to send the emails TO
const userAccount = "website@MyWebsite.com"; // Enter the email address to send the emails FROM
const userPass = "Password1" // Enter the password for the above user account

const transporter = nodemailer.createTransport({
    host: hostServer,
    port: 465,
    secure: true,
    auth: {
        user: userAccount,
        pass: userPass
    },
    tls: {
        ciphers:'SSLv3',
        rejectUnauthorized: false
    }
});

app.use(bodyParser.json());

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header(
        "Access-Control-Allow-Headers",
        "Origin, X-Requested-With, Content-Type, Accept"
    );
    next();
});

app.post("/send", function(req, res) {
    let senderName = req.body.name;
    let senderEmail = req.body.email;
    let senderPhone = req.body.phone;
    let messageSubject = "Website - Contact Request";

    let messageText = "Name: " + senderName + "\n";
    messageText += "Email: " + senderEmail + "\n";
    messageText += "Phone: " + senderPhone + "\n";
    messageText += "Message: " + req.body.message + "\n";

    let mailOptions = {
        to: receiverAddress,
        from: senderEmail,
        subject: messageSubject,
        text: messageText,
        replyTo: senderEmail
    };

    transporter.sendMail(mailOptions, function(error, response) {
        if (error) {
            console.log(error);
            res.end("error");
        } else {
            console.log("Message sent: ", response);
            res.end("sent");
        }
    });
});

app.listen(port, function() {
    console.log("Express started on port: ", port);
});

Я обновил его, чтобы использовать secure: true, но я все еще получаю то же сообщение об ошибке, что и раньше.

Я что-то упустил или я даже смотрю в нужном месте? Я достаточно новичок в этом виде веб-разработки с полным стеком, поэтому любая помощь будет принята с благодарностью. Спасибо !!

1 Ответ

0 голосов
/ 17 января 2019

Оказывается, я искал не тот кусок кода для этого.Проблема была не в nodemailer, а в том, как я обслуживал приложение узла на сервере.Я обновил свой файл server.js в соответствии с тем, что было в посте, на который @candybeer указал мне. Сервер NodeJS https возвращает ERR_SSL_PROTOCOL_ERROR с помощью экспресса

Из диспетчера сертификатов Windows я смог экспортировать сертификат в файл pfx, преобразовать его в файлы .PEM с помощью онлайн-инструмента и затем поместить их впапку server.js и использовал их с https для прослушивания порта.

const https = require('https');
const fs = require("fs");

const options = {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem')
}

// app.listen(port, function() {
//     console.log("Express started on port: ", port);
// });

https.createServer(options, app).listen(port, function() {
    console.log("Express started on port: ", port);
});

Спасибо @candybeer.Высоко ценится

...