【问题标题】:Sending mail from Firebase webapp从 Firebase 网络应用发送邮件
【发布时间】:2017-12-26 15:25:33
【问题描述】:

var express = require('express');
var app =  express();
var nodemailer=require('nodemailer');

var transporter = nodemailer.createTransport('smtps://username@gmail.com:password@smtp.gmail.com');
app.get('/sendMail', function(req,res){
	var mailOptions={
		to: 'receiver@gmail.com',
		subject: 'Test Mail',
		html: 'Testing the Mail'
	}
	transporter.sendMail(mailOptions,function(err,response){
		if(err){
			res.end('Mail not sent');
		}
		else{
			res.end('Mail sent');
		}
	});
}).listen(9091);

console.log('This is running');

我正在开发一个 Firebase 网络应用。我需要通过我的网络应用程序发送电子邮件。我看了一些教程并找到了一些代码。使用上面的代码,我可以发送电子邮件。它在端口 9091 中运行。当地址栏有 www.mywebsite.com/sendMail 时,该消息将被发送。但是当我将此页面托管到 Firebase 时,此代码要进行哪些更改,是否必须更改端口号?请帮助在我的网络应用中实现此代码。

【问题讨论】:

  • 看起来您的 Web 应用程序是用 NodeJS 开发的——一个在服务器端运行 javascript 代码的平台。但是 Firebase 托管是一个静态主机,这意味着 javascript 将在客户端运行。如果您想在 Firebase 上托管您的应用,可以使用创建一个发送邮件的Cloud Function
  • @RosárioPereiraFernandes 我想你是这么说的,我只能通过云功能发送邮件。

标签: email firebase nodemailer firebase-hosting


【解决方案1】:

2019 年更新:或者,您可以使用新的 Trigger Email Firebase Extension(目前处于测试阶段)。


正如我在评论中提到的,问题是:您的 Web 应用程序是使用 NodeJS 构建的,而您正试图将其托管在静态主机环境 (Firebase Hosting) 上。但 Firebase 也有 Cloud Functions - 一个让你在 NodeJS 环境中运行函数的服务。因此,您应该改为将应用部署到该服务。

Get Started with Cloud Functions 真的很容易。由于您已经设置了 Firebase 托管,因此您只需转到该目录并使用以下命令设置 Cloud Functions:

firebase init functions

将创建一个名为“functions”的新文件夹,并自动将index.js 文件添加到该文件夹​​中。现在这是您要编写函数的文件(我们实际上只需要 1 个函数 triggered by HTTP 来发送电子邮件)。

因此,要创建此功能,您将不再需要 Express。您可以删除它,然后稍微更改一下您的 index.js 文件以添加 firebase-functions,因此它将变为:

//var express = require('express'); No longer needed
//var app =  express(); No longer needed
var nodemailer=require('nodemailer');
const functions = require('firebase-functions');

var transporter = nodemailer.createTransport('smtps://username@gmail.com:password@smtp.gmail.com');

exports.sendMail = functions.https.onRequest((req, res) =>{
    var mailOptions={
        to: 'receiver@gmail.com',
        subject: 'Test Mail',
        html: 'Testing the Mail'
    }
    transporter.sendMail(mailOptions,function(err,response){
        if(err){
            res.end('Mail not sent');
        }
        else{
            res.end('Mail sent');
        }
    });
});

现在当你想发送消息时,你可以使用这个网址:https://us-central1-<project-id>.cloudfunctions.net/sendMail

<project-id> 替换为您的 Firebase 项目 ID。

【讨论】:

  • 如何使用表单中的电子邮件内容?
  • @AjithRamesh - 如果表单使用 POST 方法提交,则数据将位于 req.body,如果是 GET,则数据将位于 req.query
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多