← Cloudflare Email Service / email-service / examples / email-sending
Отправка писем через SMTP
Отправка транзакционных писем через Cloudflare Email Service аутентифицированный SMTP (smtp.mx.cloudflare.net:465) из любого языка или клиента с поддержкой SMTP.
Предварительные требования
- Домен, подключённый для Email Sending.
- A API-токен Cloudflare на Email Sending: Edit разрешение. Укажите его как
CF_API_TOKENв вашем окружении. Токен используется как пароль SMTP, а именем пользователя служит буквальная строкаapi_token.
Отправка письма
cat > mail.txt <<EOF
From: [email protected]
To: [email protected]
Subject: Welcome to our service!
Thanks for signing up.
EOF
curl --ssl-reqd \
--url "smtps://smtp.mx.cloudflare.net:465" \
--user "api_token:$CF_API_TOKEN" \
--mail-from "[email protected]" \
--mail-rcpt "[email protected]" \
--upload-file mail.txtДомен отправителя должен быть подключён для Email Sending в аккаунте, которому принадлежит API-токен.
Установка Nodemailer ↗ с npm install nodemailer.
Отправка письма
import nodemailer from "nodemailer";
const transporter = nodemailer.createTransport({
host: "smtp.mx.cloudflare.net",
port: 465,
secure: true, // implicit TLS
auth: {
user: "api_token",
pass: process.env.CF_API_TOKEN,
},
});
const info = await transporter.sendMail({
from: '"Acme" <[email protected]>',
to: "[email protected]",
subject: "Welcome to Acme",
text: "Thanks for signing up.",
html: "<h1>Welcome to Acme</h1><p>Thanks for signing up.</p>",
});
console.log("Message sent:", info.messageId);Отправка с вложением
const info = await transporter.sendMail({
from: '"Acme Billing" <[email protected]>',
to: "[email protected]",
subject: "Your invoice",
text: "Please find your invoice attached.",
attachments: [
{
filename: "invoice-2026-04.pdf",
path: "./invoices/invoice-2026-04.pdf",
contentType: "application/pdf",
},
],
});Общий размер сообщения (включая вложения в кодировке base64) не должен превышать 5 МиБ. См. Лимиты.
Обработка ошибок
Nodemailer отклоняет promise с Error чьи .responseCode отражает код ответа SMTP. См. Коды ответов SMTP и Устранение неполадок.
try {
await transporter.sendMail({
/* ... */
});
} catch (err) {
console.error(err.responseCode, err.message);
}Использует стандартную библиотеку smtplib ↗ (Python 3.8 или новее).
Отправка письма
import os
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg["From"] = "Acme <[email protected]>"
msg["To"] = "[email protected]"
msg["Subject"] = "Welcome to Acme"
msg.set_content("Thanks for signing up.")
msg.add_alternative(
"<h1>Welcome to Acme</h1><p>Thanks for signing up.</p>",
subtype="html",
)
with smtplib.SMTP_SSL("smtp.mx.cloudflare.net", 465) as s:
s.login("api_token", os.environ["CF_API_TOKEN"])
s.send_message(msg)smtplib.SMTP_SSL устанавливает соединение implicit TLS на порту 465, именно это требуется для конечной точки SMTP Cloudflare. Не используйте smtplib.SMTP с starttls(); STARTTLS не поддерживается.
Отправка нескольким получателям
msg["To"] = ", ".join([
"[email protected]",
"[email protected]",
"[email protected]",
])Одна сессия SMTP может доставить письмо не более чем 50 RCPT TO адреса. См. Лимиты.
Отправка с вложением
from pathlib import Path
pdf = Path("invoice-2026-04.pdf").read_bytes()
msg.add_attachment(
pdf,
maintype="application",
subtype="pdf",
filename="invoice-2026-04.pdf",
)Обработка ошибок
smtplib выбрасывает подклассы smtplib.SMTPException с приложенным кодом ответа SMTP. См. Коды ответов SMTP и Устранение неполадок.
try:
with smtplib.SMTP_SSL("smtp.mx.cloudflare.net", 465) as s:
s.login("api_token", os.environ["CF_API_TOKEN"])
s.send_message(msg)
except smtplib.SMTPAuthenticationError as e:
print(f"Auth failed: {e.smtp_code} {e.smtp_error!r}")
except smtplib.SMTPResponseException as e:
print(f"SMTP error: {e.smtp_code} {e.smtp_error!r}")Отправка письма
<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.mx.cloudflare.net';
$mail->Port = 465;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$mail->SMTPAuth = true;
$mail->Username = 'api_token';
$mail->Password = getenv('CF_API_TOKEN');
$mail->setFrom('[email protected]', 'Acme');
$mail->addAddress('[email protected]');
$mail->Subject = 'Welcome to our service!';
$mail->Body = 'Thanks for signing up.';
$mail->send();Следующие шаги
- Справочник по SMTP : сведения о подключении, аутентификации, коды ответов и устранение неполадок.
- Указание получателей : несколько получателей, CC и BCC, именованные адреса.
- Лимиты : лимиты для аккаунта, сообщений и сессий.