Как отправить почтовое сообщение? (SSL imap, SSL smtp, напрямую)

mirosas

Нужно отправить почтовое сообщение из php скрипта одним из слудущих вариантов (а для любознательности всеми тремя) без длинных 3rd party классов:

1) через SSL IMAP — казалось бы самое логичное.
imap_open — окей.
imap_mail — очень странная функция, странная тем, что не использует resourse полученный от imap_open, и не видать в ней поддержки SSL

2) SSL SMTP

3) напрямую соединившись с почтовым сервером получателя (по протоколу коннекта почтовых серверов между собой).

В почтовом сообщении предполагается передать ip адрес сервера, и более ничего.

 

mirosas

Неприятно, что PHP по мере обновления версий не обновляет функции под современные реалии, в частности ни с mail.ru, ни c gmail.com. ни даже с yandex.ru мне не удалось отправить письмо используя стандартные php функции, такие как mail.

 

MouseZver

mirosas

А без громоздкого 3rd party software, разобраться в внутренностях которого я вряд ли смогу, как-то возможно?

Пока что сделал передачу IP адреса через создание папки в почтовом ящике и её переименовании. Но как-то по нормальному хочется, и не тягая в простейшее приложение тонны кода.

 

miketomlin

:D Ф-ция mail отправляет через ту прогу, которую укажешь в качестве «отправщика». Укажешь какой-нить почтовый клиент, способный принимать контент через «перенаправление ввода-вывода» и данные доступа, например, через строку параметров, отправишь через любой сторонний почтовый сервис.
— Добавлено —
Но обычно этой ф-цией отправляют с локального почтового сервера. А кто не в состоянии настроить сервер, тот обычно не в состоянии настроить и клиент (или у него нет такой возможности, на шареде), поэтому мучает пых отправкой через сторонний сервис.

 

MouseZver

используй composer или в ручную скачай/установи/подключи

PHP:
  1. <?php
  2. use PHPMailerPHPMailerPHPMailer;
  3. use PHPMailerPHPMailerException;
  4.  
  5. require ‘path/to/PHPMailer/src/Exception.php’;
  6. require ‘path/to/PHPMailer/src/PHPMailer.php’;
  7. require ‘path/to/PHPMailer/src/SMTP.php’;

используй рычаги управления софта

PHP:
  1. $mail = new PHPMailer(true);
  2.  
  3. try {
  4.     //Server settings
  5.     $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      //Enable verbose debug output
  6.     $mail->isSMTP();                                            //Send using SMTP
  7.     $mail->Host       = ‘smtp.example.com’;                     //Set the SMTP server to send through
  8.     $mail->SMTPAuth   = true;                                   //Enable SMTP authentication
  9.     $mail->Username   = ‘user@example.com’;                     //SMTP username
  10.     $mail->Password   = ‘secret’;                               //SMTP password
  11.     $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;            //Enable implicit TLS encryption
  12.     $mail->Port       = 465;                                    //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
  13.  
  14.     //Recipients
  15.     $mail->setFrom(‘from@example.com’, ‘Mailer’);
  16.     $mail->addAddress(‘joe@example.net’, ‘Joe User’);     //Add a recipient
  17.     $mail->addAddress(‘ellen@example.com’);               //Name is optional
  18.     $mail->addReplyTo(‘info@example.com’, ‘Information’);
  19.     $mail->addCC(‘cc@example.com’);
  20.     $mail->addBCC(‘bcc@example.com’);
  21.  
  22.     //Attachments
  23.     $mail->addAttachment(‘/var/tmp/file.tar.gz’);         //Add attachments
  24.     $mail->addAttachment(‘/tmp/image.jpg’, ‘new.jpg’);    //Optional name
  25.  
  26.     //Content
  27.     $mail->isHTML(true);                                  //Set email format to HTML
  28.     $mail->Subject = ‘Here is the subject’;
  29.     $mail->Body    = ‘This is the HTML message body <b>in bold!</b>’;
  30.     $mail->AltBody = ‘This is the body in plain text for non-HTML mail clients’;
  31.  
  32.     $mail->send();
  33.     echo ‘Message has been sent’;
  34. } catch (Exception $e) {
  35.     echo «Message could not be sent. Mailer Error: {$mail->ErrorInfo}«;
  36. }

Все остальные проблемы Майлер решает за тебя.

 

miketomlin

Лучше напрямую, если твой хостер удосужился норм. настроить отправку через mail и ты в курсе, что такое DKIM, SPF и DMARC (особенно если домен хостится не у хостера).

 

mirosas

У меня свой собственный «хостинг»)), под Win 10 (одна из трех задач, для которых создавался этот сервер, работает только под Win) с отключенными обновлениями)) — там никаких почтовых клиентов или серверов не стоит)). Домена у сервера нету), он немножко другое делает). А IP его мне нужен, чтобы при поездках я мог к нему подключиться через RDP.

PhpMailer — это что-то около 300 килобайт 3rd party software ))

Что-то не нравится оно мне… Когда я знакомился с PHP впервые, в версии 3.0, то всё было просто.. А сейчас, такое ощущение, что для отправки почты без 3rd party software на сервере самое простое, это изучить smtp протокол, плюс SSL TLC, и на сокетах все сделать. жесть, как будто на C#, а не на php скрипт пишу.

Пожалуй оставлю как уже реализовал — через imap менять имя папки, на то, какое сообщение мне нужно передать (IP адрес домашнего роутера, за которым стоит домашний сервер).

 

mkramer

Да не, можно и mail-ом, только обычно не хочется самому разбираться с заголовками, кодированием темы и прочим. ПОэтому и используют готовые пакеты.
— Добавлено —
А уж если не через sendmail, которым пользуется mail, а по SMTP — то тем более, возни дофига

 

mirosas

как-то сомнительно… что если оно не поддерживает SSL и авторизацию по логин-пароль, то через заголовки можно будет это сделать.

не люблю я эту современную моду.. где вместо 10 строк кода библиотека на 300 килобайт.

Пока что нашел библиотеку на 5 килобайт, завтра буду пробовать. 5 килобайт я хотя бы прочитать могу. Судя по коду работает на сокетах с обработкой smtp комманд. Чем-то напоминает код, который я давно-давно на java делал, и решил, что php в одну строку мне больше нравится, на чем изучение java остановил. А тут на те… от чего ушел, к тому и вернулся…)) https://vk-book.ru/otpravka-pisem-cherez-smtp-s-avtorizaciej-po-protokolu-ssl-na-php/

 

mkramer

Ну я думаю мало кто отчитывает весь свой vendor.

Ну а так, когда в одну строку, всю эту работу делает утилита sendmail на никсах, которую скрыто дёргает PHP. Винда у меня только на десктопе, поэтому как там не знаю.

 

MouseZver

1,8 кб, моя победить

 

mkramer

Конечно не будет. Как уже сказано, функция mail предельно проста — дёргает внешнюю утилиту и всё.

 

mirosas

))). Сам PHPMailer около 300кб весит)
— Добавлено —

Хм… я тут вычитал, через некоторое место вроде как можно настроить виндовый сендмеил передавать логин-пароль и работать с ssl. Завтра проверю. В теории должно получиться 4 строчки. Первые три ini_set.

 

MouseZver

сам интепретатор php8 basic весит 118Мб o_O зачем тебе пхп? все можно решить обычным powershell

 

miketomlin

О какой прямой отправке тогда идет речь? Прямая отправка не пройдет проверку PTR.

 

miketomlin

Это, наверное, ф-ция для обычной отправки. Чтобы добавить сообщение в «свой» ящик, в IMAP используется команда APPEND. И есть ф-ция imap_append ;)

 

mirosas

)). в 4 строчки не вышло..
118мб интерпретатор это как около гига браузер))
imap_append, пробовал уже, чтобы поместить в Outbox, но что-то пошло не так.. да ладно, просто папку переименовываю и всё.

На будущее понял, что будут проблемы и скорее всего придется использовать длинный 3rd party class, на текущее просто папку переименовывает и ок.

Всем спасибо.

 

miketomlin

Это реальный изврат. Посмотрите описание ф-ции. Там должен быть какой-нить простой пример ;)

 

mirosas

Я сам офигеваю от того, какой это изврат, но работает, и нормальных путей решения я не вижу (ну кроме толстенных, или не очень, 3rd party classes, или можно самому на сокетах написать, через команды smtp или imap).
imap_append писать в Inbox так то тоже израт, пускай и меньший.
На самом деле получилось даже лучше, чем я хотел — так-то я думал у меню будет гора писем, а так, просто папочка переименовывается)

 

Добавить комментарий

Ваш адрес email не будет опубликован.