За последние 24 часа нас посетили 22659 программистов и 1009 роботов. Сейчас ищут 752 программиста ...

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

Тема в разделе "PHP для новичков", создана пользователем mirosas, 18 июл 2021.

  1. mirosas

    mirosas Активный пользователь

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

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

    2) SSL SMTP

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

    В почтовом сообщении предполагается передать ip адрес сервера, и более ничего.
     
    #1 mirosas, 18 июл 2021
    Последнее редактирование: 18 июл 2021
  2. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Неприятно, что PHP по мере обновления версий не обновляет функции под современные реалии, в частности ни с mail.ru, ни c gmail.com. ни даже с yandex.ru мне не удалось отправить письмо используя стандартные php функции, такие как mail.
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.321
    Адрес:
    Лень
  4. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    А без громоздкого 3rd party software, разобраться в внутренностях которого я вряд ли смогу, как-то возможно?

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

    miketomlin Старожил

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.321
    Адрес:
    Лень
    используй composer или в ручную скачай/установи/подключи
    PHP:
    1. <?php
    2. use PHPMailer\PHPMailer\PHPMailer;
    3. use PHPMailer\PHPMailer\Exception;
    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. }
    Все остальные проблемы Майлер решает за тебя.
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Лучше напрямую, если твой хостер удосужился норм. настроить отправку через mail и ты в курсе, что такое DKIM, SPF и DMARC (особенно если домен хостится не у хостера).
     
  8. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    У меня свой собственный "хостинг")), под Win 10 (одна из трех задач, для которых создавался этот сервер, работает только под Win) с отключенными обновлениями)) - там никаких почтовых клиентов или серверов не стоит)). Домена у сервера нету), он немножко другое делает). А IP его мне нужен, чтобы при поездках я мог к нему подключиться через RDP.

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

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

    Пожалуй оставлю как уже реализовал - через imap менять имя папки, на то, какое сообщение мне нужно передать (IP адрес домашнего роутера, за которым стоит домашний сервер).
     
    #8 mirosas, 18 июл 2021
    Последнее редактирование: 18 июл 2021
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Да не, можно и mail-ом, только обычно не хочется самому разбираться с заголовками, кодированием темы и прочим. ПОэтому и используют готовые пакеты.
    --- Добавлено ---
    А уж если не через sendmail, которым пользуется mail, а по SMTP - то тем более, возни дофига
     
  10. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    как-то сомнительно... что если оно не поддерживает SSL и авторизацию по логин-пароль, то через заголовки можно будет это сделать.

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

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

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну я думаю мало кто отчитывает весь свой vendor.

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

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.321
    Адрес:
    Лень
    1,8 кб, моя победить
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Конечно не будет. Как уже сказано, функция mail предельно проста - дёргает внешнюю утилиту и всё.
     
  14. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    ))). Сам PHPMailer около 300кб весит)
    --- Добавлено ---
    Хм... я тут вычитал, через некоторое место вроде как можно настроить виндовый сендмеил передавать логин-пароль и работать с ssl. Завтра проверю. В теории должно получиться 4 строчки. Первые три ini_set.
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.321
    Адрес:
    Лень
    сам интепретатор php8 basic весит 118Мб o_O зачем тебе пхп? все можно решить обычным powershell
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    О какой прямой отправке тогда идет речь? Прямая отправка не пройдет проверку PTR.
     
  17. miketomlin

    miketomlin Старожил

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

    mirosas Активный пользователь

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

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

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

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Это реальный изврат. Посмотрите описание ф-ции. Там должен быть какой-нить простой пример ;)
     
  20. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Я сам офигеваю от того, какой это изврат, но работает, и нормальных путей решения я не вижу (ну кроме толстенных, или не очень, 3rd party classes, или можно самому на сокетах написать, через команды smtp или imap).
    imap_append писать в Inbox так то тоже израт, пускай и меньший.
    На самом деле получилось даже лучше, чем я хотел - так-то я думал у меню будет гора писем, а так, просто папочка переименовывается)
     
    #20 mirosas, 21 июл 2021
    Последнее редактирование: 21 июл 2021
  21. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    а Вы свой код тестами покрыли? нет? лучше использовать готовое "толстенное", но оттестированное решение, чем костыли. конечно, бывают исключения, но, что-то мне подсказывает, не тот случай тут.