Почта по IMAP
Объект mail ходит на сервер сам: IMAP читать, SMTP писать, POP3 — старый ящик. Окно Outlook не нужно. Типичный RPA: письмо с накладной → сохранить PDF → разобрать в pdffile или Excel.
Что выбрать
- IMAP — серверная почта без клиента. Этот гайд.
- SMTP — исходящие: smtp_connect, send_mail_via_smtp, проверка check_smtp_auth.
- Outlook — локальный профиль: сценарий Outlook.
- Exchange API — msexchange, без окна Outlook.
- POP3 — те же идеи поиска/удаления, суффикс методов
*_via_pop3на хабе mail.
Не читайте прод-ящик с первого прогона. Заведите тестовый аккаунт и письмо с известной темой.
Подключение IMAP
imap_connect принимает сервер, порт, логин, пароль и режим SSL. Новое соединение закрывает предыдущее IMAP у объекта.
$ok = $mail->imap_connect("imap.example.com", 993, "user@example.com", "secret", 1);
if (!$ok) {
echo "IMAP не подключился";
}
Пятый аргумент $ssl_option: 0 без SSL/TLS, 1 авто, 2 SSL или TLS обязателен, 3 TLS+STARTTLS, 4 TLS. Для большинства хостеров 993 + опция 1 или 2. Таймаут и путь лога обмена с сервером — в той же сигнатуре ($log_path с 7.0.57): включите лог, если «тихий» отказ авторизации.
Все запросы mail через прокси: set_proxy. Глубина поиска писем: set_limit (по умолчанию 5000) — большой ящик без лимита будет ходить долго.
Отключение: imap_disconnect.
Найти письмо
- Число: get_message_count_via_imap — sanity-check, что ящик не пустой.
- По теме: get_message_by_subject_via_imap
- По отправителю: get_message_by_from_via_imap
- По тексту: get_message_by_text_via_imap
- По номеру: get_message_by_number_via_imap
- По ID: get_message_by_id_via_imap
- По имени вложения: get_message_by_attachment_name_via_imap
$mail->set_limit(500);
$count = $mail->get_message_count_via_imap("INBOX");
$msg = $mail->get_message_by_subject_via_imap("INBOX", "Накладная");
get_message_by_subject_via_imap($folder, $subject, $exactly=false, $number=0, $timeout=300) — первым аргументом папка IMAP, не тема. Возвращает объект с полями from / subject / date / body (пусто, если письма нет). Тема должна совпадать с тем, как сервер её отдал (префиксы Re:, кодировка). Если count > 0, а by_subject пусто — ищите по from или смотрите «Спам».
Вложения
Сохранить на диск:
Папку для файлов задайте заранее и не пересекайте её с download браузера второй копии Studio. Дальше PDF/xlsx разбирайте отдельным шагом, не в том же «попробуем всё сразу» без лога.
$mail->save_message_attachments_by_subject_via_imap( "C:\\bots\\mail\\", "INBOX", "Накладная", false, 0, 120 );
Без id удобнее save_message_attachments_by_subject_via_imap($path, $folder, $subject, $exactly=false, $number=0, $timeout=300) (с 7.0.56). По id: save_message_attachments_by_id_via_imap($path, $folder, $id, $timeout=300). Методы by_id / by_flag принимают $folder первым после пути — не пропускайте INBOX.
Прочитано, перенос, удаление
- Прочитано: set_message_readed_by_id_via_imap
- Категория/флаг: add_message_flag_by_id_via_imap
- В другую папку: move_message_by_id_via_imap (есть варианты by_number / subject / from / text)
- Добавить письмо в папку: add_message_via_imap
- Удалить: delete_message_by_id_via_imap / by_number; все — delete_all_messages_via_imap (только на тесте)
Помечайте прочитанным после успешного сохранения вложения. Иначе повторный прогон «не видит» письмо, а файла на диске нет.
Сценарий: письмо → PDF на диск
$ok = $mail->imap_connect("imap.example.com", 993, "bot@example.com", "secret", 1);
if (!$ok) {
echo "IMAP fail";
}
$mail->set_limit(200);
$count = $mail->get_message_count_via_imap("INBOX");
$msg = $mail->get_message_by_subject_via_imap("INBOX", "Накладная");
$mail->save_message_attachments_by_subject_via_imap(
"C:\\bots\\mail\\", "INBOX", "Накладная", false, 0, 120
);
$mail->imap_disconnect();
Прочитанным помечайте после успешного save, методом с папкой и id: set_message_readed_by_id_via_imap($folder, $id, …). Если темы плавают (Re:, Fwd:) — ищите по from или по имени вложения. Разбор PDF: сценарий PDF.
Отправка SMTP
IMAP — про ящик. Исходящие — отдельное соединение.
$mail->smtp_connect("smtp.example.com", 465, "bot@example.com", "secret", 2);
$mail->send_mail_via_smtp(
"bot@example.com",
"ops@example.com",
"Отчёт",
"<p>Готово</p>",
2,
"",
"",
array("C:\\bots\\out\\report.pdf")
);
$mail->smtp_disconnect();
smtp_connect($server, $port, $login, $password, $ssl_option=1, …) — те же SSL-опции, что у IMAP. Порт часто 465 (SSL) или 587 (STARTTLS, опция 3). send_mail_via_smtp($from, $to, $subject, $message, $type, $cc="", $bcc="", $attachments=null): $type 0 — текст, 2 — HTML; несколько адресов с 7.0.56 через ;; вложения — массив путей.
Перед боевой рассылкой: check_smtp_auth и тестовый получатель. Локальный Outlook: send_mail_via_outlook или гайд Outlook.
Не склеивайте «нашёл письмо» и «отправил клиенту» в одну непроверенную сессию. Обзор: отправка данных.
FAQ
connect вернул false. Порт (993 vs 143), SSL-опция, пароль приложения вместо обычного, IMAP выключен в ящике, корпоративный файрвол. Включите $log_path.
Пустой поиск при ненулевом count. Лимит set_limit, неверная папка, тема с кодировкой. Начните с get по номеру.
Пароль в скрипте. Не коммитьте боевые ящики. На машине робота — отдельная учётка.
Яндекс / Google «заблокировали вход». Нужен пароль приложения и включённый IMAP, не пароль от веба. Корпоративный Exchange чаще проще через msexchange или Outlook, чем голый IMAP.
Вложения не появились на диске. Неверная папка IMAP (INBOX vs «Входящие»), таймаут, письмо без attach, путь без прав. Проверьте $folder и лог $log_path у connect.
Поиск методов: imap.