通过firebase发送邮件sendgrid出现错误403

问题描述 投票:0回答:1

一旦检测到数据库中有写入,我就无法从 Firebase 函数发送电子邮件。

  • 我检查了使用命令
    firebase functions:config:set
  • 输入的密钥 api 和邮件
  • 我检查了我的密钥确实处于“完全访问”状态
  • 我验证了我的帐户(邮件...)和 dns 参数
  • 我在谷歌云上授权了我的函数中所有用户的所有访问权限,我什至将我的实时数据库写入和读取规则设置为true。

尽管如此,我的控制台上总是出现 403 错误。

加载资源失败:服务器响应状态为403()

当然我的应用程序已正确初始化和部署, 我运行了

npm install -g firebase-tools
并检查了 package.json 文件夹中的 sendgrid 依赖项。

我什至在 firebase.json 中添加了:`

"functions": [
{
  "sendEmail": {
    "allow": "true"
  },`

我的代码:

import * as functions from 'firebase-functions';
import admin = require('firebase-admin');
admin.initializeApp();
import * as sgMail from '@sendgrid/mail';

// Configure SendGrid with your API key
const sendgridApiKey = functions.config().sendgrid.api_key;
sgMail.setApiKey(sendgridApiKey);

export const sendEmail = functions.database
  .ref('{Client}')
  .onCreate(async (snapshot, context) => {
    try {
      const writeData = snapshot.val();

      // Retrieve necessary information from the database
      const fromEmail = functions.config().sendgrid.sender_email;
      const toEmail = writeData.email;
      const message = writeData.message;

      const msg = {
        to: toEmail,
        from: fromEmail,
        subject: 'Nouvelle écriture détectée dans la base de données',
        text: `Un nouvel enregistrement a été ajouté à la base de données : ${message}`,
        html: `Un nouvel enregistrement a été ajouté à la base de données : ${message}`,
        templateId: functions.config().sendgrid.sender_templates,
      };

      // Send the email via SendGrid
      await sgMail.send(msg);

      console.log('E-mail envoyé avec succès !');
    } catch (error) {
      console.error('Erreur lors de l\'envoi de l\'e-mail :', error);
    }
  });
firebase google-cloud-platform firebase-realtime-database google-cloud-functions sendgrid
1个回答
0
投票

我没有尝试你的云功能代码,但我可以看到两个潜在的问题:

  1. 您正在混合 JavaScript
    require()
    import()
    语句。您应该执行以下操作:
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();
import * as sgMail from '@sendgrid/mail';
  1. 您不需要返回 Promise(或值)来向 Cloud Function 平台指示所有异步工作(即
    sgMail.send()
    )已完成。有关此关键点的更多详细信息,请参阅 Firebase 文档
export const sendEmail = functions.database
  .ref('{Client}')
  .onCreate(async (snapshot, context) => {
    try {
      const writeData = snapshot.val();

      // Retrieve necessary information from the database
      const fromEmail = functions.config().sendgrid.sender_email;
      const toEmail = writeData.email;
      const message = writeData.message;

      const msg = {
        to: toEmail,
        from: fromEmail,
        subject: 'Nouvelle écriture détectée dans la base de données',
        text: `Un nouvel enregistrement a été ajouté à la base de données : ${message}`,
        html: `Un nouvel enregistrement a été ajouté à la base de données : ${message}`,
        templateId: functions.config().sendgrid.sender_templates,
      };

      // Send the email via SendGrid
      await sgMail.send(msg);

      console.log('E-mail envoyé avec succès !');

      return true;  <==== See addition here

    } catch (error) {
      console.error('Erreur lors de l\'envoi de l\'e-mail :', error);

      return true;  <==== See addition here
    }
  });

我也会尝试不使用

templateId
选项,只是为了检查这是否是问题的原因。

© www.soinside.com 2019 - 2024. All rights reserved.