This is Part 1 of a series on implementing Gmail sending with Cloudflare Workers:
- Part 1: Setup (Current)
- Part 2: Development Environment (Coming Soon)
- Part 3: Implementation (Coming Soon)
Introduction
When implementing contact forms on static websites hosted on Cloudflare Pages, email sending functionality requires a serverless solution. This guide demonstrates how to set up Gmail API with Cloudflare Workers for handling form submissions.
Cloudflare Workers Constraints
When working with Cloudflare Workers, there are two major limitations to consider:
-
Google API Package Unavailable:
- Cloudflare Workers is not a Node.js environment
- Direct HTTP requests to Google API REST endpoints must be used instead of Node.js client libraries
-
Nodemailer Package Unavailable:
- Nodemailer depends on Node.js environment
- Cannot be used in Cloudflare Workers
Setup Process
1. Create a Service Account
- Access Google Cloud Console
- Create a new project or select an existing one
- Navigate to "IAM & Admin" > "Service Accounts"
- Click "Create Service Account"
- Enter service account name and description
- Skip optional settings and click "Done"
- Note the OAuth2 Client ID for later use
2. Assign Required Roles
- Navigate to "IAM & Admin" > "IAM"
- Select the relevant principal
- Click "Grant Access"
- Add the service account as a new principal
- Assign the following roles:
- Service Account Admin
- Service Account Key Admin
- Service Account Token Creator
- IAP Policy Admin
- Save the changes
3. Enable Gmail API
- Navigate to "APIs & Services" > "Library"
- Search for "gmail"
- Select "Gmail API"
- Click "Enable"
4. Add Organization Policy Admin Role
- Navigate to "IAM & Admin" > "IAM"
- Edit the organization admin
- Add "Organization Policy Admin" role
- Save changes
5. Disable Service Account Key Creation Policy
- Navigate to "IAM & Admin" > "Organization Policies"
- Filter for "iam.disableServiceAccountKeyCreation"
- Click the policy link
- Click "Manage Policy"
- Select "Override parent policy"
- Add rule and set to "Enforced"
- Click "Done"
6. Generate Service Account Key
- Navigate to "IAM & Admin" > "Service Accounts"
- Select the created service account
- Go to "Keys" tab
- Click "Add Key" > "Create New Key"
- Select JSON format
- Create and securely store the downloaded JSON file
7. Configure Domain-Wide Delegation
- Access Google Workspace Admin Console
- Navigate to Security > Access and Data Control > API Controls
- Click "Manage Domain Wide Delegation"
- Add new client ID:
- Enter the service account's client ID
- Add scope: https://www.googleapis.com/auth/gmail.send
- Click "Authorize"
Note: Domain-wide delegation should be carefully considered in larger organizations due to security implications.
Additional Configuration
When sending emails from Gmail aliases, remember to add the alias address:
- Go to Gmail Settings > Accounts
- Add the alias email address through "Add another email address"
Important Note About Free Email Services
Previously, MailChannels Send API was widely recommended as a free email sending solution for Cloudflare Workers. However, as of June 30, 2024, the integration between MailChannels and Cloudflare has been discontinued. This has affected many developers who relied on this service for their email sending needs.
Many AI language models still suggest MailChannels as a solution because their training data predates this service discontinuation. This situation highlights the importance of verifying current service availability, especially when working with third-party integrations.
The Gmail API implementation described in this guide serves as a reliable alternative, though it requires more initial setup compared to the previous MailChannels solution.
Next Steps
The next article in this series will cover the development environment setup and implementation details for using the Gmail API with Cloudflare Workers.
The above is the detailed content of Implementing Gmail Sending with Cloudflare Workers - Setup Guide. For more information, please follow other related articles on the PHP Chinese website!