Addattachment phpmailer не работает

Отправка писем с помощью PHPMailer

PHPMailer — очень удобная и популярная библиотека для отправки e-mail сообщений с вашего сайта. В этой статье рассказаны основные настройки библиотеки и приведены примеры кода для отправки сообщений. PHPMailer имеет в своем ассортименте пожалуй всё, что можно пожелать от работы с почтой: отправка разными способами, через разные серверы в т.ч. через smtp, возможность шифровать и подписывать ваши письма, чтобы не попадали в спам и многое другое.

Скачать библиотеку PHPMailer можно с https://github.com/PHPMailer/PHPMailer (кнопка «Code» -> «Download ZIP»).

Для начала разберу пару простых примеров, чтобы было понятно, как отправлять письма с помощью PHPMailer.

Отправка писем через функцию mail() с помощью PHPMailer

Если вы хотите отправлять письма со своего хостинга через свой почтовый сервер, то всё довольно просто и будет выглядеть примерно так:

Как видим, всё довольно просто: подключаем библиотеку, заполняем от кого, кому, тему и текст письма и отправляем. Отправка писем таким способом будет работать только с почтовых адресов вашего домена (если только они не привязаны к другим почтовикам).

Отправка писем через SMTP с помощью PHPMailer на примере Yandex и Google

Можно так же отправить письмо через другой почтовик, например, через Яндекс. Код будет выглядеть примерно так:

Отправка писем через Google имеет один нюанс: нужно в аккаунте google разрешить доступ ненадежным приложениям. Для этого нужно зайти в свой аккаунт https://myaccount.google.com, перейти в безопасность, зайти в раздел «Ненадежные приложения, у которых есть доступ к аккаунту» и там переключить в «Разрешено». На момент написания статьи это страница https://myaccount.google.com/u/0/lesssecureapps.

Дальше в php-программе отправка писем через PHPMailer происходит аналогично как через yandex, нужно только заменить настройки SMTP так:

Если первый раз запускаете программу отправки через smtp, тогда желательно перед отправкой дополнительно использовать $mail->SMTPDebug = 1; чтобы получать все сообщения клиента и smtp-сервера, т.е. на экран выведется весь процесс подключения, авторизации и т.д., что очень полезно для отладки вашей программы.

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

Здесь всё довольно просто, нужно лишь использовать метод addAttachment. Приведу пример, заодно продемонстрировав еще несколько дополнительных возможностей:

Адресов получателей можно добавить несколько с помощью addAddress. Или, если необходимо, можно наоборот, очистить все адреса получателей методом clearAddresses(). Очистить все вложения можно с помощью clearAttachments().

Так же можно использовать AddEmbeddedImage чтобы добавить в письмо вложение (обычно изображения), которое предназначено для использования в html-коде и не будет доступно для скачивания. Пример использования картинки в письме, не доступной для скачивания:

Читайте также:  Настроить майл ру телефоне

Таким образом, вы можете отправлять письма с изображениями, которые есть только в теле письма, но их нельзя скачать как вложение. Эти изображения можно использовать в любом месте html-кода письма, нужно лишь указывать вместо url-адреса cid изображения, который вы использовали в AddEmbeddedImage.

Отправка подписанного и зашифрованного письма через PHPMailer

По-умолчанию, PHPMailer шифрует все отправляемые письма. Отключить шифрование письма можно только при отправке писем через SMTP использовав код:

Чтобы подписать письмо подписью DKIM, необходимо выполнить несколько действий:

  • Сгенерировать приватный (private) и публичный (public) ключи для вашего домена
  • Добавить DNS-запись для домена типа TXT с публичным ключом
  • Настроить DKIM подпись в PHPMailer перед отправкой письма

Теперь опишу каждый шаг немного подробнее.

Генерация приватного и публичного ключей

Если у вас Linux-хостинг и есть доступ в Shell, то сгенерировать файлы ключей проще простого, нужно выполнить всего 2 команды с обычными правами своего пользователя:

Соответственно, test-private.pem и test-public.pem — это приватный и публичный ключи. Сохранить их нужно в папке, которая будет не доступна посетителям сайта или кому-то еще кроме вас.

Если нет возможности выполнить команды в shell, тогда чтобы сгенерировать приватный (private) и публичный (public) ключи и сохранить их в файлы, можно воспользоваться следующим кодом:

Внимание! Не забудьте убедиться, что папка, в которую будут сохраняться файлы, доступна для записи.

Добавление DNS-записи с публичным ключом

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

Нужно добавить DNS-запись следующего вида:

Имя записи: mail._domainkey.test.ru. (в конце точка «.»)

TTL: 3600 (или какое будет по-умолчанию)

Тип записи: TXT

Значение: v=DKIM1; h=sha256; t=s; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ

В имени записи test.ru нужно заменить на имя вашего домена. Слова «ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ» вы заменяете на текст, который вы получили на предыдущем шаге после «Public key», без «——BEGIN PUBLIC KEY——» и «——END PUBLIC KEY——«, только сам ключ. При этом все строчки ключа нужно соединить в одну длинную строку, чтобы переводов строки не было.

Настройка подписи DKIM в PHPMailer и отправка письма

Теперь осталось лишь сделать несколько настроек PHPMailer перед отправкой письма и оно будет подписано. Думаю, на приведенном примере будет всё понятно:

Разумеется, test.ru вы должны поменять на имя своего домена, а test-private.pem на полный путь и имя файла приватного ключа, который был создан на этапе генерации ключей.

Теперь, ваши письма, отправляемые через PHPMailer будут подписаны подписью DKIM вашим приватным ключом.

Источник

PHPMailer AddAttachment не работает

Итак, у меня есть следующее … Письма отправляются без вложения, и я не могу найти причину. Любая помощь будет высоко оценена 🙂

Решение

Первое, что я хотел бы сделать, это проверить возвращаемое значение addAttachment() , В соответствии с документация :

Msgstr «Возвращает false, если файл не может быть найден или прочитан.»

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

Кроме того, это не должно иметь значения, но обычно рекомендуется вызывать функции с тем же регистром, что и в их объявлении. В двух случаях объявление класса отличается от того, как вы его написали (начинается в нижнем регистре):

Читайте также:  Не работает dvd пишет нет диска

Другие решения

Это то, что я написал для себя и прекрасно работает с любыми вложениями.

Параметры сообщения:

Если Вы можете заменить параметры публикации обычными переменными PHP, если хотите, или можете просто опубликовать эти параметры с помощью вызова POST

Ниже приведен код для моего почтового файла

Вы можете создать содержание сообщения в формате HTML. Средства Вы можете добавить изображение к содержанию сообщения, цветовую кодировку вашего содержимого и все другие вещи, которые вы можете делать с HTML.
Ниже приведен пример тела сообщения:

Источник

addAttachment not working with .pdf, .docx and many other extensions #671

Comments

rishijash commented Mar 28, 2016

I am using addAttachment function in my application to upload and send attachments but looks like I am not able to send many types of attachments.

This is what I am using:
$mail->addAttachment($uploadfile, ‘My uploaded file’);

The text was updated successfully, but these errors were encountered:

Synchro commented Mar 28, 2016

I can’t help without seeing your code. Did you base your code on the send uploaded file example provided with PHPMailer?

rishijash commented Mar 28, 2016

Yes it is based on exact same code.
I am able to send regular email without attachments and some attachments like .jpeg files.
But seems like it is not working with .pdfs, .docx and many other.

This is what my code looks like:

Synchro commented Mar 28, 2016

I don’t know where you got that code, but it’s based on an obsolete example, not the code I pointed you at.

Are you certain that it’s not sending attachments, or could it be that it’s being filtered at the receiving end? You can easily check by bcc’ing an account on a different system and comparing what is received.

PHPMailer makes no distinction between file types, all are handled the same way.

rishijash commented Mar 29, 2016

Checked it twice.
Somehow I am not able to send few files from my desktop.

I have deployed same code on Hoodoomail.com
but not able to send this file(Google Drive Link).

May be files are corrupted or something.

Synchro commented Mar 29, 2016

I can send and receive that file with no problem using PHPMailer. Looking at the structure of the message, all appears correct. PHPMailer can get quite memory intensive on large attachments, so check you’re not running out of allocated memory.

Synchro commented Mar 29, 2016

If you set SMTPDebug = 2 you will see the entire MIME structure as it is sent. If that does not match exactly what you receive, then there is filtering breaking your stuff.

rishijash commented Mar 29, 2016

Thanks for the help. 🙂

rishijash commented May 16, 2016

If any one is facing such issue first make sure if move_uploaded_file is working or not.

Synchro commented May 16, 2016 •

Um, that code doesn’t make much sense. The file upload example code does it correctly — the only worthwhile thing it adds is the error message output.

Источник

Использую PHPMailer. Почему ( $mail->addAttachment ) прикрепляет 2 одинаковых файла вместо разных??

Прикрепляю в письме, допустим 3 разных файла. а приходят 2 одинаковых! Видимо 3-й файл «затирает» первые 2. Но почему тогда он приходит только в 2-х копиях, а не трёх?
Как советуют многие, если написать стандартно, если используешь PHPMailer — не спасает!

Читайте также:  San andreas не работаешь мышь

— абсолютно не помогает! Это тоже совсем не то, т.к. приходит только тело (текст), письма, без прикреплённых файлов! Приходит только сообщение в письме, без каких-либо прикреплённых файлов. Помогите пожалуйста разобраться! Как прикреплять несколько файлов с разным (со всеми) расширениями, например: JPG, JPEG, PNG, GIF, txt, WEBP, docx, BMP, video.

Вот нужные строки из HTML-формы:

Обработчик HTML-формы, submit.php

‘; > $mail->clearAddresses(); // очищаем список адресатов $mail->clearAttachments(); // очищаем файлы вложений

И последнее, это Ajax — adaptive.js

  • Вопрос задан 13 дек. 2020
  • 203 просмотра

Во-первых, вы повторно добавляете файлы при отправке формы. Этот код:

вообще не нужен, файлы уже есть в data.

Во-вторых, покажите нормальный код на PHP, и что именно он присылает. Ваш код не может работать из-за этого:

(видимо, какие-то артефакты предыдущих попыток).

Без этого, код в целом выглядит рабочим. Выведите в лог (или прямо в браузер) массив $_FILES или $mail->getAttachments(), и посмотрите, все ли правильно аттачится.

Что сделал:
1) Убрал из jQuery повторно добавляющие файлы при отправке формы, на которые вы указали выше;
2) Показываю редактируемый код PHP, который присылает в письме уже НЕ 2 копии одного и того же файла, а вообще, один, сколько бы не прикреплял изначально к письму:

3) Вывел логи в браузере массива $_FILES

4) Вывел логи в браузере $mail->getAttachments()

М-да. по ходу не правильно. Но как исправить?

Нет, конечно! Я в каждом тесте загружаю 2 или 3 разных файла, например, сейчас 3:
/ Юрий / Яндекс.диск / Скриншоты / 2020-05-14_14-26-33.png
/ Юрий / Яндекс.диск / Скриншоты / 2020-05-25_20-48-45.png
/ Юрий / Яндекс.диск / Скриншоты / 2020-05-16_13-04-14.png
— т. е. загружаю по 3 файла, а приходит только уже один в письме!

Ещё раз отрывок моего PHP-обраболтчика:

Ведь я загружаю файлы со своего Desctopa, а может нужно указывать пути на самом хостинге, к папке images

Я тогда не очень понимаю, что у вас происходит.
Посмотрите через F12 в браузере, что на сервер отсылается.
Также можете в JS в консоль вывести FormData — после этой строчки var data = new FormData(jQuery(‘form’)[0]); добавьте что-то типа
console.log(data.keys(), data.values());

Вот отправка формы, всё вроде бы Ок! Но сколько бы разных файлов не загружал через форму — приходит только теперь один.

F12 в браузере и console.log(data.keys(), data.values());

Headers
General
Response Headers

content-encoding: br
content-length: 145
content-type: text/html; charset=UTF-8
date: Mon, 14 Dec 2020 17:48:01 GMT
server: LiteSpeed
vary: Accept-Encoding,User-Agent
x-powered-by: PHP/7.2.34
x-turbo-charged-by: LiteSpeed

:authority: mysite.com
:method: POST
:path: /submit.php
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
cache-control: no-cache
content-length: 547771
content-type: multipart/form-data; boundary=—-WebKitFormBoundaryrZpywgV9GlxdBdPj
dnt: 1
origin: https://mysite.com
pragma: no-cache
referer: https://mysite.com/adaptive.php
sec-ch-ua: «Google Chrome»;v=»87″, «\»Not;A\\Brand»;v=»99″, «Chromium»;v=»87″
sec-ch-ua-mobile: ?1
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36
x-requested-with: XMLHttpRequest

user_name: Tony
user_email: distribution.trade2015@gmail.com
user_website: https://mysite2.com/
user_phone: 89580339510
max_file_size: 10000000
attachfile[]: (binary)
Text. text. text. text. text. text. text. text. text.
text. text. text. text. text

Там важно, что шлется в POST (ниже Request headers раздел Post data или что-то типа того).
Посмотрите, что все файлы отправляются.

Источник

Оцените статью