Вопрос или проблема
Я пытаюсь написать автоответчик по электронной почте. Электронное письмо отправляется нормально, имеет тему и правильные адреса отправителя/получателя. Однако текст сообщения всегда пуст. Вот мой код (данные скрыты):
import { EmailMessage } from "cloudflare:email";
import { createMimeMessage } from "mimetext";
export default {
async email(message, env, ctx) {
const msg = createMimeMessage();
msg.setHeader("In-Reply-To", message.headers.get("Message-ID"));
msg.setSender({ name: "Я", addr: "[email protected]" });
msg.setRecipient(message.from);
msg.setSubject("Автоответ");
msg.addMessage({
contentType: 'text/html',
data: "Это <b>автоответ</b>"
});
const replyMessage = new EmailMessage(
"[email protected]",
message.from,
msg.asRaw()
);
await message.reply(replyMessage);
}
}
Я также пробовал установить сообщение напрямую:
replyMessage.message = {contentType : "text/html", data:"Это <b>автоответ</b>"};
Использование
contentType = "text/plain"
тоже не сработало.
Ответ или решение
Решение проблемы с пустым телом сообщения в Cloudflare Email Worker
Ваша задача — разработка автоматического ответа по электронной почте с использованием Cloudflare Email Worker. Из предоставленного вами кода видно, что сообщение отправляется корректно: указаны адреса отправителя и получателя, а также задана тема. Однако основная проблема заключается в том, что тело сообщения всегда остается пустым.
Анализ существующего кода
Рассмотрим основные части вашего кода:
-
Импортирование необходимых модулей:
import { EmailMessage } from "cloudflare:email"; import { createMimeMessage } from "mimetext";
Вы используете интеграции Cloudflare для работы с сообщениями электронной почты и создание MIME-сообщений. Это правильный шаг.
-
Создание MIME-сообщения:
const msg = createMimeMessage(); msg.setHeader("In-Reply-To", message.headers.get("Message-ID")); msg.setSender({ name: "Me", addr: "<email>" }); msg.setRecipient(message.from); msg.setSubject("Auto-reply"); msg.addMessage({ contentType: 'text/html', data: "This is an <b>auto-reply</b>" });
На этом этапе вы создаете MIME-сообщение и пытаетесь добавить текст. Однако, необходимо удостовериться, что данные в
data
не экранируются ненужным образом. -
Создание и отправка ответа:
const replyMessage = new EmailMessage( "<email>", message.from, msg.asRaw() ); await message.reply(replyMessage);
Здесь вы формируете новое сообщение ответа, используя
msg.asRaw()
, что, вероятно, приводит к тому, что ваше тело сообщения не передается должным образом.
Возможные причины и решения
-
Проблема с форматом данных: Ваша попытка использования HTML-кода для передачи данных в сообщении может быть причиной проблемы. Попробуйте передать данные без экранирования:
msg.addMessage({ contentType: 'text/html', data: "This is an <b>auto-reply</b>" // Измените здесь });
-
Использование
contentType
: Убедитесь, что вы правильно устанавливаетеcontentType
. Если текущее значение не работает (например,text/html
), попробуйте использоватьtext/plain
как альтернативу. -
Использование
replyMessage.message
: Если предыдущие шаги не помогли, попробуйте изменить способ настройкиreplyMessage
:replyMessage.message = { contentType: 'text/html', data: "This is an <b>auto-reply</b>" };
-
Проверка структуры MIME: Возможно, стоит убедиться, что ваше MIME-сообщение корректно составлено и имеет необходимые заголовки. Вы можете использовать метод
msg.asRaw()
для отладки и проверки структуры получаемого сообщения.
Заключение
Ваш код в целом выглядит правильно, однако следует обратить внимание на форматирование текста в сообщении, а также порядок операционных действий. Попробуйте предложенные изменения и проследите за тем, чтобы тело сообщения формировалось корректно без лишнего экранирования. Если после выполненных изменений проблема не решится, возможно, стоит обратиться в поддержку Cloudflare или изучить документацию по работе с их Email Worker более детально.