Firebase Authentication отправляет пользователям письма для подтверждения адреса, сброса пароля, смены email и уведомления о новом втором факторе. По умолчанию они приходят с адреса на firebaseapp.com и отправляются серверами Google. Свой SMTP переводит их на ваш домен с подписью DKIM — письма перестают попадать в спам и выглядят как ваши, а не как чужие.
| Параметр | Значение |
|---|---|
| SMTP-хост | smtp.fmailer.ru |
| Порт | 587 |
| Шифрование | STARTTLS (соединение переводится в TLS до авторизации) |
| Логин | Логин токена вашего домена |
| Пароль | Пароль этого токена — показывается один раз, при создании |
В консоли Firebase откройте Authentication → Templates, выберите SMTP settings, включите его и заполните поля:
| Поле | Значение |
|---|---|
| Sender address | noreply@mail.example.ru — на подтверждённом домене |
| SMTP server host | smtp.fmailer.ru |
| SMTP server port | 587 |
| SMTP account username | Логин токена вашего домена |
| SMTP account password | Пароль этого токена |
| SMTP security mode | STARTTLS |
587, SSL — с портом 465. Другая комбинация обрывает соединение ещё до проверки логина. На той же вкладке Templates откройте каждый тип письма значком карандаша. У всех можно задать имя отправителя, адрес для ответа и тему, а у сброса пароля — ещё и текст. Подстановки %LINK%, %EMAIL%, %NEW_EMAIL%, %APP_NAME% и %DISPLAY_NAME% заполняются для каждого письма.
%APP_NAME% — это публичное название проекта из его настроек. Укажите имя, под которым вас знают пользователи: письмо подтверждения от «project-1234» выглядит как фишинг.
То же самое через административный Identity Toolkit API — для скриптов и повторяемой настройки:
PROJECT_ID=your-project-id
curl -X PATCH \
"https://identitytoolkit.googleapis.com/admin/v2/projects/$PROJECT_ID/config?updateMask=notification.sendEmail.method,notification.sendEmail.smtp" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "X-Goog-User-Project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"notification": {
"sendEmail": {
"method": "CUSTOM_SMTP",
"smtp": {
"senderEmail": "noreply@mail.example.ru",
"host": "smtp.fmailer.ru",
"port": 587,
"username": "token-login@mail.example.ru",
"password": "token-password",
"securityMode": "START_TLS"
}
}
}
}'Если редактора шаблонов мало — нужна своя вёрстка, язык письма под пользователя, отправка с вашего бэкенда, — пусть Admin SDK сгенерирует ссылку, а письмо вы отправите сами:
// Бэкенд на Node.js или Cloud Function: своё письмо со ссылкой Firebase
import { initializeApp } from "firebase-admin/app";
import { getAuth } from "firebase-admin/auth";
import nodemailer from "nodemailer";
initializeApp();
const transporter = nodemailer.createTransport({
host: "smtp.fmailer.ru",
port: 587,
secure: false, // STARTTLS
auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS },
});
export async function sendPasswordReset(email) {
const link = await getAuth().generatePasswordResetLink(email, {
url: "https://example.ru/login", // куда пользователь попадёт после сброса
});
await transporter.sendMail({
from: "Магазин <noreply@mail.example.ru>",
to: email,
subject: "Сброс пароля",
text: "Чтобы задать новый пароль, откройте ссылку: " + link,
html: '<p><a href="' + link + '">Задать новый пароль</a></p>',
});
} Так же работают generateEmailVerificationLink и generateSignInWithEmailLink.
Для писем приложения по событиям в Firestore есть официальное расширение Trigger Email from Firestore: оно отправляет по SMTP каждый документ, добавленный в коллекцию. Пароль не пишите в URI подключения — для него есть отдельное поле. Логин токена — это адрес, поэтому @ в нём записывается как %40:
# Расширение Trigger Email from Firestore
SMTP connection URI: smtp://token-login%40mail.example.ru@smtp.fmailer.ru:587
SMTP password: token-password
Default FROM address: Магазин <noreply@mail.example.ru>Запросите сброс пароля для тестового аккаунта из приложения или из списка пользователей в Authentication → Users. Проверьте в полученном письме адрес отправителя и заголовки: там должен быть ваш домен и успешная проверка DKIM.
| Симптом | Причина и решение |
|---|---|
Письма по-прежнему с firebaseapp.com | SMTP settings не включены или не сохранены. |
| После включения SMTP письма перестали приходить | Неверный логин или пароль токена либо режим шифрования не совпадает с портом. |
| Текст письма подтверждения не редактируется | Firebase разрешает это только для сброса пароля. Отправляйте своё письмо со ссылкой из Admin SDK. |
| Cloud Function не может подключиться | Порт 25 в Google Cloud закрыт. Используйте 587 или 465. |
| Письма в спаме | Sender address не на подтверждённом домене. |
Да. В консоли Firebase на вкладке Authentication → Templates есть раздел SMTP settings: включите его и укажите адрес отправителя, сервер, порт, логин, пароль и режим шифрования. После этого письма Firebase уходят через ваш сервер, а не через стандартного отправителя Google.
Служебные письма с вкладки Templates: подтверждение адреса, сброс пароля, смена email и уведомление о добавлении второго фактора. SMS это не касается, как и писем, которые отправляет ваш собственный код.
STARTTLS с портом 587 или SSL с портом 465. Несовпадающая пара обрывает соединение ещё до авторизации.
Только частично. Для всех шаблонов Firebase даёт менять имя отправителя, адрес для ответа и тему, а текст письма — только у сброса пароля: так Google защищает шаблоны от использования для спама. Нужен полный контроль — сгенерируйте ссылку через Admin SDK и отправьте своё письмо, как в примере выше.
Свой SMTP меняет отправителя, а не адрес ссылок: они ведут на стандартный обработчик действий Firebase. Чтобы использовать свою страницу, задайте в редакторе шаблона собственный action URL и обрабатывайте коды действий на ней.
Да, через порт 587 или 465 — исходящий порт 25 в Google Cloud заблокирован. Можно и вовсе обойтись без SMTP: Cloud Function вызывает наш API по HTTPS.