Документация / Firebase

Свой SMTP в Firebase Authentication

Firebase Authentication отправляет пользователям письма для подтверждения адреса, сброса пароля, смены email и уведомления о новом втором факторе. По умолчанию они приходят с адреса на firebaseapp.com и отправляются серверами Google. Свой SMTP переводит их на ваш домен с подписью DKIM — письма перестают попадать в спам и выглядят как ваши, а не как чужие.

ℹ
Логин и пароль можно получить на странице токенов домена.

Параметры подключения

ПараметрЗначение
SMTP-хостsmtp.fmailer.ru
Порт587
ШифрованиеSTARTTLS (соединение переводится в TLS до авторизации)
ЛогинЛогин токена вашего домена
ПарольПароль этого токена — показывается один раз, при создании
ℹ
Каждый режим доступен и на высоком порту: 8465 (SSL/TLS), 8587 (STARTTLS) и 8025 (без шифрования). Многие хостинги и облака блокируют исходящие 25, 465 и 587 — если соединение обрывается по таймауту, используйте соответствующий высокий порт.

Шаг 1 — включите SMTP settings

В консоли Firebase откройте Authentication → Templates, выберите SMTP settings, включите его и заполните поля:

ПолеЗначение
Sender addressnoreply@mail.example.ru — на подтверждённом домене
SMTP server hostsmtp.fmailer.ru
SMTP server port587
SMTP account usernameЛогин токена вашего домена
SMTP account passwordПароль этого токена
SMTP security modeSTARTTLS
⚠
STARTTLS — с портом 587, SSL — с портом 465. Другая комбинация обрывает соединение ещё до проверки логина.

Шаг 2 — проверьте шаблоны

На той же вкладке Templates откройте каждый тип письма значком карандаша. У всех можно задать имя отправителя, адрес для ответа и тему, а у сброса пароля — ещё и текст. Подстановки %LINK%, %EMAIL%, %NEW_EMAIL%, %APP_NAME% и %DISPLAY_NAME% заполняются для каждого письма.

%APP_NAME% — это публичное название проекта из его настроек. Укажите имя, под которым вас знают пользователи: письмо подтверждения от «project-1234» выглядит как фишинг.

Настройка через API

То же самое через административный Identity Toolkit API — для скриптов и повторяемой настройки:

Identity Toolkit admin APIbash
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 сгенерирует ссылку, а письмо вы отправите сами:

sendPasswordReset.jsjavascript
// Бэкенд на 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.comSMTP settings не включены или не сохранены.
После включения SMTP письма перестали приходить Неверный логин или пароль токена либо режим шифрования не совпадает с портом.
Текст письма подтверждения не редактируется Firebase разрешает это только для сброса пароля. Отправляйте своё письмо со ссылкой из Admin SDK.
Cloud Function не может подключиться Порт 25 в Google Cloud закрыт. Используйте 587 или 465.
Письма в спамеSender address не на подтверждённом домене.

Частые вопросы

Можно ли подключить свой SMTP к Firebase Authentication?

Да. В консоли Firebase на вкладке Authentication → Templates есть раздел SMTP settings: включите его и укажите адрес отправителя, сервер, порт, логин, пароль и режим шифрования. После этого письма Firebase уходят через ваш сервер, а не через стандартного отправителя Google.

Какие письма Firebase идут через свой SMTP?

Служебные письма с вкладки Templates: подтверждение адреса, сброс пароля, смена email и уведомление о добавлении второго фактора. SMS это не касается, как и писем, которые отправляет ваш собственный код.

Какой режим шифрования выбрать — STARTTLS или SSL?

STARTTLS с портом 587 или SSL с портом 465. Несовпадающая пара обрывает соединение ещё до авторизации.

Можно ли изменить текст письма подтверждения адреса?

Только частично. Для всех шаблонов Firebase даёт менять имя отправителя, адрес для ответа и тему, а текст письма — только у сброса пароля: так Google защищает шаблоны от использования для спама. Нужен полный контроль — сгенерируйте ссылку через Admin SDK и отправьте своё письмо, как в примере выше.

Почему ссылки в письмах Firebase всё равно ведут на firebaseapp.com?

Свой SMTP меняет отправителя, а не адрес ссылок: они ведут на стандартный обработчик действий Firebase. Чтобы использовать свою страницу, задайте в редакторе шаблона собственный action URL и обрабатывайте коды действий на ней.

Можно ли отправлять письма по SMTP из Cloud Functions?

Да, через порт 587 или 465 — исходящий порт 25 в Google Cloud заблокирован. Можно и вовсе обойтись без SMTP: Cloud Function вызывает наш API по HTTPS.

Что дальше