You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloudflare Worker无法发送邮件问题排查求助

联系表单邮件无法送达问题

我参考Cloudflare官方文档编写了处理联系表单提交的代码,但邮件始终无法送达。已在Email Routing中验证了邮箱地址,环境变量也已加载。

index.ts

import { EmailMessage } from 'cloudflare:email';
import { createMimeMessage, MIMEMessage } from 'mimetext';

export interface Env {
    SEB: SendEmail;
    RECIPIENT_EMAIL: string;
    SENDER_EMAIL: string;
}

interface ContactForm {
    name: string;
    email: string;
    subject: string;
    message: string;
}

export default {
    async fetch(request, env, ctx): Promise<Response> {
        const url = new URL(request.url);
        if (request.method === 'POST' && url.pathname === '/api/contact') {
            await handleContactForm(request, env);
        }
        return new Response('Message sent!', { status: 201 });
    },
} satisfies ExportedHandler<Env>;

async function handleContactForm(request: Request, env: Env) {
    const formData: ContactForm = await request.json();
    const { name, email, subject, message } = formData;

    if (!name || !email || !subject || !message) {
        return new Response('Missing required fields', { status: 400 });
    }

    console.log(env.RECIPIENT_EMAIL);
    console.log(env.SENDER_EMAIL);

    const mime = await createMimeMsg(env, formData);
    const emailMessage = new EmailMessage(env.SENDER_EMAIL, env.RECIPIENT_EMAIL, mime.asRaw());
    try {
        await env.SEB.send(emailMessage);
    } catch (e) {
        // @ts-expect-error unknown
        return new Response(e.message);
    }
}

async function createMimeMsg(env: Env, data: ContactForm): Promise<MIMEMessage> {
    const msg = createMimeMessage();
    msg.setSender({ name: data.name, addr: env.SENDER_EMAIL });
    msg.setRecipient(env.RECIPIENT_EMAIL);
    msg.setSubject(data.subject);
    msg.addMessage({
        contentType: 'text/plain',
        data: data.message,
    });
    return msg;
}

wrangler.jsonc

{
    "$schema": "node_modules/wrangler/config-schema.json",
    "name": "contact-form-worker",
    "main": "src/index.ts",
    "compatibility_date": "2025-08-12",
    "compatibility_flags": ["nodejs_compat"],
    "observability": {
        "enabled": true
    },
    "vars": {
        "RECIPIENT_EMAIL": "${RECIPIENT_EMAIL}",
        "SENDER_EMAIL": "${SENDER_EMAIL}"
    },
    "send_email": [
        {
            "name": "SEB",
            "destination_address": "${RECIPIENT_EMAIL}"
        }
    ]
}

更新:

调用/api/contact接口后,收件人邮箱(尝试过Gmail和Outlook)未收到邮件,垃圾邮件箱中也没有。

后续问题答复:

  • 调用env.SEB.send()时是否有错误或日志?没有
  • Email Routing是否完全设置且收件人已验证?收件人是我的个人邮箱,根据文档,应该验证的是发件人邮箱
  • 是否尝试过不使用MIME格式发送简单测试邮件?您指的是移除contentType吗?这会导致类型错误,无法实现
  • 使用的Wrangler和Email API版本是多少?Wrangler 4.28.1
  • Worker外的Email Routing是否正常工作?是的

更新2:

我尝试按照文档使用Resend发送邮件,一切正常!问题似乎出在Cloudflare,可能是Cloudflare服务器被垃圾邮件过滤器列入黑名单。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:25:10