Страницы

Поиск по вопросам

Показаны сообщения с ярлыком почта. Показать все сообщения
Показаны сообщения с ярлыком почта. Показать все сообщения

воскресенье, 29 декабря 2019 г.

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

#php #email #почта


Пишу скрипт отправки почты с вложением. 

$file = "act.pdf"; // файл
$mailTo = "rumyancevaa@afanasy.ru"; // кому
$from = "rumyancevaa@afanasy.ru"; // от кого
$subject = "Общественная приемная"; // тема письма
$message = "Контактный телефон обратившегося "; // текст письма
$r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма
c вложением
echo ($r)?'

Ваша заявка отправлена! Скоро мы ее рассмотрим и позвоним вам!

':'Ошибка. Письмо не отправлено!'; //$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения //echo ($r)?'Письмо отправлено':'Ошибка. Письмо не отправлено!'; function sendMailAttachment($mailTo, $from, $subject, $message, $file = false){ $separator = "---"; // разделитель в письме // Заголовки для письма $headers = "MIME-Version: 1.0\r\n"; $headers .= "From: $from\nReply-To: $from\n"; // задаем от кого письмо $headers .= "Content-Type: multipart/mixed; boundary=\"$separator\""; // в заголовке указываем разделитель // если письмо с вложением if($file){ $bodyMail = "--$separator\n"; // начало тела письма, выводим разделитель $bodyMail .= "Content-Type:text/html; charset=\"utf-8\"\n"; // кодировка письма $bodyMail .= "Content-Transfer-Encoding: 7bit\n\n"; // задаем конвертацию письма $bodyMail .= $message."\n"; // добавляем текст письма $bodyMail .= "--$separator\n"; $fileRead = fopen($file, "r"); // открываем файл $contentFile = fread($fileRead, filesize($file)); // считываем его до конца fclose($fileRead); // закрываем файл $bodyMail .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode(basename($file))."?=\n"; $bodyMail .= "Content-Transfer-Encoding: base64\n"; // кодировка файла $bodyMail .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode(basename($file))."?=\n\n"; $bodyMail .= chunk_split(base64_encode($contentFile))."\n"; // кодируем и прикрепляем файл $bodyMail .= "--".$separator ."--\n"; // письмо без вложения }else{ $bodyMail = $message; } $result = mail($mailTo, $subject, $bodyMail, $headers); // отправка письма return $result; } Каким образом можно добавить второе вложение из input type = "file" на форме?


Ответы

Ответ 1



Три простых шага для решения данной проблемы: Посмотреть на календарь и уточнить, какой сейчас век на дворе. Аккуратно выделить этот код, и нажать клавишу Del Скачать phpmailer Забыть все эти кустарные ковыряния как страшный сон. В итоге код должен получиться примерно таким: require 'PHPMailerAutoload.php'; $mail = new PHPMailer; $mail->setFrom('from@example.com', 'First Last'); $mail->addAddress('whoto@example.com', 'John Doe'); $mail->Subject = 'PHPMailer file sender'; $mail->msgHTML("My message body"); // Attach uploaded files $mail->addAttachment($filename1); $mail->addAttachment($filename2); $r = $mail->send(); следует понимать, что отправка почты - это не просто копирование в свой скрипт каких-то определенных сочетаний символов, к оторые случайно сработали в прошлом веке у автора какой-либо допотопной статьи. Это гораздо более сложный процесс, который включает множество нюансов. И поэтому отправку почты надо не лепить вручную из подручных средств на ходу, а доверить проверенному и отлаженному решению.

Ответ 2



В функцию бросайте массив $_FILES и далее его разбираете: function sendMailAttachment($mailTo, $From, $subject_text, $message, $_FILES){ $to = $mailTo; $EOL = "\r\n"; // ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём $boundary = "--".md5(uniqid(time())); // любая строка, которой не будет ниже в потоке данных. $subject= '=?utf-8?B?' . base64_encode($subject_text) . '?='; $headers = "MIME-Version: 1.0;$EOL"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL"; $headers .= "From: $From\nReply-To: $From\n"; $multipart = "--$boundary$EOL"; $multipart .= "Content-Type: text/html; charset=utf-8$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= $EOL; // раздел между заголовками и телом html-части $multipart .= chunk_split(base64_encode($message)); #начало вставки файлов foreach($_FILES["file"]["name"] as $key => $value){ $filename = $_FILES["file"]["tmp_name"][$key]; $file = fopen($filename, "rb"); $data = fread($file, filesize( $filename ) ); fclose($file); $NameFile = $_FILES["file"]["name"][$key]; // в этой переменной надо сформировать имя файла (без всякого пути); $File = $data; $multipart .= "$EOL--$boundary$EOL"; $multipart .= "Content-Type: application/octet-stream; name=\"$NameFile\"$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= "Content-Disposition: attachment; filename=\"$NameFile\"$EOL"; $multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла $multipart .= chunk_split(base64_encode($File)); } #>>конец вставки файлов $multipart .= "$EOL--$boundary--$EOL"; if(!mail($to, $subject, $multipart, $headers)){ echo 'Письмо не отправлено'; } //Отправляем письмо else{ echo 'Письмо отправлено'; } } P.S.: код проверен на работоспособность.

Ответ 3



$_FILES - глобальный массив, доступен везде, передавать в функцию не обязательно. Способ с PhpMailer - лучшее решение.

пятница, 7 июня 2019 г.

Почта попадает в спам, как изменить?

Добавил обычную функцию отправки письма:
$subject = "Test mail";
$message = "Hello! This is a simple email message.";
$from = "registration@MYDOMAIN.RU";
$headers = "From: Info
";
mail($to,$subject,$message,$headers);
echo "Mail Sent.";
Решил проверить на спам через mail-tester. Он показывает 0/10(даже -2). Самая основная Ошибка, это: Адрес возврата : webmaster@example.com. Хотя я установил FROM. Ошибка точно не в коде отправки почты. И так же пишет [SPF] example.com не позволяет Вашему серверу myserverIP использовать webmaster@example.com Те же самые ошибки наблюдаю, если отправляю на любой почтовый сервер письмо. Например на mail.ru. Потом захожу в сведения письма и вижу снова несовпадения. Как будто я отправляю почту от имени другого домена. Хотя я зарегистрировал адрес почты.
Как еще подтвердить, что мой сервер, домен и почта одно целое?
Установлен centos на vds. Стоит ispManager. Настроил на домене все необходимые txt, CNAME, mx записи с yandex Добавил через pdd.yandex.ru домен и подтвердил его. Создал там почту. Добавил все необходимые spf, DKIM подписи
РЕШЕНИЕ Необходимо установить опцию sendmail_path = /usr/sbin/sendmail -t -i -f mail@domain.com в php.ini


Ответ

ISPManager использует для PHP тот E-Mail, который прописан для сайта в его настройках в качестве адреса вебмастера. Это делается путём установки параметра PHP sendmail_path в конфигурационных файлах Apache, добавляя в секцию строку вида php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@example.com". Можете попробовать сменить в панели адрес на ваш настоящий. Этот параметр относится к PHP_INI_SYSTEM, так что изменить его можно лишь в системном php.ini или в конфигурационном файле Apache. Также не забудьте про SPF, DKIM и DMARC записи в DNS.

среда, 5 декабря 2018 г.

Почта @live.ru и WLM

Пользуюсь почтовой программой Windows Live Mail 2012 (Build 16.4.3528.0331). Причиной её выбора когда-то стало то, что только она умела работать с майкросовтовской почтой @live.ru по тамошнему http-протоколу, но в целом она меня устраивает по всем критериям: не смешивает почтовые ящики в кучу, но позволяет настраивать быстрые представления. Имеется группировка по темам. И интерфейс удобный.
Но некоторое время назад получил несколько писем от майкросовта о том, что доступ к live.ru-почте из неё будет работать только до конца июня:
Мы заметили, что вы подключаетесь к учетной записи Outlo‍ok‍.‍com с помощью приложения "Почта Windows Live 2012". Обратите внимание, что "Почта Windows Live 2012" не поддерживает технологии синхронизации, которые используются в новой службе Outlo‍ok‍.‍com. После обновления учетной записи, которое произойдет в конце июня, вы не сможете ни отправлять, ни получать электронные сообщения в учетной записи Outlo‍ok‍.‍com с помощью приложения "Почта Windows Live 2012". Не волнуйтесь, вы в любое время можете войти в свою учетную запись Outlo‍ok‍.‍com через веб-браузер и по-прежнему сможете обращаться ко всем данным, которые сейчас находятся в приложении "Почта Windows Live 2012".
В качестве решения в письме предлагается обновиться до десятки (у меня Win7) или получить годовую подписку на Office 365:
Если вы работаете в Windows 7, то для использования приложения "Почта" можно выполнить обновление до более новой версии Windows. Если вы не хотите выполнять обновление, можете работать со своей учетной записью через веб-браузер или воспользоваться бесплатной годовой подпиской на Off‍ice 3‍6‍5 персональный и использовать Outlook 2016 для подключения к учетной записи.* Outlook 2016 работает на операционных системах Windows 7, Windows 8/8.1 и Windows 10. * Необходимо активировать до 15 октября 2016 г. Действительно для пользователей, впервые оформивших подписку на Off‍ice 3‍6‍5. Необходимо указать данные кредитной карты. Вы можете отменить подписку в любое время на странице www.office.com/myaccount. Ознакомиться с полным текстом условий можно здесь.
Можно ли как-то продолжить пользоваться через WLM? На какой протокол они перешли - может на самом деле надо просто добавить аккаунт заново с imap? В таком случае, какие настройки следует указывать?
Если на вопрос про WLM ответ отрицательный, то какие бесплатные почтовые программы можно использовать для доступа к почте из Windows 7? И как их настроить?
PS: Убрал из цитат ссылки, т. к. переходы по ним явно отслеживаются.

Некоторое время назад почта всё-таки перестала работать... Надо как-то настраивать.


Ответ

На основе Add your Outlook.com account to another mail app
IMAP imap-mail.outlook.com:993 IMAP encryption method SSL
POP pop-mail.outlook.com:995 POP encryption method SSL
SMTP smtp-mail.outlook.com:587 SMTP encryption method TLS
При использовании POP требуется дополнительно настроить ящик.
И скриншоты настройки WLM для IMAP: