Как прикрепить несколько файлов к письму php

Обновлено: 04.07.2024

Отправка файла по e-mail на PHP

В этой статье я собираюсь осветить тему отправки файлов по e-mail на PHP. Задача эта весьма популярная, а вот многие не знают, как это делается и научились только отправлять обычные письма без вложенных файлов. Этот пробел я постараюсь заполнить.

Я написал скрипт, который Вы смело можете копировать и использовать в своих скриптах. Данный код позволяет отправлять файлы по e-mail через PHP:

Скрипт достаточно хорошо прокомментирован, но я добавлю ещё один важный момент. Обратите внимание, что если идут вложенные файлы, то текст письма нужно тоже делать, как прикрепление к письму, однако, тип содержимого будет другой. Это весьма серьёзная особенность, если не сделать так, то текст письма отправлен не будет. Это очень частая ошибка, поэтому обратите на это особое внимание.

Данный PHP-скрипт для отправки файлов по e-mail сделан максимально коротким, он универсален, поэтому Вы можете его дорабатывать под свои нужды так, как пожелаете.


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 19 ):

У вас ошибочка! Написано "Данная код" Вы наверное имели ввиду "Данный код"

Михаил здравствуйте, я хочу спросить, как можно отправлять несколько файлов. Очень надо. Заранее спасибо!

Чтобы не изобретать велосипед, можете воспользоваться готовым классом наподобие PHPMailer, который это уже умеет.

Михаил! Сделайте пожалуйста форму html для представленного здесь php обработчика, чтобы его можно было использовать или адаптировать под свои нужды. Такой код без примера html использовать могут только более менее знающие програмисты, а для начинающего разобраться без наглядного примера сложновато..

Михаил, спасибо за скрипт. Давно уже мучает такой вопрос, и не только меня наверное. Почему с сайта письма попадают в спам на gmail или бывает совсем не приходят? На все остальные почтовые сервисы письма приходят нормально.

И ещё проблема. Ваш скрипт хорошо работает, но текст присылается со знаками вопросами ))) в ромбиках чёрных Что посоветуете?

Прикрепить несколько файлов
Здравствуйте есть некий компонент форм для joomla, хочу сделать возможность прикреплять несколько.


Загрузка файлов PHPMailer
Всем добрый день. Создаю форму обратной связи с загрузкой файлов через PHPMailer. Столкнулась с.

Загружать несколько файлов изображений и прикрепить к одной записи в базе
Всем привет! Кто-нибудь может подсказать скрипт или объяснить как прикрепить несколько файлов.


Отправка файлов через PhpMailer
Здравствуйте. Никак не могу понять как реализовать отправку файла через PhpMailer. Надо, чтобы в.

Evir, А что просто

Добавлено через 3 минуты
Evir, Просто у вас же уже есть форма. Зачем FormData заполнять вручную, попробуйте просто прокинуть форму в конструктор FormData. Это должно сработать.

Как прикрепить несколько файлов
На мыле при отправки письма можно припрепить несколько файлов через одну кнопку Обзор. Приэтом ниже.

Как прикрепить несколько картинок на несколько людей в списке БД
У меня есть готовая БД, Нужно сделать чтобы при выборе строки в DBGrid, выходила картинка в.

Как к одной записи прикрепить несколько других записей из другой таблицы?
Как к одной записи из AdoTable1 прикрепить несколько записей из ADOTable2 ? например просматриваю.


Напишите программу конкатенирующую (соединяющую воедино) последовательно несколько файлов. Имена файлов задаются в командной строке
Напишите программу конкатенирующую (соединяющую воедино) последовательно несколько файлов. Имена.


Открыть несколько файлов
Есть массив путей нескольких файлов.Мне нужно открыть их и вернуть массив строк с содержимым.


Несмотря на то, что PHPMailer — библиотека PHP с открытым исходным кодом — была создана в далёком 2001 году, она наряду со Swiftmailer остается одним из лучших программных средств для отправки электронных писем, по мнению большинства разработчиков. Расскажем о том, как применять PHPMailer вместо встроенной функции mail() , а также приведём несколько примеров использования этой библиотеки.

Является ли PHPMailer альтернативой встроенной функции mail() ?

Функционала mail() достаточно для выполнения большинства стандартных задач, связанных с отправкой электронных писем, но зачастую она не обеспечивает требуемую гибкость.

Если PHPMailer поддерживает ООП, то функция mail() уже не применима при объектно-ориентированном подходе в программировании. Также PHP-разработчики не любят использовать строки $headers при отправке писем с помощью функции mail() , поскольку при этом приходится экранировать многие символы. Еще один недостаток стандартной функции отправки писем PHP – «грязный» код (экранирование, кодирование, форматирование) скрипта отправки вложений и писем на HTML. PHPMailer полностью лишён перечисленных недостатков.

Для работы mail() требуется сконфигурированный локальный сервер, в то время как PHPMailer поддерживает протокол SMTP, который могут использовать аутентифицированные пользователи.

Рассмотрим ещё несколько преимуществ использования PHPMailer:

К слову, PHPMailer используют многие CMS, созданные на языке PHP: например, WordPress, Joomla! и Drupal.

Установка библиотеки PHPMailer

Для установки PHPMailer можно использовать менеджер пакетов (композер), выполнив следующую команду:

composer require phpmailer/phpmailer

Отправка электронных писем с локального сервера с помощью PHPMailer

Ниже представлен простой код для отправки электронного письма с локального сервера через библиотеку PHPMailer:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//PHPMailer Object`` $mail = new PHPMailer(true); //Argument true in constructor enables exceptions`

//From email address and name
$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

//To address and name
$mail->addAddress("recepient1@example.com", "Recepient Name");
$mail->addAddress("recepient1@example.com"); //Recipient name is optional

//Address to which recipient will reply
$mail->addReplyTo("reply@yourdomain.com", "Reply");

//CC and BCC
$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");

//Send HTML or Plain Text email
$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try <
⠀⠀⠀⠀ $mail->send();
⠀⠀⠀⠀ echo "Message has been sent successfully";
> catch (Exception $e) <
⠀⠀⠀⠀ echo "Mailer Error: " . $mail->ErrorInfo;
>

Представленный код с комментариями наглядно демонстрирует все действия, которые нужно выполнить для отправки письма.

Отправка письма с вложениями

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer;

$mail->From = "from@yourdomain.com";
$mail->FromName = "Full Name";

$mail->addAddress("recipient1@example.com", "Recipient Name");

//Provide file path and name of the attachments
$mail->addAttachment("file.txt", "File.txt");
$mail->addAttachment("images/profile.jpg"); //Filename is optional

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try <
⠀⠀⠀⠀ $mail->send();
⠀⠀⠀⠀ echo "Message has been sent successfully";
> catch (Exception $e) <
⠀⠀⠀⠀ echo "Mailer Error: " . $mail->ErrorInfo;
>

К письму были прикреплены два файла: file.txt , расположенный в папке со скриптом, и images/profile.jpg , который находится в папке images .

Чтобы прикрепить файлы к письму, необходимо вызвать метод addAttachment объекта PHPMailer, который в качестве аргумента принимает строку с адресом файла. Для прикрепления нескольких файлов нужно вызвать этот метод соответствующее число раз.

Устранение проблем в коде

Для отладки кода был использован класс Exception библиотеки PHPMailer, который способен отследить все возможные ошибки. В конструктор объекта PHPMailer был передан аргумент true , который указывает на необходимость отображения полной информации об исключениях.

В зависимости от типа системы, наиболее распространенной ошибкой при использовании встроенной функции mail() в фоновом режиме является следующая:

Mailer Error: Could not instantiate mail function.

Если нужно получить больше сведений о возникшей ошибке, можно добавить следующий код в блок catch<> :

Как правило, ошибки использования функции mail() связаны с тем, что почтовый сервер не был сконфигурирован. В этом случае функция error_get_last вернёт следующее:

Array (
⠀⠀⠀⠀ [type] => 2
⠀⠀⠀⠀ [message] => mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
⠀⠀⠀⠀ [file] => OUR_PATH \vendor\phpmailer\phpmailer\src\PHPMailer.php
⠀⠀⠀⠀ [line] => 863
`)

Чтобы избежать этой весьма распространённой проблемы, рекомендуется использовать протокол SMTP.

В папку language также можно добавить любой другой язык из 43 доступных.

Использование протокола SMTP

Для отправки электронных писем можно использовать почтовый сервер другого хоста, но сперва необходимо пройти аутентификацию. То есть для отправки писем через почтовый сервер Gmail необходимо иметь учётную запись в этом сервисе.

SMTP – протокол запроса на отправку электронного письма, используемый почтовыми клиентами. После того, как почтовый сервер проверит электронное письмо, он отправит его на указанный почтовый сервер.

Ниже приведен пример отправки письма через почтовый сервер Gmail с клиентского домена. Поскольку мы используем SMTP-протокол, локальный почтовый сервер не требуется:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);

//Enable SMTP debugging.
$mail->SMTPDebug = 3;
//Set PHPMailer to use SMTP.
$mail->isSMTP();
//Set SMTP host name
$mail->Host = "smtp.gmail.com";
//Set this to true if SMTP host requires authentication to send email
$mail->SMTPAuth = true;
//Provide username and password
$mail->Username = "name@gmail.com";
$mail->Password = "super_secret_password";
//If SMTP requires TLS encryption then set it
$mail->SMTPSecure = "tls";
//Set TCP port to connect to
$mail->Port = 587;

$mail->From = "name@gmail.com";
$mail->FromName = "Full Name";

$mail->addAddress("name@example.com", "Recepient Name");

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try <
⠀⠀⠀⠀ $mail->send();
⠀⠀⠀⠀ echo "Message has been sent successfully";
> catch (Exception $e) <
⠀⠀⠀⠀ echo "Mailer Error: " . $mail->ErrorInfo;
>

Сервер Gmail использует TSL-шифрование поверх SMTP, поэтому в коде было установлено соответствующее значение для свойства объекта PHPMailer. Перед отправкой по протоколу SMTP необходимо указать имя хоста, номер порта, тип шифрования и пройти аутентификацию, а также предоставить имя пользователя и пароль. Если в Gmail была включена функция двухфакторной аутентификации, доступ к SMTP через имя пользователя и пароль будет закрыт. Для получения доступа необходимо внести дополнительные настройки.

Извлечение писем через протокол POP3

Библиотека PHPMailer поддерживает отправку писем по методу аутентификации POP перед SMTP. Иначе говоря, вы сможете пройти аутентификацию через POP и отправлять почту через SMTP. К сожалению, в PHPMailer реализована только возможность отправки электронных писем, поэтому получать почту по протоколу POP3 с использованием библиотеки не получится.

Заключение

Если вы являетесь PHP-разработчиком, вы будете часто сталкиваться с необходимостью программной отправки электронных писем. Конечно, можно использовать сторонние сервисы (Mandrill или SendGrid) или написать свою собственную библиотеку, но лучшим инструментом для решения этой задачи пока по-прежнему остаётся PHPMailer.


PHPMailer обновился и инструкция к прошлой версии не актуальна, хотя вы также можете использовать прикреплённые файлы в той инструкции. Работать будет.


О чем эта инструкция.

Это инструкция по добавлению на ваш сайт PHPMailer и отправки писем с прикреплёнными файлами к вам на почту без перезагрузки страницы.

Здесь будет инструкция для более простой базовой версии формы, без анимации и валидаций на чистом JavaScript. Навороченную версию формы (та, что на картинке) вы можете скачать по ссылке в конце статьи.

1. Скачиваем PHPMailer


В начале кликаем по “Clone or Download”, затем по “Download ZIP”

Во всём архиве нам нужны только 3 файла:

Всё остальн о е, что хранится на Github — на*уй не нужно, можете удалять.

2. Удаляем из файлов весь хлам

Этот пункт вы можете пропустить. Он не является обязательным

Файлы, написанные разработчиками PHPMailer, содержат немереное количество мусора, состоящего из одних комментариев (зачем?!). Вес этих трёх файлов вместе с комментариями равен 196кб, после удаления комментов вес составит 72кб. Почти в 3 раза…

  1. Открываете файл PHPMailer.php
  2. Копируете содержимое файла
  3. Вставляете в форму на сайте php-minify и жмёте “COMPRESS”
  4. Результат пересохраняете в новом файле с тем же названием

Процедуру повторяете со всеми тремя файлами.

Для наглядности файл Exception.php


Слева файл до сжатия, справа он же после удаления мусора

3. Перемещаем файлы в проект

И теперь помещаем эти 3 файла в наш проект. Я создал специально для этих файлов папку под названием phpmailer


4. Создаём файл конфигурации

Создадим файл send.php с таким содержанием

Здесь вам нужно отредактировать эти поля под себя:

Нужно использовать не пароль от самой почты, а “Пароль приложения”. В настройках вашей почты, будь то Gmail, Yandex или Mailru— есть раздел “Пароли приложений”, где вы можете специально создать отдельный сгенерированный пароль для PHPMailer.

Сохраняем этот файл send.php и помещаем его в корень сайта

5. Создаём HTML форму

Теперь поместим эту форму в нужное место на вашем сайте

Обратите внимание на onsubmit. Там вторым аргументом должно быть указано имя файла, то есть send.php.

6. Прописываем JavaScript

Нужно теперь просто где-то в коде разместить эту функцию. Вы можете её скопировать в свой script файл, который уже подключён в <head>, либо вставить его после закрывающего тега </body>.

7. Всё (почти)

Форма у вас должна выглядеть вот так:


8. Почему ошибка?

Это очень частый вопрос, где я с полной уверенностью могу сказать: 60% причин ошибок — это ваш хостинг, 30% — ваша почта, 9% — вы неверно указали данные от почты, а 1% причин —ты, сука, даун, который решил изменить код, а потом начинаешь искренне удивляться, почему ничерта не работает.

Чтобы узнать, в чём причина, нужно раскомментировать вот эту строчку кода (убрать //):


Причина: Error: authentication failed: Invalid user or password! , то есть неверно указаны данные почты.

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

Через некоторое время они ответят и письма начнут нормально уходить.

После того, настоятельно рекомендую снова закомментировать строчку c $mail->SMTPDebug = 2

У этой формы есть минус: нет защиты от спама. Каптчу вам нужно отдельно подключать

Читайте также: