2017-12-09 136 views
8

Myślę, że brakuje tu czegoś bardzo prostego. Mam prostą, jednostronicową aplikację node.js, która używa nodemailer do wysyłania dowolnych danych formularzy do mojej skrzynki odbiorczej. złożyćAplikacja do wysyłania danych formularzy do mojej skrzynki odbiorczej nie działa poprawnie w Firebase

Moi index.js:

var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var nodemailer = require('nodemailer'); 

app.use(bodyParser.urlencoded({ extended: false })); 
app.use(bodyParser.json()); 

var transporter = nodemailer.createTransport({ 
    service: 'gmail', 
    auth: { 
     user: '[email protected]', 
     pass: 'mypassword' 
    } 
}); 

app.use(express.static('public')); //public folder with my html files 
app.get('', function (req, res) { 
    res.sendFile(__dirname + "/"); 
}) 

app.post('/', function (req, res) { 
    response = { 
     name: req.body.name, 
     email: req.body.email, 
     message: req.body.message 
    }; 
    var mailClient = { 
     from: '[email protected]', 
     to: '[email protected]', 
     subject: `Message from ${response.name}`, 
     text: 'MyMessage' 
    }; 
    transporter.sendMail(mailClient, function (error, info) { 
     if (error) { 
      console.log(error); //not happening 
     } else { 
      res.redirect("/success.html"); //also not happening 
     } 
    }); 
}) 

var server = app.listen(80, function() { 
    var host = server.address().address 
    var port = server.address().port 
    console.log("App listening at http://%s:%s", host, port) 
}) 

Gdy uruchomię to na moim komputerze lokalnym, używając npm start w katalogu głównym, aplikacja działa perfekcyjnie na localhost. Nodemailer działa poprawnie; kiedy przesyłam, dane mojego formularza są wysyłane do mnie pocztą elektroniczną, a następnie przekierowuję do strony z wynikami.

Jednak, gdy wdrażam to w Firebase, wygląda na to, że część nodemailer nie działa. Strona ładuje się z moimi statycznymi plikami, ale kiedy próbuję przesłać cokolwiek za pośrednictwem formularza, strona po prostu się odświeża (jak wtedy, gdy masz przycisk przesyłania z czystym html), zamiast przekierowywać mnie na moją stronę sukcesu i przesyłać dane pocztą e-mail.

Czy jest coś, co muszę zmienić w moim kodzie, aby działał z firebase?

Edit - żadne kłody: enter image description here

+0

Co znajduje się w logach na konsoli? Na jakim planie płatności jest twój projekt? –

+0

Jeśli mówisz o konsoli mojej witryny, nie otrzymuję żadnych błędów. Jestem na planie darmowej płatności (iskra), – user7548189

+1

Jaka jest twoja konfiguracja nodemailer? I mówię o twoich dziennikach funkcji projektu Firebase, jak widać w konsoli Firebase. –

Odpowiedz

3

Google wymaga płatnego konta w celu skorzystania z "wychodzącej Networking". Wolny poziom nie pozwala na wykonywanie połączeń wychodzących. Obejmuje to wysyłanie poczty na zdalny serwer poczty (np. Wysyłanie wiadomości e-mail na konto Yahoo, Gmail lub Outlook).

See their pricing page for more info.

Look dla "wychodzącej Networking".

Jeśli chcesz korzystać z interfejsu API Gmaila, nadal możesz korzystać z funkcji firebase na nodemailer i osiągnąć to, czego szukasz i pozostać na bezpłatnym poziomie. A fully working example is already available in the firebase-samples repository! Chciałbym podkreślić, o czym wspomina się w linkowanych samouczkach, czyli o tym, że Gmail ma numer email sending quota, o którym powinieneś wiedzieć.

+0

Zauważyłem, że bezpłatny poziom pozwala na wykonywanie połączeń wychodzących w usługach Google (chyba nie wysyłam ich do innej skrzynki odbiorczej na podstawie Twojej odpowiedzi). Czy istnieje obejście tego problemu bez konieczności uaktualniania do warstwy płatnej? – user7548189

+0

@ user7548189 Właśnie zaktualizowałem odpowiedź! 'firebase-samples' ma przykład użycia Gmaila do wysyłania poczty poprzez' firebase-functions' oraz 'nodemailer'. Jak już wspomniano, istnieje limit wysyłania, ale powinien zadziałać, ponieważ interfejs API Gmaila nie powinien być uznawany za usługę zewnętrzną! Mam nadzieję, że pomaga! – Swivel

+0

Testowałem twoją zaktualizowaną odpowiedź, a także próbowałem przejść na płatny abonament (płać, jak idziesz). Niestety, oba nie miały znaczenia. Czy znasz coś, co może być przyczyną problemu? – user7548189

1

Próbowałem dowiedzieć się problem w kodzie, ale nie znalazłem, mam również funkcję wysyłania wiadomości e-mail z kodem weryfikacyjnym do uwierzytelniania/weryfikacji identyfikatora e-mail. W tym celu tworzę jeden identyfikator gmaila i nadałem mu identyfikator/hasło do wysyłania poczty. Maile są wysyłane z tego identyfikatora gmail z node.js, gdy rejestr użytkownika jest identyfikatorem e-mailowym, wysyłamy e-mail z kodem weryfikacyjnym. Mój kod jest następujący:

'use strict'; 

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
const express = require('express'); 
var bodyParser = require('body-parser'); 
var users = require('./users/route'); 

const app = express(); 
const nodemailer = require('nodemailer'); 
// Configure the email transport using the default SMTP transport and a GMail account. 
// For other types of transports such as Sendgrid see https://nodemailer.com/transports/ 
// TODO: Configure the `gmail.email` and `gmail.password` Google Cloud environment variables. 
const gmailEmail = '[email protected]'; 
const gmailPassword = 'password'; 
const gcm = require('node-gcm'); 
const mailTransport = nodemailer.createTransport(
     `smtps://${gmailEmail}:${gmailPassword}@smtp.gmail.com`); 

// parse application/x-www-form-urlencoded 
app.use(bodyParser.urlencoded({extended: false})) 

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount), 
    databaseURL: "https://myapp.firebaseio.com" 
}); 
//admin.initializeApp(functions.config().firebase); 

// Express middleware that validates Firebase ID Tokens passed in the Authorization HTTP header. 
// The Firebase ID token needs to be passed as a Bearer token in the Authorization HTTP header like this: 
// `Authorization: Bearer <Firebase ID Token>`. 
// when decoded successfully, the ID Token content will be added as `req.user`. 
const authenticate = (req, res, next) => { 
    if (!req.headers.authorization || !req.headers.authorization.startsWith('Bearer')) { 
     res.status(403).send('Unauthorized'); 
     return; 
    } 
    const idToken = req.headers.authorization.split('Bearer ')[1]; 
    admin.auth().verifyIdToken(idToken).then(decodedIdToken => { 
     req.user = decodedIdToken; 
     next(); 
    }).catch(error => { 
     res.status(403).send('Unauthorized'); 
    }); 
}; 

app.get("/token", (req, res) => { 

    res.status(200).send(admin.auth().applicationDefault()); 
    admin.auth().createCustomToken(req.query.uid) 
      .then(function (customToken) { 
       res.status(200).send(customToken); 
      }) 
      .catch(function (error) { 
       console.log("Error creating custom token:", error); 
      }); 

}); 


// GET /api/verifyEmail?code="1234" 
app.get('/verifyEmail', (req, res) => { 

    // Get the one-time code from the query parameter. 
    var verificationCode = req.query.code; 
    var displayName = req.query.displayName; 
    var email = req.query.email; //If GET request 
    const mailOptions = { 
     from: `Linkuni <[email protected]>`, 
     to: email 
    }; 

    // The user subscribed to the newsletter. 
    mailOptions.subject = `Welcome to Linkuni`; 
    mailOptions.text = `Hi ${displayName || ''}\n\n Welcome to Linkuni. We hope you will enjoy our service. Please enter this code:${verificationCode} into the app.\n\nThank you,\nLinkuni Team`; 

    return mailTransport.sendMail(mailOptions).then(() => { 
     console.log('Verification email sent to:', email); 
    }); 
}); 

Mam nadzieję, że to pomoże! :)