You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Python实现Firebase新用户注册后自动发送SendGrid欢迎邮件?

嘿,我刚好有过类似的需求,给你一个纯Python的独立解决方案,完全不需要Cloud Functions或者Zapier,两种实现方式任你选:

核心思路

我们的目标是捕获新用户注册事件,然后自动调用SendGrid API发送欢迎邮件。这里提供两种方案:实时监听(用户注册后立即触发)和定时轮询(适合对实时性要求不高的场景),都用纯Python实现。

前置准备

首先安装所需依赖:

pip install firebase-admin sendgrid python-dotenv

然后创建一个.env文件管理敏感信息(避免硬编码密钥):

FIREBASE_SERVICE_ACCOUNT_PATH=path/to/your/firebase-service-account.json
SENDGRID_API_KEY=your_sendgrid_api_key_here
SENDGRID_FROM_EMAIL=your-verified-sender-email@example.com

注意:Firebase服务账号密钥可以在Firebase控制台的「项目设置」→「服务账号」页面下载;SendGrid的发件邮箱必须经过验证,否则邮件会被归类为垃圾邮件。


方案1:实时监听Firebase数据库新增用户(推荐,实时触发)

如果你的应用在用户注册时会把用户数据写入Firestore或Realtime Database(大部分应用都会这么做),我们可以直接监听数据库的新增文档事件,一有新用户就发邮件。

代码示例(Firestore版本)

import os
import time
from dotenv import load_dotenv
import firebase_admin
from firebase_admin import credentials, firestore
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

# 加载环境变量
load_dotenv()

# 初始化Firebase Admin SDK
cred = credentials.Certificate(os.getenv("FIREBASE_SERVICE_ACCOUNT_PATH"))
firebase_admin.initialize_app(cred)
db = firestore.client()

# 初始化SendGrid客户端
sg = SendGridAPIClient(os.getenv("SENDGRID_API_KEY"))
FROM_EMAIL = os.getenv("SENDGRID_FROM_EMAIL")

def send_welcome_email(to_email):
    """发送欢迎邮件的核心函数"""
    message = Mail(
        from_email=FROM_EMAIL,
        to_emails=to_email,
        subject="🎉 欢迎加入我们的平台!",
        html_content="<strong>很高兴你能来!</strong><p>感谢你注册我们的应用,期待你的精彩使用体验。</p>"
    )
    try:
        response = sg.send(message)
        print(f"✅ 欢迎邮件已发送到 {to_email},状态码: {response.status_code}")
    except Exception as e:
        print(f"❌ 发送邮件失败 ({to_email}): {str(e)}")

def listen_for_new_users():
    """实时监听Firestore users集合的新增文档"""
    def on_snapshot(doc_snapshot, changes, read_time):
        for change in changes:
            if change.type.name == "ADDED":
                user_data = change.document.to_dict()
                user_email = user_data.get("email")
                if user_email:
                    send_welcome_email(user_email)
                else:
                    print(f"⚠️ 新用户 {change.document.id} 未提供邮箱信息")

    # 启动监听(监听users集合的所有变化)
    col_query = db.collection("users")
    watch = col_query.on_snapshot(on_snapshot)

    print("🚀 新用户监听服务已启动,按Ctrl+C停止...")
    try:
        while True:
            time.sleep(3600)  # 保持进程持续运行
    except KeyboardInterrupt:
        watch.unsubscribe()
        print("🛑 监听服务已停止")

if __name__ == "__main__":
    listen_for_new_users()

方案2:定时轮询Firebase Auth获取新用户(实现简单)

如果你的应用没有把用户数据写入数据库,或者不想用实时监听,可以定时查询Firebase Auth的用户列表,对比上次查询的时间,找出新注册的用户。

代码示例

import os
import time
from datetime import datetime, timezone
from dotenv import load_dotenv
import firebase_admin
from firebase_admin import credentials, auth
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

# 加载环境变量和初始化服务
load_dotenv()
cred = credentials.Certificate(os.getenv("FIREBASE_SERVICE_ACCOUNT_PATH"))
firebase_admin.initialize_app(cred)
sg = SendGridAPIClient(os.getenv("SENDGRID_API_KEY"))
FROM_EMAIL = os.getenv("SENDGRID_FROM_EMAIL")

# 存储上次检查的时间(可以写入本地文件持久化,避免重启后丢失)
last_check_time = datetime.now(timezone.utc)

def send_welcome_email(to_email):
    """同方案1的发送函数"""
    message = Mail(
        from_email=FROM_EMAIL,
        to_emails=to_email,
        subject="🎉 欢迎加入我们的平台!",
        html_content="<strong>很高兴你能来!</strong><p>感谢你注册我们的应用,期待你的精彩使用体验。</p>"
    )
    try:
        response = sg.send(message)
        print(f"✅ 欢迎邮件已发送到 {to_email},状态码: {response.status_code}")
    except Exception as e:
        print(f"❌ 发送邮件失败 ({to_email}): {str(e)}")

def check_for_new_users():
    global last_check_time
    print(f"🔍 开始检查新用户,上次检查时间: {last_check_time.strftime('%Y-%m-%d %H:%M:%S UTC')}")
    
    # 分页获取Firebase Auth用户(一次最多返回1000条)
    page = auth.list_users()
    while page:
        for user in page.users:
            # 转换用户创建时间为UTC datetime
            create_timestamp = user.user_metadata.creation_timestamp
            create_datetime = datetime.fromtimestamp(create_timestamp / 1000, timezone.utc)
            
            if create_datetime > last_check_time:
                send_welcome_email(user.email)
        
        # 获取下一页用户
        page = page.get_next_page()
    
    # 更新上次检查时间
    last_check_time = datetime.now(timezone.utc)
    print("✅ 新用户检查完成")

if __name__ == "__main__":
    print("🚀 定时新用户检查服务已启动,每5分钟检查一次...")
    while True:
        check_for_new_users()
        time.sleep(300)  # 5分钟检查一次,可根据需求调整间隔

部署建议

要让这个脚本一直运行,可以:

  • Linux系统:用systemd创建一个后台服务,设置开机自启。
  • Windows系统:用NSSM把脚本注册为Windows服务。
  • 云服务器:把脚本部署到AWS EC2、阿里云ECS等云服务器,保持后台运行。
  • Docker容器:把脚本打包成Docker镜像,用容器运行,更易管理。

注意事项

  • 确保Firebase服务账号拥有读取Firestore/Auth用户的权限(默认下载的服务账号已经具备这些权限)。
  • 可以添加日志记录功能,把发送日志写入文件,方便后续排查问题。
  • 如果用户量很大,定时轮询要注意分页处理,避免一次性请求过多数据导致超时。

内容的提问来源于stack exchange,提问作者Ajay Shewale

火山引擎 最新活动