Email worker always triggered 3 times

I have an email worker that takes a screenshot of an email and saves it in R2. The worker is executed 3 times meaning my screenshots are created 3 times. The email activity table shows me 3 emails resulted in Delivery Failed. My code is simple and not secret, would be grateful if someone could tell me what I am doing wrong
import { Browser, BrowserWorker, launch } from "@cloudflare/puppeteer";
import {
ExecutionContext,
ForwardableEmailMessage,
R2Bucket,
} from "@cloudflare/workers-types";
import PostalMime from "postal-mime";

export interface Env {
EMAIL_BINDING: any;
SCREENSHOTS: R2Bucket;
BROWSER: BrowserWorker;
}

export default {
async email(
message: ForwardableEmailMessage,
env: Env,
ctx: ExecutionContext,
) {
if (!message.from.includes("[email protected]")) {
throw new Error("Invalid sender");
}

const email = await PostalMime.parse(message.raw as any);

const browser = await launch(env.BROWSER);
const page = await browser.newPage();

await page.setViewport({
width: 1200,
height: 800,
deviceScaleFactor: 1,
});

await page.setContent(email.html, {
waitUntil: "networkidle0",
timeout: 10000,
});

const screenshot = await page.screenshot({
fullPage: true,
type: "png",
});

const key = `screenshot-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
await env.SCREENSHOTS.put(key, screenshot, {
httpMetadata: {
contentType: "image/png",
},
customMetadata: {
emailFrom: message.from,
emailSubject: email.subject || "",
emailDate: new Date().toISOString(),
},
});
await browser.close();

console.log(
`Screenshot saved with key: ${key} for email from: ${message.from} with subject: ${email.subject}`,
);

return;
},
};
import { Browser, BrowserWorker, launch } from "@cloudflare/puppeteer";
import {
ExecutionContext,
ForwardableEmailMessage,
R2Bucket,
} from "@cloudflare/workers-types";
import PostalMime from "postal-mime";

export interface Env {
EMAIL_BINDING: any;
SCREENSHOTS: R2Bucket;
BROWSER: BrowserWorker;
}

export default {
async email(
message: ForwardableEmailMessage,
env: Env,
ctx: ExecutionContext,
) {
if (!message.from.includes("[email protected]")) {
throw new Error("Invalid sender");
}

const email = await PostalMime.parse(message.raw as any);

const browser = await launch(env.BROWSER);
const page = await browser.newPage();

await page.setViewport({
width: 1200,
height: 800,
deviceScaleFactor: 1,
});

await page.setContent(email.html, {
waitUntil: "networkidle0",
timeout: 10000,
});

const screenshot = await page.screenshot({
fullPage: true,
type: "png",
});

const key = `screenshot-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
await env.SCREENSHOTS.put(key, screenshot, {
httpMetadata: {
contentType: "image/png",
},
customMetadata: {
emailFrom: message.from,
emailSubject: email.subject || "",
emailDate: new Date().toISOString(),
},
});
await browser.close();

console.log(
`Screenshot saved with key: ${key} for email from: ${message.from} with subject: ${email.subject}`,
);

return;
},
};
1 Reply
misterpoppins
misterpoppinsOP2mo ago
It seems like that this was exceeding worker walltime limits. I moved to queues and I think it is working consistently. I'm now experiencing retries on email sent much earlier in the day.

Did you find this page helpful?