NextJS Deployed to Workers with SendEmail binding, Types issue.

Hey, Quiet newbie around workers, I tried to create NextJS project (via OpenNext) and deploy it to Workers, achieved that, next was to bind a D1 Database, this one almost went smoothly, right now I am trying to bind SendEmail, but there is this issue I could not overcome. First things were that Module cloudflare:email was non existent, so with help of AI - managed to extend webpack configuration to declare external cloudflare:email module, and provide a mock to that. Now issue is with workload, after successfully deploying to Workers, and trying to execute the code responsible for SendEmail, there is an error occurring, as below.
TypeError: Failed to execute 'send' on 'SendEmail': parameter 1 is not of type 'EmailMessage'.
TypeError: Failed to execute 'send' on 'SendEmail': parameter 1 is not of type 'EmailMessage'.
, does anyone know how to resolve this? I assume this might be an issue with cloudflare-env.d.ts types that are different than the ones that SendEmail is expecting, right? Kind regards, T
1 Reply
tomek
tomekOP6mo ago
Hey, to anyone who would struggle same, I just created 2nd worker, created service binding, and remotely called 2nd worker to do the mailing for me. NextJS App Router, example code snippet
abstract class WorkerEmail {
public abstract forward(data: NewsletterProps): Promise<void>;
}

const sendEmail = async (data: NewsletterProps) => {
const { env } = getCloudflareContext();

const workerEmail = env.WORKER_EMAIL as unknown as WorkerEmail;

await workerEmail.forward(data);
};
abstract class WorkerEmail {
public abstract forward(data: NewsletterProps): Promise<void>;
}

const sendEmail = async (data: NewsletterProps) => {
const { env } = getCloudflareContext();

const workerEmail = env.WORKER_EMAIL as unknown as WorkerEmail;

await workerEmail.forward(data);
};
2nd worker snippet
import { EmailMessage } from 'cloudflare:email';
import { env, WorkerEntrypoint } from 'cloudflare:workers';
import { createMimeMessage } from 'mimetext';

interface NewsletterProps {
name: string;
email: string;
phone: string;
nip: string;
about: string;
companySize: string;
}

const autoResponder = async (data: NewsletterProps) => {};
const forwardToMain = async (data: NewsletterProps) => {};

export default class Worker extends WorkerEntrypoint {
async fetch() {
return new Response();
}

async forward(data: NewsletterProps) {
const msg = createMimeMessage();
msg.setSender({ name: 'GPT-4', addr: '***' });
msg.setRecipient(data.email);
msg.setSubject('An email generated in a worker');
msg.addMessage({
contentType: 'text/plain',
data: `Congratulations, you just sent an email from a worker.`,
});

var message = new EmailMessage('***', data.email, msg.asRaw());
try {
await env.SEND_EMAIL.send(message);
} catch (e: any) {
return new Response(e.message);
}
}
}
import { EmailMessage } from 'cloudflare:email';
import { env, WorkerEntrypoint } from 'cloudflare:workers';
import { createMimeMessage } from 'mimetext';

interface NewsletterProps {
name: string;
email: string;
phone: string;
nip: string;
about: string;
companySize: string;
}

const autoResponder = async (data: NewsletterProps) => {};
const forwardToMain = async (data: NewsletterProps) => {};

export default class Worker extends WorkerEntrypoint {
async fetch() {
return new Response();
}

async forward(data: NewsletterProps) {
const msg = createMimeMessage();
msg.setSender({ name: 'GPT-4', addr: '***' });
msg.setRecipient(data.email);
msg.setSubject('An email generated in a worker');
msg.addMessage({
contentType: 'text/plain',
data: `Congratulations, you just sent an email from a worker.`,
});

var message = new EmailMessage('***', data.email, msg.asRaw());
try {
await env.SEND_EMAIL.send(message);
} catch (e: any) {
return new Response(e.message);
}
}
}

Did you find this page helpful?