Laravel пошта: 5 способів відправки

  1. Laravel пошта: 5 способів відправки Всім привіт! 🙂 Ті, хто підписаний на оновлення проекту,...
  2. Laravel пошта - настройка
  3. Відправка листів в Laravel через API поштових сервісів
  4. Налаштування Laravel Mailgun
  5. Налаштування Laravel Mandrill
  6. Налаштування Laravel SparkPost
  7. Налаштування Laravel Amazon SES
  8. Відправка пошти в Laravel через SMTP
  9. Laravel пошта - відправка за допомогою PHP mail ()
  10. Відправлення листа в Laravel через sendmail
  11. Laravel пошта - запис логів
  12. Вибираємо оптимальний спосіб відправки email в Laravel
  13. Розсилка листів в Laravel на сервері додатка або через сторонній?
  14. Laravel пошта: 5 способів відправки
  15. Особливості відправки пошти в Laravel
  16. Laravel пошта - настройка
  17. Відправка листів в Laravel через API поштових сервісів
  18. Налаштування Laravel Mailgun
  19. Налаштування Laravel Mandrill
  20. Налаштування Laravel SparkPost
  21. Налаштування Laravel Amazon SES
  22. Відправка пошти в Laravel через SMTP
  23. Laravel пошта - відправка за допомогою PHP mail ()
  24. Відправлення листа в Laravel через sendmail
  25. Laravel пошта - запис логів
  26. Вибираємо оптимальний спосіб відправки email в Laravel
  27. Laravel пошта: 5 способів відправки
  28. Особливості відправки пошти в Laravel
  29. Laravel пошта - настройка
  30. Відправка листів в Laravel через API поштових сервісів
  31. Налаштування Laravel Mailgun
  32. Налаштування Laravel Mandrill
  33. Налаштування Laravel SparkPost
  34. Налаштування Laravel Amazon SES
  35. Відправка пошти в Laravel через SMTP
  36. Laravel пошта - відправка за допомогою PHP mail ()
  37. Відправлення листа в Laravel через sendmail
  38. Laravel пошта - запис логів
  39. Вибираємо оптимальний спосіб відправки email в Laravel
  40. Laravel пошта: 5 способів відправки
  41. Особливості відправки пошти в Laravel
  42. Laravel пошта - настройка
  43. Відправка листів в Laravel через API поштових сервісів
  44. Налаштування Laravel Mailgun
  45. Налаштування Laravel Mandrill
  46. Налаштування Laravel SparkPost
  47. Налаштування Laravel Amazon SES
  48. Відправка пошти в Laravel через SMTP
  49. Laravel пошта - відправка за допомогою PHP mail ()
  50. Відправлення листа в Laravel через sendmail
  51. Laravel пошта - запис логів
  52. Вибираємо оптимальний спосіб відправки email в Laravel
  53. Laravel пошта: 5 способів відправки
  54. Особливості відправки пошти в Laravel
  55. Laravel пошта - настройка
  56. Відправка листів в Laravel через API поштових сервісів
  57. Налаштування Laravel Mailgun
  58. Налаштування Laravel Mandrill
  59. Налаштування Laravel SparkPost
  60. Налаштування Laravel Amazon SES
  61. Відправка пошти в Laravel через SMTP
  62. Laravel пошта - відправка за допомогою PHP mail ()
  63. Відправлення листа в Laravel через sendmail
  64. Laravel пошта - запис логів
  65. Вибираємо оптимальний спосіб відправки email в Laravel
  66. Laravel пошта: 5 способів відправки
  67. Особливості відправки пошти в Laravel
  68. Laravel пошта - настройка
  69. Відправка листів в Laravel через API поштових сервісів
  70. Налаштування Laravel Mailgun
  71. Налаштування Laravel Mandrill
  72. Налаштування Laravel SparkPost
  73. Налаштування Laravel Amazon SES
  74. Відправка пошти в Laravel через SMTP
  75. Laravel пошта - відправка за допомогою PHP mail ()
  76. Відправлення листа в Laravel через sendmail
  77. Laravel пошта - запис логів
  78. Вибираємо оптимальний спосіб відправки email в Laravel
  79. Розсилка листів в Laravel на сервері додатка або через сторонній?

Laravel пошта: 5 способів відправки

Всім привіт Всім привіт! 🙂

Ті, хто підписаний на оновлення проекту, і стежить за виходом статей знають, що в минулій публікації ми на прикладі створення форми зворотного зв'язку розглянули реалізацію популярної технології AJAX в Laravel .

У ній ми реалізували відправку запиту серверу і сценарій дій на сайті після отримання відповіді. Залишилося тільки написати скрипт Laravel, що відправляє email повідомлення адміністратору на сервері, замість якого у нас зараз стоїть заглушка у вигляді виведення параметрів запиту.

Зробити це я обіцяв в наступній статті, тобто в поточній. Однак, при підготовці матеріалу прийшов до висновку, що однієї статті буде мало для детального огляду всіх способів Laravel email sending і повноцінної реалізації одного з них.

Тому я вирішив рознести написане на дві частини: повноцінний огляд всіх способів відправки пошти Laravel, який вас сьогодні чекає, і реалізацію відправлення листа одним з них з попутним оглядом методів фасаду Laravel Mail.

Прошу вибачити мене тих, хто налаштовувався побачити відправку пошти сьогодні, але я вважаю, що чиню правильно. Ще спасибі мені скажете 😉

Отже, сьогодні ми розглянемо 5 основних способів відправки email в Laravel і настройку відповідних їм драйверів фреймворка, і я постараюся коротко описати переваги і недоліки кожного з них, після чого виберемо найбільш оптимальний і реалізуємо його в наступній публікації.

Поїхали!

Особливості відправки пошти в Laravel

Оскільки Laravel - PHP framework , То відправити email в коді можна засобами PHP, скориставшись функцією mail (). Або можна взагалі скористатися сторонніми додатками типу sendmail, розгорнувши їх у себе на ПК у вигляді локального поштового сервера.

Ці способи робочі, універсальні і гнучкі в налаштуванні, але на цьому, по правді кажучи, їх переваги закінчуються. Питається - «А що ще потрібно-то?» 🙂 Відповідь більшості розробників буде простий - зручність.

Наприклад, вам хочеться прикрасити свій лист, додавши туди HTML-розмітку і CSS-стилі. Відправлення такого листа за допомогою PHP mail () буде виглядати приблизно так:

<? Php $ to = '[email protected]'; $ Subject = 'Тестове лист з HTML'; $ Message = '<html> <head> <title> Тестове лист з HTML </ title> <meta charset = "utf8"> </ head> <body> <p> Приклад таблиці </ p> <table> <tr > <th> Колонка 1 </ th> <th> Колонка 2 </ th> <th> Колонка 3 </ th> <th> Колонка 4 </ th> </ tr> <tr> <td> Осередок 1 < / td> <td> Осередок 2 </ td> <td> Осередок 3 </ td> <td> Осередок 4 </ td> </ tr> <tr> <td> Осередок 5 </ td> <td> Осередок 6 </ td> <td> Осередок 7 </ td> <td> Осередок 8 </ td> </ tr> </ table> </ body> </ html> '; $ Headers [] = 'MIME-Version: 1.0'; $ Headers [] = 'Content-type: text / html; charset = utf8 '; $ Headers [] = 'To: Receiver <[email protected]>'; $ Headers [] = 'From: Sender <[email protected]>'; $ Headers [] = 'Cc: copy@test.com'; $ Result = mail ($ to, $ subject, $ message, implode ( "\ r \ n", $ headers)); echo $ result? 'OK': 'Error';

Якщо ж скористатися API Laravel, то відправка такого ж повідомлення буде займати всього пару рядків коду:

Mail :: send ( 'emails.test', [], function ($ message) {$ m-> from ('[email protected] ',' Sender '); $ m-> to (' receiver @ test. com ',' Receiver ') -> subject (' Тестове лист з HTML '); $ m-> cc ('[email protected]', '');});

Єдине, HTML код шаблону буде розміщуватися в окремому файлі /resources/views/emails/test.blade.php, який вказаний в якості першого аргументу.

В цілому, як на мене, цей приклад дуже переконливо демонструє зручність API Laravel для відправки email.

До речі, дана АПИ-шка в Laravel реалізована на базі популярної бібліотеки SwiftMailer , Що є компонентом Symfony PHP framework, які дуже люблять використовувати розробники Laravel.

Тому вона вже входить в його комплект з коробки, і ставити її немає потреби.

Єдиний мінус, який я зміг знайти під час налаштування відправки пошти в Laravel через його API, - це рясна часом метушня з настройками і установкою додаткових пакетів, щоб той чи інший спосіб заробив. Але це приватний мінус.

Плюсів ж у порівнянні з нативними методами набагато більше.

По-перше, це - зручність використання.

По-друге, купа примочок у вигляді створення спеціальних Mailable класів, які надають зручність при масових розсилках однотипних листів в різних місцях коду.

По-третє, механізм черг Laravel, що дозволяє відправляти листи порціями через рівні проміжки часу, знижуючи навантаження з сервера і оберігаючи ваш ресурс від бана пошуковими системами і поштовими сервісами за спам.

Але, для використання даних переваг доведеться грати за правилами фреймворка і виробляти настройки відправки пошти певним чином.

Laravel пошта - настройка

Я зараз говорю про використання спеціальних драйверів для різних способів відправки листів в Laravel і експериментів з файлами конфігурацій .env, /config/mail.php і /config/services.php.

Якщо про драйвери ми поговоримо далі, то зі структурою файлів познайомимося зараз.

З коробки в файлі .env вже існує спеціальний блок змінних оточення для налаштувань надсилання електронних листів. Їх легко впізнати по приставці MAIL:

MAIL_DRIVER = smtp MAIL_HOST = smtp.mailtrap.io MAIL_PORT = 2525 MAIL_USERNAME = null MAIL_PASSWORD = null MAIL_ENCRYPTION = null

Ну, а що з приводу /config/mail.php і /config/services.php?

Відкриваємо перший з перерахованих і що ж ми бачимо? Вміст файлів я наводити не буду, тому що у всіх з коробки воно однаково - просто відкрийте їх у себе на комп'ютері.

Практично всі містяться в ньому параметри за замовчуванням беруть свої значення з файлу оточення .env, розташованого в корені сайту, за допомогою Laravel функції-хелпери env ().

Виняток становлять лише такі:

'From' => [ 'address' => '[email protected]', 'name' => 'Example',],

За допомогою даних параметрів у нас є можливість вказати email та ім'я відправника для всіх листів за замовчуванням, що відправляються з нашого Laravel сайту.

З приводу інших параметрів з mail.php - я буду змінювати їх в своєму файлі файлі оточення, тому що якщо я буду правити сам конфиг, то мої налаштування заллються в загальний репозиторій і тільки будуть вас збивати.

Ну, і в файлі services.php ситуація не сильно відрізняється від mail.php: практично всі параметри беруться з .env.

Так що в подальшому я буду правити .env, а ви просто повторюйте за мною. До речі, оскільки для різних способів відправки email в Laravel будуть вимагатися різні змінні з стандартного набору, то ті, які містяться у нас в .env зараз з приставкою MAIL я просто видалю, щоб не плутатися.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку

Ну, а в самі файли конфігурацій mail.php і services.php ми будемо заглядати лише за тим, щоб дізнатися імена необхідних змінних з метою їх додавання або редагування в .env.

Ось на цій ноті ми і переходимо до огляду способів відправки пошти в Ларавел і необхідних для цього налаштувань, де поговоримо про все вищепереліченому вище докладніше.

Відправка листів в Laravel через API поштових сервісів

Перший спосіб відправки email в Laravel, який я вирішив розглянути, це - використання різних поштових сервісів через їх API.

Все, що від вас буде потрібно для його реалізації - це наявність аккаунта Mailgun, Mandrill, SparkPost або Amazon SES (на даним момент Laravel з коробки підтримує тільки їх) і установка необхідного пакету для реалізації сумісності сервісу з Laravel.

До речі, якщо ви там не зареєстровані і не хочете до них прив'язуватися, то пропоную відразу пропустити даний спосіб і спробувати наступні, які більш універсальні.

Налаштування Laravel Mailgun

Для відправки пошти через даний сервіс в першу чергу необхідно встановити в Laravel Guzzle HTTP library. Робити ми це будемо, природно, через пакетний менеджер Composer .

Отже, відкриваємо консоль і переходимо в каталог, де розташований наш Laravel проект. Виконуємо наступну команду:

composer require guzzlehttp / guzzle

В консолі буде описуватися порядок установки. Після успішного завершення все, що нам залишиться для завершення налаштувань - це доповнити файл оточення .env наступним кодом:

MAIL_DRIVER = mailgun MAILGUN_DOMAIN = ваш_домен MAILGUN_SECRET = ваш_ключ

Змінним MAILGUN_DOMAIN і MAILGUN_SECRET потрібно вказати значення, отримані після реєстрації в Mailgun для використання його АПИ.

Налаштування Laravel Mandrill

Для настройки відправки пошти Laravel через даний сервіс процедура буде багато в чому схожа з попереднім. Для початку встановлюємо Guzzle HTTP library.

А потім йдемо в Laravel .env і додаємо наступне:

MAIL_DRIVER = mandrill MANDRILL_SECRET = ваш_ключ

Змінної MANDRILL_SECRET потрібно вказати значення, отримане вами при реєстрації в Mandrill для використання його АПІшкі.

До речі! Процедура настройки Mandrill в офіційній документації Laravel в останній раз була описана для версії Laravel 5.2, але, судячи по коду движка, використання даного сервісу є досі (мабуть, вирішили залишити для роботи старих додатків).

Оскільки в нових версіях фреймворку творці Laravel з якихось причин вирішили відмовитися від Mandrill, то доведеться трохи пошаманити і додати в /config/services.php наступний блок для успішного відправлення листів:

'Mandrill' => [ 'secret' => env ( 'MANDRILL_SECRET'),],

Налаштування Laravel SparkPost

Підтримка даного сервісу, якщо вірити офіційній документації, з'явилася в Laravel 5.3. Тому якщо у вас додаток використовує більш ранню версію фреймворку, то даний спосіб у вас не спрацює. Або поновіть Laravel, або скористайтеся іншим способом (благо, їх вистачає).

Для успішного використання SparkPost нам буде потрібно все та ж Guzzle HTTP library і наступні змінні оточення в файлі .env:

MAIL_DRIVER = sparkpost SPARKPOST_SECRET = ваш_ключ

Налаштування Laravel Amazon SES

Даний поштовий сервіс, як і SparkPost, з'явився в Laravel 5.3, прийшовши на заміну Mandrill. Тому, якщо ви використовуєте більш ранню версію движка, то вам варто або оновитися, або використовувати інший спосіб відправки email в Laravel.

Його настройка буде дещо відрізнятися від попередніх поштових сервісів, тому що для його підтримки в Laravel буде потрібно не знайома вже Guzzle HTTP library, а інший пакет - Amazon AWS SDK for PHP, який встановлюється за допомогою такої команди в консолі:

composer require aws / aws-sdk-php: 3. *

Після установки доповнюємо файл .env наступними змінними оточення:

MAIL_DRIVER = ses SES_KEY = ваш_ключ SES_SECRET = ваш_секретний_ключ

Думаю, і так зрозуміло, що значення ключів вам повинні бути доступні після реєстрації в Amazon SES. До речі, не забудьте перевірити код свого регіону, згенерований Amazon. Якщо він буде не 'us-east-1', то зайдіть в файл /config/services.php і задайте потрібне значення параметру 'ses' [ 'region'].

На цьому огляд підтримуваних Laravel API поштових сервісів добігає кінця. Переходимо до огляду наступного способу відправки пошти.

Відправка пошти в Laravel через SMTP

Думаю, що багато в курсі про протокол передачі пошти SMTP. Так само, багато хто знає, що практично всі сучасні поштові сервіси пропонують свої SMTP-сервера для відправки пошти з сайтів через них.

По суті, попередній спосіб відправки пошти в Laravel через поштові сервіси - це те ж саме, що і поточний. За тим лише винятком, що в першому випадку ми відправляємо листи через API сервісу, а в другому - звертаючись до поштового сервера безпосередньо.

Ну, і при відправленні через SMTP ви можете користуватися будь-яким поштовим сервісом, який надає таку можливість (Gmail, Яндекс Пошта і т.д.), а взаємодію з сервісом по АПИ, ви маєте доступ лише до обраних, які підтримує Laravel. Ось і вся різниця 🙂

Все, що потрібно зробити користувачам, щоб скористатися можливістю відправки листів в Laravel через SMTP - це зареєструватися в сервісі і дізнатися настройки підключення до SMTP-серверу (адреса або доменне ім'я сервера, порт, шифрування і т.д.).

Ну, і ввести їх в Laravel належним чином:

MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 587 MAIL_USERNAME = Ваше_імя_пользователя MAIL_PASSWORD = ваш_пароль MAIL_ENCRYPTION = tls

Вище наведено приклад налаштувань Laravel для відправки пошти через SMTP сервер поштового сервісу Google - Gmail. Я вирішив вибрати саме його, тому що поштову скриньку gmail.com є, напевно, практично у всіх, тому даний спосіб підійде більшості.

Laravel пошта - відправка за допомогою PHP mail ()

Питається - «Що це за нісенітниця?» :-). Навіщо використовувати PHP mail () в якості драйвера для відправки пошти, якщо можна безпосередньо викликати цю функцію в коді? Відповідь все той же, що і раніше - для зручності, тому що при використанні драйвера ми отримуємо можливість використовувати API Laravel для «прокачаної» і більш зручною відправки листів.

Отже, якою буде порядок настройки?

Для даного способу він буде самим що ні на є примітивним. Досить буде змісту в файлі оточення .env наступного рядка:

MAIL_DRIVER = mail

Відправлення листа в Laravel через sendmail

Скажу чесно, про те, що з sendmail я познайомився порівняно недавно. Рівне тоді, коли дізнався, що в Laravel є можливість відправляти email за допомогою даної штуки.

Тому дозволю зробити невеликий вступ для таких же, як я, про те, що таке sendmail.

Sendmail, як говорить Wikipedia - це один з найдавніших агентів відправки пошти на рівні ОС.
На даним момент існують версія програми для практично під всі операційні системи і апаратні платформи.

Майже у всіх Unix-подібних системах є в базовій комплектації. Для запуску під Windows, наскільки я встиг помітити, потрібно додатково завантажувати.

Розповсюджується безкоштовно у вигляді виконуваного файлу з конфіга і вихідним кодом. Таким чином, для запуску sendmail необхідно буде запустити його виконуваний файл.

Ну, а для відправки пошти в Laravel за допомогою sendmail по-перше, потрібно вказати відповідний драйвер в файлі оточення .env:

MAIL_DRIVER = sendmail

І оскільки відправка email буде здійснюватися за допомогою системної утиліти, то фреймворку необхідно вказати шлях до її виконуваного файлу. Для цього в конфіги /config/mail.php є спеціальний параметр, як значення якого прописуємо шлях до sendmail на сервері (або локальної машині):

'Sendmail' => '/ usr / sbin / sendmail -bs',

В даному прикладі наведено код за замовчуванням, який буде працювати на Unix-подібних системах.

Laravel пошта - запис логів

Наостанок я залишив огляд драйвера відправки пошти в Laravel, за допомогою якого email відправити не вийде. Зате він відмінно підходить для дебага процесу формування і відправлення листа.

Це стає можливим завдяки записи в логи Laravel сформованого тексту email повідомлення, яке зазвичай відправляється додатком на поштову скриньку кінцевого користувача.

Щоб включити дану можливість в Laravel, необхідно виконати примітивну настройку, як і в разі використання PHP mail (). Достатньо всього лише вказати драйвер відправки пошти в .env:

MAIL_DRIVER = log

У підсумку, при якому зазначається вдале надсилання повідомлення ми отримаємо запис в логах наступного формату:

[2017-09-12 8:23:06] local.DEBUG: Message-ID: <[email protected]> Date: Tue, 12 Sep 2017 8:23:06 +0000 Subject: Your Subject From: Sender <receiver @ test.com> To: Receiver <[email protected]> MIME-Version: 1.0 Content-Type: text / plain; charset = utf-8 Content-Transfer-Encoding: quoted-printable Test

Нагадую, що при використанні даного драйвера відправка листа на пошту користувача не проводиться, тому їм користуватися можна тільки при локальної розробці для настройки підсумкового повідомлення, і ні в якому разі не в Production оточенні.

А також, запис проводиться в файл логів Laravel /storage/logs/laravel.log, а не в логи сервера.

Вибираємо оптимальний спосіб відправки email в Laravel

Ну, ось ми і розглянули всі наявні в Laravel драйвера відправки пошти, використання кожного з яких дозволяє виробляти email sending різними способами.

Тепер саме час оцінити достоїнства і недоліки кожного з них і в порівнянні з іншими, щоб виявити найбільш оптимальний для подальшого використання.

Отже, на порядку для у нас відправка email через поштові сервіси по їх API, через SMTP сервера, за допомогою PHP mail () і sendmail. Запис в логи зі зрозумілих причин способом відправки email ми не вважаємо, тому що вона при використанні драйвера log не проводиться. Однак, зовсім ігнорувати використання даного драйвера теж не варто, тому що він є зручним інструментом дебага, і їм рекомендується користуватися перед реальною відправкою пошти, щоб надмірно не навантажувати сервер і поштові сервіси не заблокували ваш сайт, як генератор спаму.

Інша справа, що записи в логах дозволять вам відстежити сам факт оправлення email і виникають при цьому помилок, однак ніяк не допоможуть в корекції верстки шаблону листа. Але, для цього в Laravel є зручний інструмент предпросмотра листи в браузері, про який ми з вами обов'язково поговоримо надалі.

Отже, який же спосіб відправки листів в Laravel нам вибрати?

Відправлення email в Laravel через поштові сервіси за допомогою API і через SMTP сервера - це, по суті, одне і те ж, тому що в обох випадках листи будуть відправлятися не з сервера на якому розташований сайт, а зі стороннього. Єдина відмінність в них - це порядок взаємодії. У першому випадку ви спілкуєтеся з поштовим сервісом через спеціальних API-методів, а в другому - посилаєте запит на сервер для відправки пошти.

Таким чином, при використанні API список можливостей у вас може бути трохи ширше, ніж при відправці email через SMTP. Але, по крайней мере, при стандартному використанні API Laravel для відправки листів і бібліотеки SwiftMailer ми цих можливостей не відчутний.

Також, як стверджують деякі розробники, при відправці листів через SMTP сервер фіксується IP адреса, з якого йде звернення до сервера, що може бути небажано в окремих випадках.

Ну, і при роботі через API швидкість взаємодії може бути злегка вище, ніж при використанні SMTP серверів. За крайній мірі, так стверджує Mailgun . А як воно насправді - чесно кажучи, не перевіряв 🙂 Так що якщо ви маєте в своєму розпорядженні більш точної і повної інформацією з даного приводу, то прошу поділитися їй в коментарях.

З приводу использование PHP mail () и sendmail - ЦІ підході, як и попередні, Досить схожі. Їх головні схожістю є відправки листів на сервері, на якому розташованій сайт. Інші розходження полягають у суб'єктивному зручність настройки, споживання серверних ресурсів і т.д.

Але, як на мене, ці розбіжності настільки мізерні, що прямують до нуля, тому заглиблюватися в їх опис я не стану. Тим більше, що багато хто з них просто стирає Laravel при використанні його API для налаштування і використання перерахованих способів.

Якщо раптом я забув про щось принципово важливому - прохання виправити мене в коментарях під статтею.

Розсилка листів в Laravel на сервері додатка або через сторонній?

Отже, наші чотири основні способи відправки листів в Laravel розділилися на дві групи, основною відмінністю яких є підхід до розсилки пошти.

В першу потрапили використання поштових сервісів через АПИ і їх SMTP серверів, а в другу - експлуатація PHP mail () і sendmail. Всередині груп відмінності між способами незначні, а ось при порівнянні груп в цілому є що сказати.

До незаперечних переваг відправки email на сервері додатка (сервер, на якому працює додаток / сайт) над використанням стороннього можна віднести необмежену кількість повідомлень, що відправляються (може бути обмежена лише можливостями сервера і тарифним планом хостингу). Але, в той же час, частина листів (якщо не всі) потрапляють в папку «Спам» на поштовому клієнті і, отже, шанси, що одержувач ознайомиться з вашою кореспонденцією вчасно, катастрофічно мізерні.

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

Ну, і ще до мінусів відправки пошти з сервера додатки можна віднести витрата серверних ресурсів, що при використанні віртуального хостингу і великих обсягів листів може стати істотним недоліком.

Якщо говорити про другу групу способів відправки листів в Laravel (використання API і SMTP серверів поштових сервісів), то у них даний момент є найголовнішою перевагою, тому що листи відсилаються на сторонніх серверах, тобто витрачаються їхні ресурси, а не ваші. Зате ви будете постійно упиратися в обмеження, тому що при використанні безкоштовних тарифів кількість email лімітовано і коливається в межах від 10000 на місяць для MailGun, закінчуючи 60000 у Gmail і Amazon SES.

У деяких поштових сервісів, до речі, взагалі немає безкоштовних тарифів, як у SparkPost, наприклад. Природно, вас будуть запевняти в інших перевагах використання поштових сервісів, які стають доступними в преміум-акаунтів ... Не здивуюся, якщо з'ясується, що міфи про спамності PHP mail () вигадані ними ж 😉

Все може бути ... Треба ж їм якось існувати і конкурувати не тільки один з одним, але і з безкоштовними аналогами. Але я більш не має наміру продовжувати цю розмову, тому що ні перші, ні другі за рекламу мені не платять 🙂

Повернемося до реальних і об'єктивних особливостей. І тут хочеться сказати, що навіть якщо закрити очі на штучні обмеження числа листів, відправка пошти через сторонній сервіс сама має низку недоліків. До числа одним з найголовніших хочеться віднести велику тривалість процедури відправки email, зокрема, через SMTP Gmail, яку я помітив на практиці.

Ну самі поміркуйте: якщо для відправлення листа на сервері додатка вам потрібно відправити локальний запит і отримати від нього відповідь, то при використанні сторонніх сервісів їх сервера можуть розташовуватися в іншій країні, а то і на іншому континенті (мало не написав планеті :-)) , куди запит і відповідь на нього буде йти набагато довше першого варіанту.

Додайте до цього ще час очікування черги (вас же не одного обслуговують!) І самої обробки запиту. Думаю, зрозуміло, до чого я веду 🙂

Можливо, що при розсилці повідомлень порціями час запиту до локального сервера і віддаленого будуть приблизно рівні, але при відправці одиночних повідомлень поштові сервіси програють PHP mail (), sendmail і іншим локальним засобам розсилки листів.

Так, під час цього дійства витрачаються ресурси сторонніх серверів, але за цей плюс доводиться розплачуватися часом.

Але, тим не менше, відправка листів через API і SMTP сервера поштових сервісів все одно дуже популярна серед розробників і клієнтів. Тим більше, що великі порції листів (масові розсилки) часто проводяться в фоновому режимі, і при цьому абсолютно все одно, скільки часу вони займають. Зате на великих проектах, де ресурси серверів економляться до межі зважаючи на велику кількість виконуваних завдань, можливість винести частину процесів на сторонній ресурс вельми приваблива і обгрунтована.

Тому, виходячи з даних міркувань, я при подальшій розробці буду використовувати відправку пошти в Laravel через сторонні поштові сервіси. А точніше, через SMTP Gmail. Чому саме цей спосіб? Тому що у мене там вже є обліковий запис, налаштована для використання SMTP сервера, а на інших поштовика немає, і мені лінь її створювати 🙂

Це абсолютно не означає, що даний метод ідеальний (самі могли переконатися, скільки мінусів у нього вдалося знайти). Навіть сам заголовок про вибір найбільш оптимального способу відправки пошти в Laravel не зовсім коректний, але треба ж було вас якось зацікавити прочитати весь матеріал 🙂 Тим більше, що тепер ви познайомилися з перевагами і недоліками кожного підходу і зможете самостійно вибрати те, що вам більше до душі або підходить в конкретній ситуації.

На цьому сьогоднішня стаття з оглядом способів відправки пошти в Laravel добігає кінця. Сподіваюся, ви тепер розумієте моє бажання розділити теорію і практику реалізації відправки email в Ларавель на різні публікації, тому що одна стаття про все це була б просто неосяжної і ви б половину її не читали б ... А так є мізерний шанс, що ви дійшли до цих рядків 🙂 Якщо так - з вас лайк під статтею.

Ну, а наступну публікацію я вже цілеспрямовано присвячу реалізації відправки email через API Laravel, для чого скористаюся методами фасаду Mail і детально опишу його можливості. Інші можливості API розглянемо вже далі, коли у нас буде готовий до роботи сайт. Та й, можливо, не всі цього і захочуть ...

На цьому все. Пишіть ваші відгуки в коментарях і не забувайте вступати в соціальні спільноти. Також приймаються ваші пропозиції з приводу нових статей про речі, які будуть вам цікаві.

До скорої зустрічі!

PS: если вам потрібен сайт або необходимо внести правки на існуючій, но для цього немає часу и бажання, можу Запропонувати свои послуги.

Більше 5 років досвіду професійної розробки сайтів. Робота з PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular и іншімі технологіямі web-розробки.

Досвід розробки проектів різного уровня: Лендінзі, корпоративні сайти, Інтернет-магазини, CRM, портал. У тому чіслі підтримка и розробка HighLoad проектів. Твір Ваші заявки на email [email protected] .

І з друзями не забудьте Поділитися 😉

Laravel пошта: 5 способів відправки

Всім привіт Всім привіт! 🙂

Ті, хто підписаний на оновлення проекту, і стежить за виходом статей знають, що в минулій публікації ми на прикладі створення форми зворотного зв'язку розглянули реалізацію популярної технології AJAX в Laravel .

У ній ми реалізували відправку запиту серверу і сценарій дій на сайті після отримання відповіді. Залишилося тільки написати скрипт Laravel, що відправляє email повідомлення адміністратору на сервері, замість якого у нас зараз стоїть заглушка у вигляді виведення параметрів запиту.

Зробити це я обіцяв в наступній статті, тобто в поточній. Однак, при підготовці матеріалу прийшов до висновку, що однієї статті буде мало для детального огляду всіх способів Laravel email sending і повноцінної реалізації одного з них.

Тому я вирішив рознести написане на дві частини: повноцінний огляд всіх способів відправки пошти Laravel, який вас сьогодні чекає, і реалізацію відправлення листа одним з них з попутним оглядом методів фасаду Laravel Mail.

Прошу вибачити мене тих, хто налаштовувався побачити відправку пошти сьогодні, але я вважаю, що чиню правильно. Ще спасибі мені скажете 😉

Отже, сьогодні ми розглянемо 5 основних способів відправки email в Laravel і настройку відповідних їм драйверів фреймворка, і я постараюся коротко описати переваги і недоліки кожного з них, після чого виберемо найбільш оптимальний і реалізуємо його в наступній публікації.

Поїхали!

Особливості відправки пошти в Laravel

Оскільки Laravel - PHP framework , То відправити email в коді можна засобами PHP, скориставшись функцією mail (). Або можна взагалі скористатися сторонніми додатками типу sendmail, розгорнувши їх у себе на ПК у вигляді локального поштового сервера.

Ці способи робочі, універсальні і гнучкі в налаштуванні, але на цьому, по правді кажучи, їх переваги закінчуються. Питається - «А що ще потрібно-то?» 🙂 Відповідь більшості розробників буде простий - зручність.

Наприклад, вам хочеться прикрасити свій лист, додавши туди HTML-розмітку і CSS-стилі. Відправлення такого листа за допомогою PHP mail () буде виглядати приблизно так:

<? Php $ to = '[email protected]'; $ Subject = 'Тестове лист з HTML'; $ Message = '<html> <head> <title> Тестове лист з HTML </ title> <meta charset = "utf8"> </ head> <body> <p> Приклад таблиці </ p> <table> <tr > <th> Колонка 1 </ th> <th> Колонка 2 </ th> <th> Колонка 3 </ th> <th> Колонка 4 </ th> </ tr> <tr> <td> Осередок 1 < / td> <td> Осередок 2 </ td> <td> Осередок 3 </ td> <td> Осередок 4 </ td> </ tr> <tr> <td> Осередок 5 </ td> <td> Осередок 6 </ td> <td> Осередок 7 </ td> <td> Осередок 8 </ td> </ tr> </ table> </ body> </ html> '; $ Headers [] = 'MIME-Version: 1.0'; $ Headers [] = 'Content-type: text / html; charset = utf8 '; $ Headers [] = 'To: Receiver <[email protected]>'; $ Headers [] = 'From: Sender <[email protected]>'; $ Headers [] = 'Cc: copy@test.com'; $ Result = mail ($ to, $ subject, $ message, implode ( "\ r \ n", $ headers)); echo $ result? 'OK': 'Error';

Якщо ж скористатися API Laravel, то відправка такого ж повідомлення буде займати всього пару рядків коду:

Mail :: send ( 'emails.test', [], function ($ message) {$ m-> from ('[email protected] ',' Sender '); $ m-> to (' receiver @ test. com ',' Receiver ') -> subject (' Тестове лист з HTML '); $ m-> cc ('[email protected]', '');});

Єдине, HTML код шаблону буде розміщуватися в окремому файлі /resources/views/emails/test.blade.php, який вказаний в якості першого аргументу.

В цілому, як на мене, цей приклад дуже переконливо демонструє зручність API Laravel для відправки email.

До речі, дана АПИ-шка в Laravel реалізована на базі популярної бібліотеки SwiftMailer , Що є компонентом Symfony PHP framework, які дуже люблять використовувати розробники Laravel.

Тому вона вже входить в його комплект з коробки, і ставити її немає потреби.

Єдиний мінус, який я зміг знайти під час налаштування відправки пошти в Laravel через його API, - це рясна часом метушня з настройками і установкою додаткових пакетів, щоб той чи інший спосіб заробив. Але це приватний мінус.

Плюсів ж у порівнянні з нативними методами набагато більше.

По-перше, це - зручність використання.

По-друге, купа примочок у вигляді створення спеціальних Mailable класів, які надають зручність при масових розсилках однотипних листів в різних місцях коду.

По-третє, механізм черг Laravel, що дозволяє відправляти листи порціями через рівні проміжки часу, знижуючи навантаження з сервера і оберігаючи ваш ресурс від бана пошуковими системами і поштовими сервісами за спам.

Але, для використання даних переваг доведеться грати за правилами фреймворка і виробляти настройки відправки пошти певним чином.

Laravel пошта - настройка

Я зараз говорю про використання спеціальних драйверів для різних способів відправки листів в Laravel і експериментів з файлами конфігурацій .env, /config/mail.php і /config/services.php.

Якщо про драйвери ми поговоримо далі, то зі структурою файлів познайомимося зараз.

З коробки в файлі .env вже існує спеціальний блок змінних оточення для налаштувань надсилання електронних листів. Їх легко впізнати по приставці MAIL:

MAIL_DRIVER = smtp MAIL_HOST = smtp.mailtrap.io MAIL_PORT = 2525 MAIL_USERNAME = null MAIL_PASSWORD = null MAIL_ENCRYPTION = null

Ну, а що з приводу /config/mail.php і /config/services.php?

Відкриваємо перший з перерахованих і що ж ми бачимо? Вміст файлів я наводити не буду, тому що у всіх з коробки воно однаково - просто відкрийте їх у себе на комп'ютері.

Практично всі містяться в ньому параметри за замовчуванням беруть свої значення з файлу оточення .env, розташованого в корені сайту, за допомогою Laravel функції-хелпери env ().

Виняток становлять лише такі:

'From' => [ 'address' => '[email protected]', 'name' => 'Example',],

За допомогою даних параметрів у нас є можливість вказати email та ім'я відправника для всіх листів за замовчуванням, що відправляються з нашого Laravel сайту.

З приводу інших параметрів з mail.php - я буду змінювати їх в своєму файлі файлі оточення, тому що якщо я буду правити сам конфиг, то мої налаштування заллються в загальний репозиторій і тільки будуть вас збивати.

Ну, і в файлі services.php ситуація не сильно відрізняється від mail.php: практично всі параметри беруться з .env.

Так що в подальшому я буду правити .env, а ви просто повторюйте за мною. До речі, оскільки для різних способів відправки email в Laravel будуть вимагатися різні змінні з стандартного набору, то ті, які містяться у нас в .env зараз з приставкою MAIL я просто видалю, щоб не плутатися.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку

Ну, а в самі файли конфігурацій mail.php і services.php ми будемо заглядати лише за тим, щоб дізнатися імена необхідних змінних з метою їх додавання або редагування в .env.

Ось на цій ноті ми і переходимо до огляду способів відправки пошти в Ларавел і необхідних для цього налаштувань, де поговоримо про все вищепереліченому вище докладніше.

Відправка листів в Laravel через API поштових сервісів

Перший спосіб відправки email в Laravel, який я вирішив розглянути, це - використання різних поштових сервісів через їх API.

Все, що від вас буде потрібно для його реалізації - це наявність аккаунта Mailgun, Mandrill, SparkPost або Amazon SES (на даним момент Laravel з коробки підтримує тільки їх) і установка необхідного пакету для реалізації сумісності сервісу з Laravel.

До речі, якщо ви там не зареєстровані і не хочете до них прив'язуватися, то пропоную відразу пропустити даний спосіб і спробувати наступні, які більш універсальні.

Налаштування Laravel Mailgun

Для відправки пошти через даний сервіс в першу чергу необхідно встановити в Laravel Guzzle HTTP library. Робити ми це будемо, природно, через пакетний менеджер Composer .

Отже, відкриваємо консоль і переходимо в каталог, де розташований наш Laravel проект. Виконуємо наступну команду:

composer require guzzlehttp / guzzle

В консолі буде описуватися порядок установки. Після успішного завершення все, що нам залишиться для завершення налаштувань - це доповнити файл оточення .env наступним кодом:

MAIL_DRIVER = mailgun MAILGUN_DOMAIN = ваш_домен MAILGUN_SECRET = ваш_ключ

Змінним MAILGUN_DOMAIN і MAILGUN_SECRET потрібно вказати значення, отримані після реєстрації в Mailgun для використання його АПИ.

Налаштування Laravel Mandrill

Для настройки відправки пошти Laravel через даний сервіс процедура буде багато в чому схожа з попереднім. Для початку встановлюємо Guzzle HTTP library.

А потім йдемо в Laravel .env і додаємо наступне:

MAIL_DRIVER = mandrill MANDRILL_SECRET = ваш_ключ

Змінної MANDRILL_SECRET потрібно вказати значення, отримане вами при реєстрації в Mandrill для використання його АПІшкі.

До речі! Процедура настройки Mandrill в офіційній документації Laravel в останній раз була описана для версії Laravel 5.2, але, судячи по коду движка, використання даного сервісу є досі (мабуть, вирішили залишити для роботи старих додатків).

Оскільки в нових версіях фреймворку творці Laravel з якихось причин вирішили відмовитися від Mandrill, то доведеться трохи пошаманити і додати в /config/services.php наступний блок для успішного відправлення листів:

'Mandrill' => [ 'secret' => env ( 'MANDRILL_SECRET'),],

Налаштування Laravel SparkPost

Підтримка даного сервісу, якщо вірити офіційній документації, з'явилася в Laravel 5.3. Тому якщо у вас додаток використовує більш ранню версію фреймворку, то даний спосіб у вас не спрацює. Або поновіть Laravel, або скористайтеся іншим способом (благо, їх вистачає).

Для успішного використання SparkPost нам буде потрібно все та ж Guzzle HTTP library і наступні змінні оточення в файлі .env:

MAIL_DRIVER = sparkpost SPARKPOST_SECRET = ваш_ключ

Налаштування Laravel Amazon SES

Даний поштовий сервіс, як і SparkPost, з'явився в Laravel 5.3, прийшовши на заміну Mandrill. Тому, якщо ви використовуєте більш ранню версію движка, то вам варто або оновитися, або використовувати інший спосіб відправки email в Laravel.

Його настройка буде дещо відрізнятися від попередніх поштових сервісів, тому що для його підтримки в Laravel буде потрібно не знайома вже Guzzle HTTP library, а інший пакет - Amazon AWS SDK for PHP, який встановлюється за допомогою такої команди в консолі:

composer require aws / aws-sdk-php: 3. *

Після установки доповнюємо файл .env наступними змінними оточення:

MAIL_DRIVER = ses SES_KEY = ваш_ключ SES_SECRET = ваш_секретний_ключ

Думаю, і так зрозуміло, що значення ключів вам повинні бути доступні після реєстрації в Amazon SES. До речі, не забудьте перевірити код свого регіону, згенерований Amazon. Якщо він буде не 'us-east-1', то зайдіть в файл /config/services.php і задайте потрібне значення параметру 'ses' [ 'region'].

На цьому огляд підтримуваних Laravel API поштових сервісів добігає кінця. Переходимо до огляду наступного способу відправки пошти.

Відправка пошти в Laravel через SMTP

Думаю, що багато в курсі про протокол передачі пошти SMTP. Так само, багато хто знає, що практично всі сучасні поштові сервіси пропонують свої SMTP-сервера для відправки пошти з сайтів через них.

По суті, попередній спосіб відправки пошти в Laravel через поштові сервіси - це те ж саме, що і поточний. За тим лише винятком, що в першому випадку ми відправляємо листи через API сервісу, а в другому - звертаючись до поштового сервера безпосередньо.

Ну, і при відправленні через SMTP ви можете користуватися будь-яким поштовим сервісом, який надає таку можливість (Gmail, Яндекс Пошта і т.д.), а взаємодію з сервісом по АПИ, ви маєте доступ лише до обраних, які підтримує Laravel. Ось і вся різниця 🙂

Все, що потрібно зробити користувачам, щоб скористатися можливістю відправки листів в Laravel через SMTP - це зареєструватися в сервісі і дізнатися настройки підключення до SMTP-серверу (адреса або доменне ім'я сервера, порт, шифрування і т.д.).

Ну, і ввести їх в Laravel належним чином:

MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 587 MAIL_USERNAME = Ваше_імя_пользователя MAIL_PASSWORD = ваш_пароль MAIL_ENCRYPTION = tls

Вище наведено приклад налаштувань Laravel для відправки пошти через SMTP сервер поштового сервісу Google - Gmail. Я вирішив вибрати саме його, тому що поштову скриньку gmail.com є, напевно, практично у всіх, тому даний спосіб підійде більшості.

Laravel пошта - відправка за допомогою PHP mail ()

Питається - «Що це за нісенітниця?» :-). Навіщо використовувати PHP mail () в якості драйвера для відправки пошти, якщо можна безпосередньо викликати цю функцію в коді? Відповідь все той же, що і раніше - для зручності, тому що при використанні драйвера ми отримуємо можливість використовувати API Laravel для «прокачаної» і більш зручною відправки листів.

Отже, якою буде порядок настройки?

Для даного способу він буде самим що ні на є примітивним. Досить буде змісту в файлі оточення .env наступного рядка:

MAIL_DRIVER = mail

Відправлення листа в Laravel через sendmail

Скажу чесно, про те, що з sendmail я познайомився порівняно недавно. Рівне тоді, коли дізнався, що в Laravel є можливість відправляти email за допомогою даної штуки.

Тому дозволю зробити невеликий вступ для таких же, як я, про те, що таке sendmail.

Sendmail, як говорить Wikipedia - це один з найдавніших агентів відправки пошти на рівні ОС.
На даним момент існують версія програми для практично під всі операційні системи і апаратні платформи.

Майже у всіх Unix-подібних системах є в базовій комплектації. Для запуску під Windows, наскільки я встиг помітити, потрібно додатково завантажувати.

Розповсюджується безкоштовно у вигляді виконуваного файлу з конфіга і вихідним кодом. Таким чином, для запуску sendmail необхідно буде запустити його виконуваний файл.

Ну, а для відправки пошти в Laravel за допомогою sendmail по-перше, потрібно вказати відповідний драйвер в файлі оточення .env:

MAIL_DRIVER = sendmail

І оскільки відправка email буде здійснюватися за допомогою системної утиліти, то фреймворку необхідно вказати шлях до її виконуваного файлу. Для цього в конфіги /config/mail.php є спеціальний параметр, як значення якого прописуємо шлях до sendmail на сервері (або локальної машині):

'Sendmail' => '/ usr / sbin / sendmail -bs',

В даному прикладі наведено код за замовчуванням, який буде працювати на Unix-подібних системах.

Laravel пошта - запис логів

Наостанок я залишив огляд драйвера відправки пошти в Laravel, за допомогою якого email відправити не вийде. Зате він відмінно підходить для дебага процесу формування і відправлення листа.

Це стає можливим завдяки записи в логи Laravel сформованого тексту email повідомлення, яке зазвичай відправляється додатком на поштову скриньку кінцевого користувача.

Щоб включити дану можливість в Laravel, необхідно виконати примітивну настройку, як і в разі використання PHP mail (). Достатньо всього лише вказати драйвер відправки пошти в .env:

MAIL_DRIVER = log

У підсумку, при якому зазначається вдале надсилання повідомлення ми отримаємо запис в логах наступного формату:

[2017-09-12 8:23:06] local.DEBUG: Message-ID: <[email protected]> Date: Tue, 12 Sep 2017 8:23:06 +0000 Subject: Your Subject From: Sender <receiver @ test.com> To: Receiver <[email protected]> MIME-Version: 1.0 Content-Type: text / plain; charset = utf-8 Content-Transfer-Encoding: quoted-printable Test

Нагадую, що при використанні даного драйвера відправка листа на пошту користувача не проводиться, тому їм користуватися можна тільки при локальної розробці для настройки підсумкового повідомлення, і ні в якому разі не в Production оточенні.

А також, запис проводиться в файл логів Laravel /storage/logs/laravel.log, а не в логи сервера.

Вибираємо оптимальний спосіб відправки email в Laravel

Ну, ось ми і розглянули всі наявні в Laravel драйвера відправки пошти, використання кожного з яких дозволяє виробляти email sending різними способами.

Тепер саме час оцінити достоїнства і недоліки кожного з них і в порівнянні з іншими, щоб виявити найбільш оптимальний для подальшого використання.

Отже, на порядку для у нас відправка email через поштові сервіси по їх API, через SMTP сервера, за допомогою PHP mail () і sendmail. Запис в логи зі зрозумілих причин способом відправки email ми не вважаємо, тому що вона при використанні драйвера log не проводиться. Однак, зовсім ігнорувати використання даного драйвера теж не варто, тому що він є зручним інструментом дебага, і їм рекомендується користуватися перед реальною відправкою пошти, щоб надмірно не навантажувати сервер і поштові сервіси не заблокували ваш сайт, як генератор спаму.

Інша справа, що записи в логах дозволять вам відстежити сам факт оправлення email і виникають при цьому помилок, однак ніяк не допоможуть в корекції верстки шаблону листа. Але, для цього в Laravel є зручний інструмент предпросмотра листи в браузері, про який ми з вами обов'язково поговоримо надалі.

Отже, який же спосіб відправки листів в Laravel нам вибрати?

Відправлення email в Laravel через поштові сервіси за допомогою API і через SMTP сервера - це, по суті, одне і те ж, тому що в обох випадках листи будуть відправлятися не з сервера на якому розташований сайт, а зі стороннього. Єдина відмінність в них - це порядок взаємодії. У першому випадку ви спілкуєтеся з поштовим сервісом через спеціальних API-методів, а в другому - посилаєте запит на сервер для відправки пошти.

Таким чином, при використанні API список можливостей у вас може бути трохи ширше, ніж при відправці email через SMTP. Але, по крайней мере, при стандартному використанні API Laravel для відправки листів і бібліотеки SwiftMailer ми цих можливостей не відчутний.

Також, як стверджують деякі розробники, при відправці листів через SMTP сервер фіксується IP адреса, з якого йде звернення до сервера, що може бути небажано в окремих випадках.

Ну, і при роботі через API швидкість взаємодії може бути злегка вище, ніж при використанні SMTP серверів. За крайній мірі, так стверджує Mailgun . А як воно насправді - чесно кажучи, не перевіряв 🙂 Так що якщо ви маєте в своєму розпорядженні більш точної і повної інформацією з даного приводу, то прошу поділитися їй в коментарях.

Laravel пошта: 5 способів відправки

Всім привіт Всім привіт! 🙂

Ті, хто підписаний на оновлення проекту, і стежить за виходом статей знають, що в минулій публікації ми на прикладі створення форми зворотного зв'язку розглянули реалізацію популярної технології AJAX в Laravel .

У ній ми реалізували відправку запиту серверу і сценарій дій на сайті після отримання відповіді. Залишилося тільки написати скрипт Laravel, що відправляє email повідомлення адміністратору на сервері, замість якого у нас зараз стоїть заглушка у вигляді виведення параметрів запиту.

Зробити це я обіцяв в наступній статті, тобто в поточній. Однак, при підготовці матеріалу прийшов до висновку, що однієї статті буде мало для детального огляду всіх способів Laravel email sending і повноцінної реалізації одного з них.

Тому я вирішив рознести написане на дві частини: повноцінний огляд всіх способів відправки пошти Laravel, який вас сьогодні чекає, і реалізацію відправлення листа одним з них з попутним оглядом методів фасаду Laravel Mail.

Прошу вибачити мене тих, хто налаштовувався побачити відправку пошти сьогодні, але я вважаю, що чиню правильно. Ще спасибі мені скажете 😉

Отже, сьогодні ми розглянемо 5 основних способів відправки email в Laravel і настройку відповідних їм драйверів фреймворка, і я постараюся коротко описати переваги і недоліки кожного з них, після чого виберемо найбільш оптимальний і реалізуємо його в наступній публікації.

Поїхали!

Особливості відправки пошти в Laravel

Оскільки Laravel - PHP framework , То відправити email в коді можна засобами PHP, скориставшись функцією mail (). Або можна взагалі скористатися сторонніми додатками типу sendmail, розгорнувши їх у себе на ПК у вигляді локального поштового сервера.

Ці способи робочі, універсальні і гнучкі в налаштуванні, але на цьому, по правді кажучи, їх переваги закінчуються. Питається - «А що ще потрібно-то?» 🙂 Відповідь більшості розробників буде простий - зручність.

Наприклад, вам хочеться прикрасити свій лист, додавши туди HTML-розмітку і CSS-стилі. Відправлення такого листа за допомогою PHP mail () буде виглядати приблизно так:

<? Php $ to = '[email protected]'; $ Subject = 'Тестове лист з HTML'; $ Message = '<html> <head> <title> Тестове лист з HTML </ title> <meta charset = "utf8"> </ head> <body> <p> Приклад таблиці </ p> <table> <tr > <th> Колонка 1 </ th> <th> Колонка 2 </ th> <th> Колонка 3 </ th> <th> Колонка 4 </ th> </ tr> <tr> <td> Осередок 1 < / td> <td> Осередок 2 </ td> <td> Осередок 3 </ td> <td> Осередок 4 </ td> </ tr> <tr> <td> Осередок 5 </ td> <td> Осередок 6 </ td> <td> Осередок 7 </ td> <td> Осередок 8 </ td> </ tr> </ table> </ body> </ html> '; $ Headers [] = 'MIME-Version: 1.0'; $ Headers [] = 'Content-type: text / html; charset = utf8 '; $ Headers [] = 'To: Receiver <[email protected]>'; $ Headers [] = 'From: Sender <[email protected]>'; $ Headers [] = 'Cc: copy@test.com'; $ Result = mail ($ to, $ subject, $ message, implode ( "\ r \ n", $ headers)); echo $ result? 'OK': 'Error';

Якщо ж скористатися API Laravel, то відправка такого ж повідомлення буде займати всього пару рядків коду:

Mail :: send ( 'emails.test', [], function ($ message) {$ m-> from ('[email protected] ',' Sender '); $ m-> to (' receiver @ test. com ',' Receiver ') -> subject (' Тестове лист з HTML '); $ m-> cc ('[email protected]', '');});

Єдине, HTML код шаблону буде розміщуватися в окремому файлі /resources/views/emails/test.blade.php, який вказаний в якості першого аргументу.

В цілому, як на мене, цей приклад дуже переконливо демонструє зручність API Laravel для відправки email.

До речі, дана АПИ-шка в Laravel реалізована на базі популярної бібліотеки SwiftMailer , Що є компонентом Symfony PHP framework, які дуже люблять використовувати розробники Laravel.

Тому вона вже входить в його комплект з коробки, і ставити її немає потреби.

Єдиний мінус, який я зміг знайти під час налаштування відправки пошти в Laravel через його API, - це рясна часом метушня з настройками і установкою додаткових пакетів, щоб той чи інший спосіб заробив. Але це приватний мінус.

Плюсів ж у порівнянні з нативними методами набагато більше.

По-перше, це - зручність використання.

По-друге, купа примочок у вигляді створення спеціальних Mailable класів, які надають зручність при масових розсилках однотипних листів в різних місцях коду.

По-третє, механізм черг Laravel, що дозволяє відправляти листи порціями через рівні проміжки часу, знижуючи навантаження з сервера і оберігаючи ваш ресурс від бана пошуковими системами і поштовими сервісами за спам.

Але, для використання даних переваг доведеться грати за правилами фреймворка і виробляти настройки відправки пошти певним чином.

Laravel пошта - настройка

Я зараз говорю про використання спеціальних драйверів для різних способів відправки листів в Laravel і експериментів з файлами конфігурацій .env, /config/mail.php і /config/services.php.

Якщо про драйвери ми поговоримо далі, то зі структурою файлів познайомимося зараз.

З коробки в файлі .env вже існує спеціальний блок змінних оточення для налаштувань надсилання електронних листів. Їх легко впізнати по приставці MAIL:

MAIL_DRIVER = smtp MAIL_HOST = smtp.mailtrap.io MAIL_PORT = 2525 MAIL_USERNAME = null MAIL_PASSWORD = null MAIL_ENCRYPTION = null

Ну, а що з приводу /config/mail.php і /config/services.php?

Відкриваємо перший з перерахованих і що ж ми бачимо? Вміст файлів я наводити не буду, тому що у всіх з коробки воно однаково - просто відкрийте їх у себе на комп'ютері.

Практично всі містяться в ньому параметри за замовчуванням беруть свої значення з файлу оточення .env, розташованого в корені сайту, за допомогою Laravel функції-хелпери env ().

Виняток становлять лише такі:

'From' => [ 'address' => '[email protected]', 'name' => 'Example',],

За допомогою даних параметрів у нас є можливість вказати email та ім'я відправника для всіх листів за замовчуванням, що відправляються з нашого Laravel сайту.

З приводу інших параметрів з mail.php - я буду змінювати їх в своєму файлі файлі оточення, тому що якщо я буду правити сам конфиг, то мої налаштування заллються в загальний репозиторій і тільки будуть вас збивати.

Ну, і в файлі services.php ситуація не сильно відрізняється від mail.php: практично всі параметри беруться з .env.

Так що в подальшому я буду правити .env, а ви просто повторюйте за мною. До речі, оскільки для різних способів відправки email в Laravel будуть вимагатися різні змінні з стандартного набору, то ті, які містяться у нас в .env зараз з приставкою MAIL я просто видалю, щоб не плутатися.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку

Ну, а в самі файли конфігурацій mail.php і services.php ми будемо заглядати лише за тим, щоб дізнатися імена необхідних змінних з метою їх додавання або редагування в .env.

Ось на цій ноті ми і переходимо до огляду способів відправки пошти в Ларавел і необхідних для цього налаштувань, де поговоримо про все вищепереліченому вище докладніше.

Відправка листів в Laravel через API поштових сервісів

Перший спосіб відправки email в Laravel, який я вирішив розглянути, це - використання різних поштових сервісів через їх API.

Все, що від вас буде потрібно для його реалізації - це наявність аккаунта Mailgun, Mandrill, SparkPost або Amazon SES (на даним момент Laravel з коробки підтримує тільки їх) і установка необхідного пакету для реалізації сумісності сервісу з Laravel.

До речі, якщо ви там не зареєстровані і не хочете до них прив'язуватися, то пропоную відразу пропустити даний спосіб і спробувати наступні, які більш універсальні.

Налаштування Laravel Mailgun

Для відправки пошти через даний сервіс в першу чергу необхідно встановити в Laravel Guzzle HTTP library. Робити ми це будемо, природно, через пакетний менеджер Composer .

Отже, відкриваємо консоль і переходимо в каталог, де розташований наш Laravel проект. Виконуємо наступну команду:

composer require guzzlehttp / guzzle

В консолі буде описуватися порядок установки. Після успішного завершення все, що нам залишиться для завершення налаштувань - це доповнити файл оточення .env наступним кодом:

MAIL_DRIVER = mailgun MAILGUN_DOMAIN = ваш_домен MAILGUN_SECRET = ваш_ключ

Змінним MAILGUN_DOMAIN і MAILGUN_SECRET потрібно вказати значення, отримані після реєстрації в Mailgun для використання його АПИ.

Налаштування Laravel Mandrill

Для настройки відправки пошти Laravel через даний сервіс процедура буде багато в чому схожа з попереднім. Для початку встановлюємо Guzzle HTTP library.

А потім йдемо в Laravel .env і додаємо наступне:

MAIL_DRIVER = mandrill MANDRILL_SECRET = ваш_ключ

Змінної MANDRILL_SECRET потрібно вказати значення, отримане вами при реєстрації в Mandrill для використання його АПІшкі.

До речі! Процедура настройки Mandrill в офіційній документації Laravel в останній раз була описана для версії Laravel 5.2, але, судячи по коду движка, використання даного сервісу є досі (мабуть, вирішили залишити для роботи старих додатків).

Оскільки в нових версіях фреймворку творці Laravel з якихось причин вирішили відмовитися від Mandrill, то доведеться трохи пошаманити і додати в /config/services.php наступний блок для успішного відправлення листів:

'Mandrill' => [ 'secret' => env ( 'MANDRILL_SECRET'),],

Налаштування Laravel SparkPost

Підтримка даного сервісу, якщо вірити офіційній документації, з'явилася в Laravel 5.3. Тому якщо у вас додаток використовує більш ранню версію фреймворку, то даний спосіб у вас не спрацює. Або поновіть Laravel, або скористайтеся іншим способом (благо, їх вистачає).

Для успішного використання SparkPost нам буде потрібно все та ж Guzzle HTTP library і наступні змінні оточення в файлі .env:

MAIL_DRIVER = sparkpost SPARKPOST_SECRET = ваш_ключ

Налаштування Laravel Amazon SES

Даний поштовий сервіс, як і SparkPost, з'явився в Laravel 5.3, прийшовши на заміну Mandrill. Тому, якщо ви використовуєте більш ранню версію движка, то вам варто або оновитися, або використовувати інший спосіб відправки email в Laravel.

Його настройка буде дещо відрізнятися від попередніх поштових сервісів, тому що для його підтримки в Laravel буде потрібно не знайома вже Guzzle HTTP library, а інший пакет - Amazon AWS SDK for PHP, який встановлюється за допомогою такої команди в консолі:

composer require aws / aws-sdk-php: 3. *

Після установки доповнюємо файл .env наступними змінними оточення:

MAIL_DRIVER = ses SES_KEY = ваш_ключ SES_SECRET = ваш_секретний_ключ

Думаю, і так зрозуміло, що значення ключів вам повинні бути доступні після реєстрації в Amazon SES. До речі, не забудьте перевірити код свого регіону, згенерований Amazon. Якщо він буде не 'us-east-1', то зайдіть в файл /config/services.php і задайте потрібне значення параметру 'ses' [ 'region'].

На цьому огляд підтримуваних Laravel API поштових сервісів добігає кінця. Переходимо до огляду наступного способу відправки пошти.

Відправка пошти в Laravel через SMTP

Думаю, що багато в курсі про протокол передачі пошти SMTP. Так само, багато хто знає, що практично всі сучасні поштові сервіси пропонують свої SMTP-сервера для відправки пошти з сайтів через них.

По суті, попередній спосіб відправки пошти в Laravel через поштові сервіси - це те ж саме, що і поточний. За тим лише винятком, що в першому випадку ми відправляємо листи через API сервісу, а в другому - звертаючись до поштового сервера безпосередньо.

Ну, і при відправленні через SMTP ви можете користуватися будь-яким поштовим сервісом, який надає таку можливість (Gmail, Яндекс Пошта і т.д.), а взаємодію з сервісом по АПИ, ви маєте доступ лише до обраних, які підтримує Laravel. Ось і вся різниця 🙂

Все, що потрібно зробити користувачам, щоб скористатися можливістю відправки листів в Laravel через SMTP - це зареєструватися в сервісі і дізнатися настройки підключення до SMTP-серверу (адреса або доменне ім'я сервера, порт, шифрування і т.д.).

Ну, і ввести їх в Laravel належним чином:

MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 587 MAIL_USERNAME = Ваше_імя_пользователя MAIL_PASSWORD = ваш_пароль MAIL_ENCRYPTION = tls

Вище наведено приклад налаштувань Laravel для відправки пошти через SMTP сервер поштового сервісу Google - Gmail. Я вирішив вибрати саме його, тому що поштову скриньку gmail.com є, напевно, практично у всіх, тому даний спосіб підійде більшості.

Laravel пошта - відправка за допомогою PHP mail ()

Питається - «Що це за нісенітниця?» :-). Навіщо використовувати PHP mail () в якості драйвера для відправки пошти, якщо можна безпосередньо викликати цю функцію в коді? Відповідь все той же, що і раніше - для зручності, тому що при використанні драйвера ми отримуємо можливість використовувати API Laravel для «прокачаної» і більш зручною відправки листів.

Отже, якою буде порядок настройки?

Для даного способу він буде самим що ні на є примітивним. Досить буде змісту в файлі оточення .env наступного рядка:

MAIL_DRIVER = mail

Відправлення листа в Laravel через sendmail

Скажу чесно, про те, що з sendmail я познайомився порівняно недавно. Рівне тоді, коли дізнався, що в Laravel є можливість відправляти email за допомогою даної штуки.

Тому дозволю зробити невеликий вступ для таких же, як я, про те, що таке sendmail.

Sendmail, як говорить Wikipedia - це один з найдавніших агентів відправки пошти на рівні ОС.
На даним момент існують версія програми для практично під всі операційні системи і апаратні платформи.

Майже у всіх Unix-подібних системах є в базовій комплектації. Для запуску під Windows, наскільки я встиг помітити, потрібно додатково завантажувати.

Розповсюджується безкоштовно у вигляді виконуваного файлу з конфіга і вихідним кодом. Таким чином, для запуску sendmail необхідно буде запустити його виконуваний файл.

Ну, а для відправки пошти в Laravel за допомогою sendmail по-перше, потрібно вказати відповідний драйвер в файлі оточення .env:

MAIL_DRIVER = sendmail

І оскільки відправка email буде здійснюватися за допомогою системної утиліти, то фреймворку необхідно вказати шлях до її виконуваного файлу. Для цього в конфіги /config/mail.php є спеціальний параметр, як значення якого прописуємо шлях до sendmail на сервері (або локальної машині):

'Sendmail' => '/ usr / sbin / sendmail -bs',

В даному прикладі наведено код за замовчуванням, який буде працювати на Unix-подібних системах.

Laravel пошта - запис логів

Наостанок я залишив огляд драйвера відправки пошти в Laravel, за допомогою якого email відправити не вийде. Зате він відмінно підходить для дебага процесу формування і відправлення листа.

Це стає можливим завдяки записи в логи Laravel сформованого тексту email повідомлення, яке зазвичай відправляється додатком на поштову скриньку кінцевого користувача.

Щоб включити дану можливість в Laravel, необхідно виконати примітивну настройку, як і в разі використання PHP mail (). Достатньо всього лише вказати драйвер відправки пошти в .env:

MAIL_DRIVER = log

У підсумку, при якому зазначається вдале надсилання повідомлення ми отримаємо запис в логах наступного формату:

[2017-09-12 8:23:06] local.DEBUG: Message-ID: <[email protected]> Date: Tue, 12 Sep 2017 8:23:06 +0000 Subject: Your Subject From: Sender <receiver @ test.com> To: Receiver <[email protected]> MIME-Version: 1.0 Content-Type: text / plain; charset = utf-8 Content-Transfer-Encoding: quoted-printable Test

Нагадую, що при використанні даного драйвера відправка листа на пошту користувача не проводиться, тому їм користуватися можна тільки при локальної розробці для настройки підсумкового повідомлення, і ні в якому разі не в Production оточенні.

А також, запис проводиться в файл логів Laravel /storage/logs/laravel.log, а не в логи сервера.

Вибираємо оптимальний спосіб відправки email в Laravel

Ну, ось ми і розглянули всі наявні в Laravel драйвера відправки пошти, використання кожного з яких дозволяє виробляти email sending різними способами.

Тепер саме час оцінити достоїнства і недоліки кожного з них і в порівнянні з іншими, щоб виявити найбільш оптимальний для подальшого використання.

Отже, на порядку для у нас відправка email через поштові сервіси по їх API, через SMTP сервера, за допомогою PHP mail () і sendmail. Запис в логи зі зрозумілих причин способом відправки email ми не вважаємо, тому що вона при використанні драйвера log не проводиться. Однак, зовсім ігнорувати використання даного драйвера теж не варто, тому що він є зручним інструментом дебага, і їм рекомендується користуватися перед реальною відправкою пошти, щоб надмірно не навантажувати сервер і поштові сервіси не заблокували ваш сайт, як генератор спаму.

Інша справа, що записи в логах дозволять вам відстежити сам факт оправлення email і виникають при цьому помилок, однак ніяк не допоможуть в корекції верстки шаблону листа. Але, для цього в Laravel є зручний інструмент предпросмотра листи в браузері, про який ми з вами обов'язково поговоримо надалі.

Отже, який же спосіб відправки листів в Laravel нам вибрати?

Відправлення email в Laravel через поштові сервіси за допомогою API і через SMTP сервера - це, по суті, одне і те ж, тому що в обох випадках листи будуть відправлятися не з сервера на якому розташований сайт, а зі стороннього. Єдина відмінність в них - це порядок взаємодії. У першому випадку ви спілкуєтеся з поштовим сервісом через спеціальних API-методів, а в другому - посилаєте запит на сервер для відправки пошти.

Таким чином, при використанні API список можливостей у вас може бути трохи ширше, ніж при відправці email через SMTP. Але, по крайней мере, при стандартному використанні API Laravel для відправки листів і бібліотеки SwiftMailer ми цих можливостей не відчутний.

Також, як стверджують деякі розробники, при відправці листів через SMTP сервер фіксується IP адреса, з якого йде звернення до сервера, що може бути небажано в окремих випадках.

Ну, і при роботі через API швидкість взаємодії може бути злегка вище, ніж при використанні SMTP серверів. За крайній мірі, так стверджує Mailgun . А як воно насправді - чесно кажучи, не перевіряв 🙂 Так що якщо ви маєте в своєму розпорядженні більш точної і повної інформацією з даного приводу, то прошу поділитися їй в коментарях.

Laravel пошта: 5 способів відправки

Всім привіт Всім привіт! 🙂

Ті, хто підписаний на оновлення проекту, і стежить за виходом статей знають, що в минулій публікації ми на прикладі створення форми зворотного зв'язку розглянули реалізацію популярної технології AJAX в Laravel .

У ній ми реалізували відправку запиту серверу і сценарій дій на сайті після отримання відповіді. Залишилося тільки написати скрипт Laravel, що відправляє email повідомлення адміністратору на сервері, замість якого у нас зараз стоїть заглушка у вигляді виведення параметрів запиту.

Зробити це я обіцяв в наступній статті, тобто в поточній. Однак, при підготовці матеріалу прийшов до висновку, що однієї статті буде мало для детального огляду всіх способів Laravel email sending і повноцінної реалізації одного з них.

Тому я вирішив рознести написане на дві частини: повноцінний огляд всіх способів відправки пошти Laravel, який вас сьогодні чекає, і реалізацію відправлення листа одним з них з попутним оглядом методів фасаду Laravel Mail.

Прошу вибачити мене тих, хто налаштовувався побачити відправку пошти сьогодні, але я вважаю, що чиню правильно. Ще спасибі мені скажете 😉

Отже, сьогодні ми розглянемо 5 основних способів відправки email в Laravel і настройку відповідних їм драйверів фреймворка, і я постараюся коротко описати переваги і недоліки кожного з них, після чого виберемо найбільш оптимальний і реалізуємо його в наступній публікації.

Поїхали!

Особливості відправки пошти в Laravel

Оскільки Laravel - PHP framework , То відправити email в коді можна засобами PHP, скориставшись функцією mail (). Або можна взагалі скористатися сторонніми додатками типу sendmail, розгорнувши їх у себе на ПК у вигляді локального поштового сервера.

Ці способи робочі, універсальні і гнучкі в налаштуванні, але на цьому, по правді кажучи, їх переваги закінчуються. Питається - «А що ще потрібно-то?» 🙂 Відповідь більшості розробників буде простий - зручність.

Наприклад, вам хочеться прикрасити свій лист, додавши туди HTML-розмітку і CSS-стилі. Відправлення такого листа за допомогою PHP mail () буде виглядати приблизно так:

<? Php $ to = '[email protected]'; $ Subject = 'Тестове лист з HTML'; $ Message = '<html> <head> <title> Тестове лист з HTML </ title> <meta charset = "utf8"> </ head> <body> <p> Приклад таблиці </ p> <table> <tr > <th> Колонка 1 </ th> <th> Колонка 2 </ th> <th> Колонка 3 </ th> <th> Колонка 4 </ th> </ tr> <tr> <td> Осередок 1 < / td> <td> Осередок 2 </ td> <td> Осередок 3 </ td> <td> Осередок 4 </ td> </ tr> <tr> <td> Осередок 5 </ td> <td> Осередок 6 </ td> <td> Осередок 7 </ td> <td> Осередок 8 </ td> </ tr> </ table> </ body> </ html> '; $ Headers [] = 'MIME-Version: 1.0'; $ Headers [] = 'Content-type: text / html; charset = utf8 '; $ Headers [] = 'To: Receiver <[email protected]>'; $ Headers [] = 'From: Sender <[email protected]>'; $ Headers [] = 'Cc: copy@test.com'; $ Result = mail ($ to, $ subject, $ message, implode ( "\ r \ n", $ headers)); echo $ result? 'OK': 'Error';

Якщо ж скористатися API Laravel, то відправка такого ж повідомлення буде займати всього пару рядків коду:

Mail :: send ( 'emails.test', [], function ($ message) {$ m-> from ('[email protected] ',' Sender '); $ m-> to (' receiver @ test. com ',' Receiver ') -> subject (' Тестове лист з HTML '); $ m-> cc ('[email protected]', '');});

Єдине, HTML код шаблону буде розміщуватися в окремому файлі /resources/views/emails/test.blade.php, який вказаний в якості першого аргументу.

В цілому, як на мене, цей приклад дуже переконливо демонструє зручність API Laravel для відправки email.

До речі, дана АПИ-шка в Laravel реалізована на базі популярної бібліотеки SwiftMailer , Що є компонентом Symfony PHP framework, які дуже люблять використовувати розробники Laravel.

Тому вона вже входить в його комплект з коробки, і ставити її немає потреби.

Єдиний мінус, який я зміг знайти під час налаштування відправки пошти в Laravel через його API, - це рясна часом метушня з настройками і установкою додаткових пакетів, щоб той чи інший спосіб заробив. Але це приватний мінус.

Плюсів ж у порівнянні з нативними методами набагато більше.

По-перше, це - зручність використання.

По-друге, купа примочок у вигляді створення спеціальних Mailable класів, які надають зручність при масових розсилках однотипних листів в різних місцях коду.

По-третє, механізм черг Laravel, що дозволяє відправляти листи порціями через рівні проміжки часу, знижуючи навантаження з сервера і оберігаючи ваш ресурс від бана пошуковими системами і поштовими сервісами за спам.

Але, для використання даних переваг доведеться грати за правилами фреймворка і виробляти настройки відправки пошти певним чином.

Laravel пошта - настройка

Я зараз говорю про використання спеціальних драйверів для різних способів відправки листів в Laravel і експериментів з файлами конфігурацій .env, /config/mail.php і /config/services.php.

Якщо про драйвери ми поговоримо далі, то зі структурою файлів познайомимося зараз.

З коробки в файлі .env вже існує спеціальний блок змінних оточення для налаштувань надсилання електронних листів. Їх легко впізнати по приставці MAIL:

MAIL_DRIVER = smtp MAIL_HOST = smtp.mailtrap.io MAIL_PORT = 2525 MAIL_USERNAME = null MAIL_PASSWORD = null MAIL_ENCRYPTION = null

Ну, а що з приводу /config/mail.php і /config/services.php?

Відкриваємо перший з перерахованих і що ж ми бачимо? Вміст файлів я наводити не буду, тому що у всіх з коробки воно однаково - просто відкрийте їх у себе на комп'ютері.

Практично всі містяться в ньому параметри за замовчуванням беруть свої значення з файлу оточення .env, розташованого в корені сайту, за допомогою Laravel функції-хелпери env ().

Виняток становлять лише такі:

'From' => [ 'address' => '[email protected]', 'name' => 'Example',],

За допомогою даних параметрів у нас є можливість вказати email та ім'я відправника для всіх листів за замовчуванням, що відправляються з нашого Laravel сайту.

З приводу інших параметрів з mail.php - я буду змінювати їх в своєму файлі файлі оточення, тому що якщо я буду правити сам конфиг, то мої налаштування заллються в загальний репозиторій і тільки будуть вас збивати.

Ну, і в файлі services.php ситуація не сильно відрізняється від mail.php: практично всі параметри беруться з .env.

Так що в подальшому я буду правити .env, а ви просто повторюйте за мною. До речі, оскільки для різних способів відправки email в Laravel будуть вимагатися різні змінні з стандартного набору, то ті, які містяться у нас в .env зараз з приставкою MAIL я просто видалю, щоб не плутатися.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку

Ну, а в самі файли конфігурацій mail.php і services.php ми будемо заглядати лише за тим, щоб дізнатися імена необхідних змінних з метою їх додавання або редагування в .env.

Ось на цій ноті ми і переходимо до огляду способів відправки пошти в Ларавел і необхідних для цього налаштувань, де поговоримо про все вищепереліченому вище докладніше.

Відправка листів в Laravel через API поштових сервісів

Перший спосіб відправки email в Laravel, який я вирішив розглянути, це - використання різних поштових сервісів через їх API.

Все, що від вас буде потрібно для його реалізації - це наявність аккаунта Mailgun, Mandrill, SparkPost або Amazon SES (на даним момент Laravel з коробки підтримує тільки їх) і установка необхідного пакету для реалізації сумісності сервісу з Laravel.

До речі, якщо ви там не зареєстровані і не хочете до них прив'язуватися, то пропоную відразу пропустити даний спосіб і спробувати наступні, які більш універсальні.

Налаштування Laravel Mailgun

Для відправки пошти через даний сервіс в першу чергу необхідно встановити в Laravel Guzzle HTTP library. Робити ми це будемо, природно, через пакетний менеджер Composer .

Отже, відкриваємо консоль і переходимо в каталог, де розташований наш Laravel проект. Виконуємо наступну команду:

composer require guzzlehttp / guzzle

В консолі буде описуватися порядок установки. Після успішного завершення все, що нам залишиться для завершення налаштувань - це доповнити файл оточення .env наступним кодом:

MAIL_DRIVER = mailgun MAILGUN_DOMAIN = ваш_домен MAILGUN_SECRET = ваш_ключ

Змінним MAILGUN_DOMAIN і MAILGUN_SECRET потрібно вказати значення, отримані після реєстрації в Mailgun для використання його АПИ.

Налаштування Laravel Mandrill

Для настройки відправки пошти Laravel через даний сервіс процедура буде багато в чому схожа з попереднім. Для початку встановлюємо Guzzle HTTP library.

А потім йдемо в Laravel .env і додаємо наступне:

MAIL_DRIVER = mandrill MANDRILL_SECRET = ваш_ключ

Змінної MANDRILL_SECRET потрібно вказати значення, отримане вами при реєстрації в Mandrill для використання його АПІшкі.

До речі! Процедура настройки Mandrill в офіційній документації Laravel в останній раз була описана для версії Laravel 5.2, але, судячи по коду движка, використання даного сервісу є досі (мабуть, вирішили залишити для роботи старих додатків).

Оскільки в нових версіях фреймворку творці Laravel з якихось причин вирішили відмовитися від Mandrill, то доведеться трохи пошаманити і додати в /config/services.php наступний блок для успішного відправлення листів:

'Mandrill' => [ 'secret' => env ( 'MANDRILL_SECRET'),],

Налаштування Laravel SparkPost

Підтримка даного сервісу, якщо вірити офіційній документації, з'явилася в Laravel 5.3. Тому якщо у вас додаток використовує більш ранню версію фреймворку, то даний спосіб у вас не спрацює. Або поновіть Laravel, або скористайтеся іншим способом (благо, їх вистачає).

Для успішного використання SparkPost нам буде потрібно все та ж Guzzle HTTP library і наступні змінні оточення в файлі .env:

MAIL_DRIVER = sparkpost SPARKPOST_SECRET = ваш_ключ

Налаштування Laravel Amazon SES

Даний поштовий сервіс, як і SparkPost, з'явився в Laravel 5.3, прийшовши на заміну Mandrill. Тому, якщо ви використовуєте більш ранню версію движка, то вам варто або оновитися, або використовувати інший спосіб відправки email в Laravel.

Його настройка буде дещо відрізнятися від попередніх поштових сервісів, тому що для його підтримки в Laravel буде потрібно не знайома вже Guzzle HTTP library, а інший пакет - Amazon AWS SDK for PHP, який встановлюється за допомогою такої команди в консолі:

composer require aws / aws-sdk-php: 3. *

Після установки доповнюємо файл .env наступними змінними оточення:

MAIL_DRIVER = ses SES_KEY = ваш_ключ SES_SECRET = ваш_секретний_ключ

Думаю, і так зрозуміло, що значення ключів вам повинні бути доступні після реєстрації в Amazon SES. До речі, не забудьте перевірити код свого регіону, згенерований Amazon. Якщо він буде не 'us-east-1', то зайдіть в файл /config/services.php і задайте потрібне значення параметру 'ses' [ 'region'].

На цьому огляд підтримуваних Laravel API поштових сервісів добігає кінця. Переходимо до огляду наступного способу відправки пошти.

Відправка пошти в Laravel через SMTP

Думаю, що багато в курсі про протокол передачі пошти SMTP. Так само, багато хто знає, що практично всі сучасні поштові сервіси пропонують свої SMTP-сервера для відправки пошти з сайтів через них.

По суті, попередній спосіб відправки пошти в Laravel через поштові сервіси - це те ж саме, що і поточний. За тим лише винятком, що в першому випадку ми відправляємо листи через API сервісу, а в другому - звертаючись до поштового сервера безпосередньо.

Ну, і при відправленні через SMTP ви можете користуватися будь-яким поштовим сервісом, який надає таку можливість (Gmail, Яндекс Пошта і т.д.), а взаємодію з сервісом по АПИ, ви маєте доступ лише до обраних, які підтримує Laravel. Ось і вся різниця 🙂

Все, що потрібно зробити користувачам, щоб скористатися можливістю відправки листів в Laravel через SMTP - це зареєструватися в сервісі і дізнатися настройки підключення до SMTP-серверу (адреса або доменне ім'я сервера, порт, шифрування і т.д.).

Ну, і ввести їх в Laravel належним чином:

MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 587 MAIL_USERNAME = Ваше_імя_пользователя MAIL_PASSWORD = ваш_пароль MAIL_ENCRYPTION = tls

Вище наведено приклад налаштувань Laravel для відправки пошти через SMTP сервер поштового сервісу Google - Gmail. Я вирішив вибрати саме його, тому що поштову скриньку gmail.com є, напевно, практично у всіх, тому даний спосіб підійде більшості.

Laravel пошта - відправка за допомогою PHP mail ()

Питається - «Що це за нісенітниця?» :-). Навіщо використовувати PHP mail () в якості драйвера для відправки пошти, якщо можна безпосередньо викликати цю функцію в коді? Відповідь все той же, що і раніше - для зручності, тому що при використанні драйвера ми отримуємо можливість використовувати API Laravel для «прокачаної» і більш зручною відправки листів.

Отже, якою буде порядок настройки?

Для даного способу він буде самим що ні на є примітивним. Досить буде змісту в файлі оточення .env наступного рядка:

MAIL_DRIVER = mail

Відправлення листа в Laravel через sendmail

Скажу чесно, про те, що з sendmail я познайомився порівняно недавно. Рівне тоді, коли дізнався, що в Laravel є можливість відправляти email за допомогою даної штуки.

Тому дозволю зробити невеликий вступ для таких же, як я, про те, що таке sendmail.

Sendmail, як говорить Wikipedia - це один з найдавніших агентів відправки пошти на рівні ОС.
На даним момент існують версія програми для практично під всі операційні системи і апаратні платформи.

Майже у всіх Unix-подібних системах є в базовій комплектації. Для запуску під Windows, наскільки я встиг помітити, потрібно додатково завантажувати.

Розповсюджується безкоштовно у вигляді виконуваного файлу з конфіга і вихідним кодом. Таким чином, для запуску sendmail необхідно буде запустити його виконуваний файл.

Ну, а для відправки пошти в Laravel за допомогою sendmail по-перше, потрібно вказати відповідний драйвер в файлі оточення .env:

MAIL_DRIVER = sendmail

І оскільки відправка email буде здійснюватися за допомогою системної утиліти, то фреймворку необхідно вказати шлях до її виконуваного файлу. Для цього в конфіги /config/mail.php є спеціальний параметр, як значення якого прописуємо шлях до sendmail на сервері (або локальної машині):

'Sendmail' => '/ usr / sbin / sendmail -bs',

В даному прикладі наведено код за замовчуванням, який буде працювати на Unix-подібних системах.

Laravel пошта - запис логів

Наостанок я залишив огляд драйвера відправки пошти в Laravel, за допомогою якого email відправити не вийде. Зате він відмінно підходить для дебага процесу формування і відправлення листа.

Це стає можливим завдяки записи в логи Laravel сформованого тексту email повідомлення, яке зазвичай відправляється додатком на поштову скриньку кінцевого користувача.

Щоб включити дану можливість в Laravel, необхідно виконати примітивну настройку, як і в разі використання PHP mail (). Достатньо всього лише вказати драйвер відправки пошти в .env:

MAIL_DRIVER = log

У підсумку, при якому зазначається вдале надсилання повідомлення ми отримаємо запис в логах наступного формату:

[2017-09-12 8:23:06] local.DEBUG: Message-ID: <[email protected]> Date: Tue, 12 Sep 2017 8:23:06 +0000 Subject: Your Subject From: Sender <receiver @ test.com> To: Receiver <[email protected]> MIME-Version: 1.0 Content-Type: text / plain; charset = utf-8 Content-Transfer-Encoding: quoted-printable Test

Нагадую, що при використанні даного драйвера відправка листа на пошту користувача не проводиться, тому їм користуватися можна тільки при локальної розробці для настройки підсумкового повідомлення, і ні в якому разі не в Production оточенні.

А також, запис проводиться в файл логів Laravel /storage/logs/laravel.log, а не в логи сервера.

Вибираємо оптимальний спосіб відправки email в Laravel

Ну, ось ми і розглянули всі наявні в Laravel драйвера відправки пошти, використання кожного з яких дозволяє виробляти email sending різними способами.

Тепер саме час оцінити достоїнства і недоліки кожного з них і в порівнянні з іншими, щоб виявити найбільш оптимальний для подальшого використання.

Отже, на порядку для у нас відправка email через поштові сервіси по їх API, через SMTP сервера, за допомогою PHP mail () і sendmail. Запис в логи зі зрозумілих причин способом відправки email ми не вважаємо, тому що вона при використанні драйвера log не проводиться. Однак, зовсім ігнорувати використання даного драйвера теж не варто, тому що він є зручним інструментом дебага, і їм рекомендується користуватися перед реальною відправкою пошти, щоб надмірно не навантажувати сервер і поштові сервіси не заблокували ваш сайт, як генератор спаму.

Інша справа, що записи в логах дозволять вам відстежити сам факт оправлення email і виникають при цьому помилок, однак ніяк не допоможуть в корекції верстки шаблону листа. Але, для цього в Laravel є зручний інструмент предпросмотра листи в браузері, про який ми з вами обов'язково поговоримо надалі.

Отже, який же спосіб відправки листів в Laravel нам вибрати?

Відправлення email в Laravel через поштові сервіси за допомогою API і через SMTP сервера - це, по суті, одне і те ж, тому що в обох випадках листи будуть відправлятися не з сервера на якому розташований сайт, а зі стороннього. Єдина відмінність в них - це порядок взаємодії. У першому випадку ви спілкуєтеся з поштовим сервісом через спеціальних API-методів, а в другому - посилаєте запит на сервер для відправки пошти.

Таким чином, при використанні API список можливостей у вас може бути трохи ширше, ніж при відправці email через SMTP. Але, по крайней мере, при стандартному використанні API Laravel для відправки листів і бібліотеки SwiftMailer ми цих можливостей не відчутний.

Також, як стверджують деякі розробники, при відправці листів через SMTP сервер фіксується IP адреса, з якого йде звернення до сервера, що може бути небажано в окремих випадках.

Ну, і при роботі через API швидкість взаємодії може бути злегка вище, ніж при використанні SMTP серверів. За крайній мірі, так стверджує Mailgun . А як воно насправді - чесно кажучи, не перевіряв 🙂 Так що якщо ви маєте в своєму розпорядженні більш точної і повної інформацією з даного приводу, то прошу поділитися їй в коментарях.

Laravel пошта: 5 способів відправки

Всім привіт Всім привіт! 🙂

Ті, хто підписаний на оновлення проекту, і стежить за виходом статей знають, що в минулій публікації ми на прикладі створення форми зворотного зв'язку розглянули реалізацію популярної технології AJAX в Laravel .

У ній ми реалізували відправку запиту серверу і сценарій дій на сайті після отримання відповіді. Залишилося тільки написати скрипт Laravel, що відправляє email повідомлення адміністратору на сервері, замість якого у нас зараз стоїть заглушка у вигляді виведення параметрів запиту.

Зробити це я обіцяв в наступній статті, тобто в поточній. Однак, при підготовці матеріалу прийшов до висновку, що однієї статті буде мало для детального огляду всіх способів Laravel email sending і повноцінної реалізації одного з них.

Тому я вирішив рознести написане на дві частини: повноцінний огляд всіх способів відправки пошти Laravel, який вас сьогодні чекає, і реалізацію відправлення листа одним з них з попутним оглядом методів фасаду Laravel Mail.

Прошу вибачити мене тих, хто налаштовувався побачити відправку пошти сьогодні, але я вважаю, що чиню правильно. Ще спасибі мені скажете 😉

Отже, сьогодні ми розглянемо 5 основних способів відправки email в Laravel і настройку відповідних їм драйверів фреймворка, і я постараюся коротко описати переваги і недоліки кожного з них, після чого виберемо найбільш оптимальний і реалізуємо його в наступній публікації.

Поїхали!

Особливості відправки пошти в Laravel

Оскільки Laravel - PHP framework , То відправити email в коді можна засобами PHP, скориставшись функцією mail (). Або можна взагалі скористатися сторонніми додатками типу sendmail, розгорнувши їх у себе на ПК у вигляді локального поштового сервера.

Ці способи робочі, універсальні і гнучкі в налаштуванні, але на цьому, по правді кажучи, їх переваги закінчуються. Питається - «А що ще потрібно-то?» 🙂 Відповідь більшості розробників буде простий - зручність.

Наприклад, вам хочеться прикрасити свій лист, додавши туди HTML-розмітку і CSS-стилі. Відправлення такого листа за допомогою PHP mail () буде виглядати приблизно так:

<? Php $ to = '[email protected]'; $ Subject = 'Тестове лист з HTML'; $ Message = '<html> <head> <title> Тестове лист з HTML </ title> <meta charset = "utf8"> </ head> <body> <p> Приклад таблиці </ p> <table> <tr > <th> Колонка 1 </ th> <th> Колонка 2 </ th> <th> Колонка 3 </ th> <th> Колонка 4 </ th> </ tr> <tr> <td> Осередок 1 < / td> <td> Осередок 2 </ td> <td> Осередок 3 </ td> <td> Осередок 4 </ td> </ tr> <tr> <td> Осередок 5 </ td> <td> Осередок 6 </ td> <td> Осередок 7 </ td> <td> Осередок 8 </ td> </ tr> </ table> </ body> </ html> '; $ Headers [] = 'MIME-Version: 1.0'; $ Headers [] = 'Content-type: text / html; charset = utf8 '; $ Headers [] = 'To: Receiver <[email protected]>'; $ Headers [] = 'From: Sender <[email protected]>'; $ Headers [] = 'Cc: copy@test.com'; $ Result = mail ($ to, $ subject, $ message, implode ( "\ r \ n", $ headers)); echo $ result? 'OK': 'Error';

Якщо ж скористатися API Laravel, то відправка такого ж повідомлення буде займати всього пару рядків коду:

Mail :: send ( 'emails.test', [], function ($ message) {$ m-> from ('[email protected] ',' Sender '); $ m-> to (' receiver @ test. com ',' Receiver ') -> subject (' Тестове лист з HTML '); $ m-> cc ('[email protected]', '');});

Єдине, HTML код шаблону буде розміщуватися в окремому файлі /resources/views/emails/test.blade.php, який вказаний в якості першого аргументу.

В цілому, як на мене, цей приклад дуже переконливо демонструє зручність API Laravel для відправки email.

До речі, дана АПИ-шка в Laravel реалізована на базі популярної бібліотеки SwiftMailer , Що є компонентом Symfony PHP framework, які дуже люблять використовувати розробники Laravel.

Тому вона вже входить в його комплект з коробки, і ставити її немає потреби.

Єдиний мінус, який я зміг знайти під час налаштування відправки пошти в Laravel через його API, - це рясна часом метушня з настройками і установкою додаткових пакетів, щоб той чи інший спосіб заробив. Але це приватний мінус.

Плюсів ж у порівнянні з нативними методами набагато більше.

По-перше, це - зручність використання.

По-друге, купа примочок у вигляді створення спеціальних Mailable класів, які надають зручність при масових розсилках однотипних листів в різних місцях коду.

По-третє, механізм черг Laravel, що дозволяє відправляти листи порціями через рівні проміжки часу, знижуючи навантаження з сервера і оберігаючи ваш ресурс від бана пошуковими системами і поштовими сервісами за спам.

Але, для використання даних переваг доведеться грати за правилами фреймворка і виробляти настройки відправки пошти певним чином.

Laravel пошта - настройка

Я зараз говорю про використання спеціальних драйверів для різних способів відправки листів в Laravel і експериментів з файлами конфігурацій .env, /config/mail.php і /config/services.php.

Якщо про драйвери ми поговоримо далі, то зі структурою файлів познайомимося зараз.

З коробки в файлі .env вже існує спеціальний блок змінних оточення для налаштувань надсилання електронних листів. Їх легко впізнати по приставці MAIL:

MAIL_DRIVER = smtp MAIL_HOST = smtp.mailtrap.io MAIL_PORT = 2525 MAIL_USERNAME = null MAIL_PASSWORD = null MAIL_ENCRYPTION = null

Ну, а що з приводу /config/mail.php і /config/services.php?

Відкриваємо перший з перерахованих і що ж ми бачимо? Вміст файлів я наводити не буду, тому що у всіх з коробки воно однаково - просто відкрийте їх у себе на комп'ютері.

Практично всі містяться в ньому параметри за замовчуванням беруть свої значення з файлу оточення .env, розташованого в корені сайту, за допомогою Laravel функції-хелпери env ().

Виняток становлять лише такі:

'From' => [ 'address' => '[email protected]', 'name' => 'Example',],

За допомогою даних параметрів у нас є можливість вказати email та ім'я відправника для всіх листів за замовчуванням, що відправляються з нашого Laravel сайту.

З приводу інших параметрів з mail.php - я буду змінювати їх в своєму файлі файлі оточення, тому що якщо я буду правити сам конфиг, то мої налаштування заллються в загальний репозиторій і тільки будуть вас збивати.

Ну, і в файлі services.php ситуація не сильно відрізняється від mail.php: практично всі параметри беруться з .env.

Так що в подальшому я буду правити .env, а ви просто повторюйте за мною. До речі, оскільки для різних способів відправки email в Laravel будуть вимагатися різні змінні з стандартного набору, то ті, які містяться у нас в .env зараз з приставкою MAIL я просто видалю, щоб не плутатися.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку

Ну, а в самі файли конфігурацій mail.php і services.php ми будемо заглядати лише за тим, щоб дізнатися імена необхідних змінних з метою їх додавання або редагування в .env.

Ось на цій ноті ми і переходимо до огляду способів відправки пошти в Ларавел і необхідних для цього налаштувань, де поговоримо про все вищепереліченому вище докладніше.

Відправка листів в Laravel через API поштових сервісів

Перший спосіб відправки email в Laravel, який я вирішив розглянути, це - використання різних поштових сервісів через їх API.

Все, що від вас буде потрібно для його реалізації - це наявність аккаунта Mailgun, Mandrill, SparkPost або Amazon SES (на даним момент Laravel з коробки підтримує тільки їх) і установка необхідного пакету для реалізації сумісності сервісу з Laravel.

До речі, якщо ви там не зареєстровані і не хочете до них прив'язуватися, то пропоную відразу пропустити даний спосіб і спробувати наступні, які більш універсальні.

Налаштування Laravel Mailgun

Для відправки пошти через даний сервіс в першу чергу необхідно встановити в Laravel Guzzle HTTP library. Робити ми це будемо, природно, через пакетний менеджер Composer .

Отже, відкриваємо консоль і переходимо в каталог, де розташований наш Laravel проект. Виконуємо наступну команду:

composer require guzzlehttp / guzzle

В консолі буде описуватися порядок установки. Після успішного завершення все, що нам залишиться для завершення налаштувань - це доповнити файл оточення .env наступним кодом:

MAIL_DRIVER = mailgun MAILGUN_DOMAIN = ваш_домен MAILGUN_SECRET = ваш_ключ

Змінним MAILGUN_DOMAIN і MAILGUN_SECRET потрібно вказати значення, отримані після реєстрації в Mailgun для використання його АПИ.

Налаштування Laravel Mandrill

Для настройки відправки пошти Laravel через даний сервіс процедура буде багато в чому схожа з попереднім. Для початку встановлюємо Guzzle HTTP library.

А потім йдемо в Laravel .env і додаємо наступне:

MAIL_DRIVER = mandrill MANDRILL_SECRET = ваш_ключ

Змінної MANDRILL_SECRET потрібно вказати значення, отримане вами при реєстрації в Mandrill для використання його АПІшкі.

До речі! Процедура настройки Mandrill в офіційній документації Laravel в останній раз була описана для версії Laravel 5.2, але, судячи по коду движка, використання даного сервісу є досі (мабуть, вирішили залишити для роботи старих додатків).

Оскільки в нових версіях фреймворку творці Laravel з якихось причин вирішили відмовитися від Mandrill, то доведеться трохи пошаманити і додати в /config/services.php наступний блок для успішного відправлення листів:

'Mandrill' => [ 'secret' => env ( 'MANDRILL_SECRET'),],

Налаштування Laravel SparkPost

Підтримка даного сервісу, якщо вірити офіційній документації, з'явилася в Laravel 5.3. Тому якщо у вас додаток використовує більш ранню версію фреймворку, то даний спосіб у вас не спрацює. Або поновіть Laravel, або скористайтеся іншим способом (благо, їх вистачає).

Для успішного використання SparkPost нам буде потрібно все та ж Guzzle HTTP library і наступні змінні оточення в файлі .env:

MAIL_DRIVER = sparkpost SPARKPOST_SECRET = ваш_ключ

Налаштування Laravel Amazon SES

Даний поштовий сервіс, як і SparkPost, з'явився в Laravel 5.3, прийшовши на заміну Mandrill. Тому, якщо ви використовуєте більш ранню версію движка, то вам варто або оновитися, або використовувати інший спосіб відправки email в Laravel.

Його настройка буде дещо відрізнятися від попередніх поштових сервісів, тому що для його підтримки в Laravel буде потрібно не знайома вже Guzzle HTTP library, а інший пакет - Amazon AWS SDK for PHP, який встановлюється за допомогою такої команди в консолі:

composer require aws / aws-sdk-php: 3. *

Після установки доповнюємо файл .env наступними змінними оточення:

MAIL_DRIVER = ses SES_KEY = ваш_ключ SES_SECRET = ваш_секретний_ключ

Думаю, і так зрозуміло, що значення ключів вам повинні бути доступні після реєстрації в Amazon SES. До речі, не забудьте перевірити код свого регіону, згенерований Amazon. Якщо він буде не 'us-east-1', то зайдіть в файл /config/services.php і задайте потрібне значення параметру 'ses' [ 'region'].

На цьому огляд підтримуваних Laravel API поштових сервісів добігає кінця. Переходимо до огляду наступного способу відправки пошти.

Відправка пошти в Laravel через SMTP

Думаю, що багато в курсі про протокол передачі пошти SMTP. Так само, багато хто знає, що практично всі сучасні поштові сервіси пропонують свої SMTP-сервера для відправки пошти з сайтів через них.

По суті, попередній спосіб відправки пошти в Laravel через поштові сервіси - це те ж саме, що і поточний. За тим лише винятком, що в першому випадку ми відправляємо листи через API сервісу, а в другому - звертаючись до поштового сервера безпосередньо.

Ну, і при відправленні через SMTP ви можете користуватися будь-яким поштовим сервісом, який надає таку можливість (Gmail, Яндекс Пошта і т.д.), а взаємодію з сервісом по АПИ, ви маєте доступ лише до обраних, які підтримує Laravel. Ось і вся різниця 🙂

Все, що потрібно зробити користувачам, щоб скористатися можливістю відправки листів в Laravel через SMTP - це зареєструватися в сервісі і дізнатися настройки підключення до SMTP-серверу (адреса або доменне ім'я сервера, порт, шифрування і т.д.).

Ну, і ввести їх в Laravel належним чином:

MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 587 MAIL_USERNAME = Ваше_імя_пользователя MAIL_PASSWORD = ваш_пароль MAIL_ENCRYPTION = tls

Вище наведено приклад налаштувань Laravel для відправки пошти через SMTP сервер поштового сервісу Google - Gmail. Я вирішив вибрати саме його, тому що поштову скриньку gmail.com є, напевно, практично у всіх, тому даний спосіб підійде більшості.

Laravel пошта - відправка за допомогою PHP mail ()

Питається - «Що це за нісенітниця?» :-). Навіщо використовувати PHP mail () в якості драйвера для відправки пошти, якщо можна безпосередньо викликати цю функцію в коді? Відповідь все той же, що і раніше - для зручності, тому що при використанні драйвера ми отримуємо можливість використовувати API Laravel для «прокачаної» і більш зручною відправки листів.

Отже, якою буде порядок настройки?

Для даного способу він буде самим що ні на є примітивним. Досить буде змісту в файлі оточення .env наступного рядка:

MAIL_DRIVER = mail

Відправлення листа в Laravel через sendmail

Скажу чесно, про те, що з sendmail я познайомився порівняно недавно. Рівне тоді, коли дізнався, що в Laravel є можливість відправляти email за допомогою даної штуки.

Тому дозволю зробити невеликий вступ для таких же, як я, про те, що таке sendmail.

Sendmail, як говорить Wikipedia - це один з найдавніших агентів відправки пошти на рівні ОС.
На даним момент існують версія програми для практично під всі операційні системи і апаратні платформи.

Майже у всіх Unix-подібних системах є в базовій комплектації. Для запуску під Windows, наскільки я встиг помітити, потрібно додатково завантажувати.

Розповсюджується безкоштовно у вигляді виконуваного файлу з конфіга і вихідним кодом. Таким чином, для запуску sendmail необхідно буде запустити його виконуваний файл.

Ну, а для відправки пошти в Laravel за допомогою sendmail по-перше, потрібно вказати відповідний драйвер в файлі оточення .env:

MAIL_DRIVER = sendmail

І оскільки відправка email буде здійснюватися за допомогою системної утиліти, то фреймворку необхідно вказати шлях до її виконуваного файлу. Для цього в конфіги /config/mail.php є спеціальний параметр, як значення якого прописуємо шлях до sendmail на сервері (або локальної машині):

'Sendmail' => '/ usr / sbin / sendmail -bs',

В даному прикладі наведено код за замовчуванням, який буде працювати на Unix-подібних системах.

Laravel пошта - запис логів

Наостанок я залишив огляд драйвера відправки пошти в Laravel, за допомогою якого email відправити не вийде. Зате він відмінно підходить для дебага процесу формування і відправлення листа.

Це стає можливим завдяки записи в логи Laravel сформованого тексту email повідомлення, яке зазвичай відправляється додатком на поштову скриньку кінцевого користувача.

Щоб включити дану можливість в Laravel, необхідно виконати примітивну настройку, як і в разі використання PHP mail (). Достатньо всього лише вказати драйвер відправки пошти в .env:

MAIL_DRIVER = log

У підсумку, при якому зазначається вдале надсилання повідомлення ми отримаємо запис в логах наступного формату:

[2017-09-12 8:23:06] local.DEBUG: Message-ID: <[email protected]> Date: Tue, 12 Sep 2017 8:23:06 +0000 Subject: Your Subject From: Sender <receiver @ test.com> To: Receiver <[email protected]> MIME-Version: 1.0 Content-Type: text / plain; charset = utf-8 Content-Transfer-Encoding: quoted-printable Test

Нагадую, що при використанні даного драйвера відправка листа на пошту користувача не проводиться, тому їм користуватися можна тільки при локальної розробці для настройки підсумкового повідомлення, і ні в якому разі не в Production оточенні.

А також, запис проводиться в файл логів Laravel /storage/logs/laravel.log, а не в логи сервера.

Вибираємо оптимальний спосіб відправки email в Laravel

Ну, ось ми і розглянули всі наявні в Laravel драйвера відправки пошти, використання кожного з яких дозволяє виробляти email sending різними способами.

Тепер саме час оцінити достоїнства і недоліки кожного з них і в порівнянні з іншими, щоб виявити найбільш оптимальний для подальшого використання.

Отже, на порядку для у нас відправка email через поштові сервіси по їх API, через SMTP сервера, за допомогою PHP mail () і sendmail. Запис в логи зі зрозумілих причин способом відправки email ми не вважаємо, тому що вона при використанні драйвера log не проводиться. Однак, зовсім ігнорувати використання даного драйвера теж не варто, тому що він є зручним інструментом дебага, і їм рекомендується користуватися перед реальною відправкою пошти, щоб надмірно не навантажувати сервер і поштові сервіси не заблокували ваш сайт, як генератор спаму.

Інша справа, що записи в логах дозволять вам відстежити сам факт оправлення email і виникають при цьому помилок, однак ніяк не допоможуть в корекції верстки шаблону листа. Але, для цього в Laravel є зручний інструмент предпросмотра листи в браузері, про який ми з вами обов'язково поговоримо надалі.

Отже, який же спосіб відправки листів в Laravel нам вибрати?

Відправлення email в Laravel через поштові сервіси за допомогою API і через SMTP сервера - це, по суті, одне і те ж, тому що в обох випадках листи будуть відправлятися не з сервера на якому розташований сайт, а зі стороннього. Єдина відмінність в них - це порядок взаємодії. У першому випадку ви спілкуєтеся з поштовим сервісом через спеціальних API-методів, а в другому - посилаєте запит на сервер для відправки пошти.

Таким чином, при використанні API список можливостей у вас може бути трохи ширше, ніж при відправці email через SMTP. Але, по крайней мере, при стандартному використанні API Laravel для відправки листів і бібліотеки SwiftMailer ми цих можливостей не відчутний.

Також, як стверджують деякі розробники, при відправці листів через SMTP сервер фіксується IP адреса, з якого йде звернення до сервера, що може бути небажано в окремих випадках.

Ну, і при роботі через API швидкість взаємодії може бути злегка вище, ніж при використанні SMTP серверів. За крайній мірі, так стверджує Mailgun . А як воно насправді - чесно кажучи, не перевіряв 🙂 Так що якщо ви маєте в своєму розпорядженні більш точної і повної інформацією з даного приводу, то прошу поділитися їй в коментарях.

Laravel пошта: 5 способів відправки

Всім привіт Всім привіт! 🙂

Ті, хто підписаний на оновлення проекту, і стежить за виходом статей знають, що в минулій публікації ми на прикладі створення форми зворотного зв'язку розглянули реалізацію популярної технології AJAX в Laravel .

У ній ми реалізували відправку запиту серверу і сценарій дій на сайті після отримання відповіді. Залишилося тільки написати скрипт Laravel, що відправляє email повідомлення адміністратору на сервері, замість якого у нас зараз стоїть заглушка у вигляді виведення параметрів запиту.

Зробити це я обіцяв в наступній статті, тобто в поточній. Однак, при підготовці матеріалу прийшов до висновку, що однієї статті буде мало для детального огляду всіх способів Laravel email sending і повноцінної реалізації одного з них.

Тому я вирішив рознести написане на дві частини: повноцінний огляд всіх способів відправки пошти Laravel, який вас сьогодні чекає, і реалізацію відправлення листа одним з них з попутним оглядом методів фасаду Laravel Mail.

Прошу вибачити мене тих, хто налаштовувався побачити відправку пошти сьогодні, але я вважаю, що чиню правильно. Ще спасибі мені скажете 😉

Отже, сьогодні ми розглянемо 5 основних способів відправки email в Laravel і настройку відповідних їм драйверів фреймворка, і я постараюся коротко описати переваги і недоліки кожного з них, після чого виберемо найбільш оптимальний і реалізуємо його в наступній публікації.

Поїхали!

Особливості відправки пошти в Laravel

Оскільки Laravel - PHP framework , То відправити email в коді можна засобами PHP, скориставшись функцією mail (). Або можна взагалі скористатися сторонніми додатками типу sendmail, розгорнувши їх у себе на ПК у вигляді локального поштового сервера.

Ці способи робочі, універсальні і гнучкі в налаштуванні, але на цьому, по правді кажучи, їх переваги закінчуються. Питається - «А що ще потрібно-то?» 🙂 Відповідь більшості розробників буде простий - зручність.

Наприклад, вам хочеться прикрасити свій лист, додавши туди HTML-розмітку і CSS-стилі. Відправлення такого листа за допомогою PHP mail () буде виглядати приблизно так:

<? Php $ to = '[email protected]'; $ Subject = 'Тестове лист з HTML'; $ Message = '<html> <head> <title> Тестове лист з HTML </ title> <meta charset = "utf8"> </ head> <body> <p> Приклад таблиці </ p> <table> <tr > <th> Колонка 1 </ th> <th> Колонка 2 </ th> <th> Колонка 3 </ th> <th> Колонка 4 </ th> </ tr> <tr> <td> Осередок 1 < / td> <td> Осередок 2 </ td> <td> Осередок 3 </ td> <td> Осередок 4 </ td> </ tr> <tr> <td> Осередок 5 </ td> <td> Осередок 6 </ td> <td> Осередок 7 </ td> <td> Осередок 8 </ td> </ tr> </ table> </ body> </ html> '; $ Headers [] = 'MIME-Version: 1.0'; $ Headers [] = 'Content-type: text / html; charset = utf8 '; $ Headers [] = 'To: Receiver <[email protected]>'; $ Headers [] = 'From: Sender <[email protected]>'; $ Headers [] = 'Cc: copy@test.com'; $ Result = mail ($ to, $ subject, $ message, implode ( "\ r \ n", $ headers)); echo $ result? 'OK': 'Error';

Якщо ж скористатися API Laravel, то відправка такого ж повідомлення буде займати всього пару рядків коду:

Mail :: send ( 'emails.test', [], function ($ message) {$ m-> from ('[email protected] ',' Sender '); $ m-> to (' receiver @ test. com ',' Receiver ') -> subject (' Тестове лист з HTML '); $ m-> cc ('[email protected]', '');});

Єдине, HTML код шаблону буде розміщуватися в окремому файлі /resources/views/emails/test.blade.php, який вказаний в якості першого аргументу.

В цілому, як на мене, цей приклад дуже переконливо демонструє зручність API Laravel для відправки email.

До речі, дана АПИ-шка в Laravel реалізована на базі популярної бібліотеки SwiftMailer , Що є компонентом Symfony PHP framework, які дуже люблять використовувати розробники Laravel.

Тому вона вже входить в його комплект з коробки, і ставити її немає потреби.

Єдиний мінус, який я зміг знайти під час налаштування відправки пошти в Laravel через його API, - це рясна часом метушня з настройками і установкою додаткових пакетів, щоб той чи інший спосіб заробив. Але це приватний мінус.

Плюсів ж у порівнянні з нативними методами набагато більше.

По-перше, це - зручність використання.

По-друге, купа примочок у вигляді створення спеціальних Mailable класів, які надають зручність при масових розсилках однотипних листів в різних місцях коду.

По-третє, механізм черг Laravel, що дозволяє відправляти листи порціями через рівні проміжки часу, знижуючи навантаження з сервера і оберігаючи ваш ресурс від бана пошуковими системами і поштовими сервісами за спам.

Але, для використання даних переваг доведеться грати за правилами фреймворка і виробляти настройки відправки пошти певним чином.

Laravel пошта - настройка

Я зараз говорю про використання спеціальних драйверів для різних способів відправки листів в Laravel і експериментів з файлами конфігурацій .env, /config/mail.php і /config/services.php.

Якщо про драйвери ми поговоримо далі, то зі структурою файлів познайомимося зараз.

З коробки в файлі .env вже існує спеціальний блок змінних оточення для налаштувань надсилання електронних листів. Їх легко впізнати по приставці MAIL:

MAIL_DRIVER = smtp MAIL_HOST = smtp.mailtrap.io MAIL_PORT = 2525 MAIL_USERNAME = null MAIL_PASSWORD = null MAIL_ENCRYPTION = null

Ну, а що з приводу /config/mail.php і /config/services.php?

Відкриваємо перший з перерахованих і що ж ми бачимо? Вміст файлів я наводити не буду, тому що у всіх з коробки воно однаково - просто відкрийте їх у себе на комп'ютері.

Практично всі містяться в ньому параметри за замовчуванням беруть свої значення з файлу оточення .env, розташованого в корені сайту, за допомогою Laravel функції-хелпери env ().

Виняток становлять лише такі:

'From' => [ 'address' => '[email protected]', 'name' => 'Example',],

За допомогою даних параметрів у нас є можливість вказати email та ім'я відправника для всіх листів за замовчуванням, що відправляються з нашого Laravel сайту.

З приводу інших параметрів з mail.php - я буду змінювати їх в своєму файлі файлі оточення, тому що якщо я буду правити сам конфиг, то мої налаштування заллються в загальний репозиторій і тільки будуть вас збивати.

Ну, і в файлі services.php ситуація не сильно відрізняється від mail.php: практично всі параметри беруться з .env.

Так що в подальшому я буду правити .env, а ви просто повторюйте за мною. До речі, оскільки для різних способів відправки email в Laravel будуть вимагатися різні змінні з стандартного набору, то ті, які містяться у нас в .env зараз з приставкою MAIL я просто видалю, щоб не плутатися.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку.

Виняток становитиме тільки змінна оточення MAIL_ADMIN_EMAIL (якщо ви, звичайно, створюєте сайт разом у усіма з даного Laravel курсу і вже додали її), яка потрібна для вказівки email адміністратора для відображення його в повідомленні про помилку в формі зворотного зв'язку

Ну, а в самі файли конфігурацій mail.php і services.php ми будемо заглядати лише за тим, щоб дізнатися імена необхідних змінних з метою їх додавання або редагування в .env.

Ось на цій ноті ми і переходимо до огляду способів відправки пошти в Ларавел і необхідних для цього налаштувань, де поговоримо про все вищепереліченому вище докладніше.

Відправка листів в Laravel через API поштових сервісів

Перший спосіб відправки email в Laravel, який я вирішив розглянути, це - використання різних поштових сервісів через їх API.

Все, що від вас буде потрібно для його реалізації - це наявність аккаунта Mailgun, Mandrill, SparkPost або Amazon SES (на даним момент Laravel з коробки підтримує тільки їх) і установка необхідного пакету для реалізації сумісності сервісу з Laravel.

До речі, якщо ви там не зареєстровані і не хочете до них прив'язуватися, то пропоную відразу пропустити даний спосіб і спробувати наступні, які більш універсальні.

Налаштування Laravel Mailgun

Для відправки пошти через даний сервіс в першу чергу необхідно встановити в Laravel Guzzle HTTP library. Робити ми це будемо, природно, через пакетний менеджер Composer .

Отже, відкриваємо консоль і переходимо в каталог, де розташований наш Laravel проект. Виконуємо наступну команду:

composer require guzzlehttp / guzzle

В консолі буде описуватися порядок установки. Після успішного завершення все, що нам залишиться для завершення налаштувань - це доповнити файл оточення .env наступним кодом:

MAIL_DRIVER = mailgun MAILGUN_DOMAIN = ваш_домен MAILGUN_SECRET = ваш_ключ

Змінним MAILGUN_DOMAIN і MAILGUN_SECRET потрібно вказати значення, отримані після реєстрації в Mailgun для використання його АПИ.

Налаштування Laravel Mandrill

Для настройки відправки пошти Laravel через даний сервіс процедура буде багато в чому схожа з попереднім. Для початку встановлюємо Guzzle HTTP library.

А потім йдемо в Laravel .env і додаємо наступне:

MAIL_DRIVER = mandrill MANDRILL_SECRET = ваш_ключ

Змінної MANDRILL_SECRET потрібно вказати значення, отримане вами при реєстрації в Mandrill для використання його АПІшкі.

До речі! Процедура настройки Mandrill в офіційній документації Laravel в останній раз була описана для версії Laravel 5.2, але, судячи по коду движка, використання даного сервісу є досі (мабуть, вирішили залишити для роботи старих додатків).

Оскільки в нових версіях фреймворку творці Laravel з якихось причин вирішили відмовитися від Mandrill, то доведеться трохи пошаманити і додати в /config/services.php наступний блок для успішного відправлення листів:

'Mandrill' => [ 'secret' => env ( 'MANDRILL_SECRET'),],

Налаштування Laravel SparkPost

Підтримка даного сервісу, якщо вірити офіційній документації, з'явилася в Laravel 5.3. Тому якщо у вас додаток використовує більш ранню версію фреймворку, то даний спосіб у вас не спрацює. Або поновіть Laravel, або скористайтеся іншим способом (благо, їх вистачає).

Для успішного використання SparkPost нам буде потрібно все та ж Guzzle HTTP library і наступні змінні оточення в файлі .env:

MAIL_DRIVER = sparkpost SPARKPOST_SECRET = ваш_ключ

Налаштування Laravel Amazon SES

Даний поштовий сервіс, як і SparkPost, з'явився в Laravel 5.3, прийшовши на заміну Mandrill. Тому, якщо ви використовуєте більш ранню версію движка, то вам варто або оновитися, або використовувати інший спосіб відправки email в Laravel.

Його настройка буде дещо відрізнятися від попередніх поштових сервісів, тому що для його підтримки в Laravel буде потрібно не знайома вже Guzzle HTTP library, а інший пакет - Amazon AWS SDK for PHP, який встановлюється за допомогою такої команди в консолі:

composer require aws / aws-sdk-php: 3. *

Після установки доповнюємо файл .env наступними змінними оточення:

MAIL_DRIVER = ses SES_KEY = ваш_ключ SES_SECRET = ваш_секретний_ключ

Думаю, і так зрозуміло, що значення ключів вам повинні бути доступні після реєстрації в Amazon SES. До речі, не забудьте перевірити код свого регіону, згенерований Amazon. Якщо він буде не 'us-east-1', то зайдіть в файл /config/services.php і задайте потрібне значення параметру 'ses' [ 'region'].

На цьому огляд підтримуваних Laravel API поштових сервісів добігає кінця. Переходимо до огляду наступного способу відправки пошти.

Відправка пошти в Laravel через SMTP

Думаю, що багато в курсі про протокол передачі пошти SMTP. Так само, багато хто знає, що практично всі сучасні поштові сервіси пропонують свої SMTP-сервера для відправки пошти з сайтів через них.

По суті, попередній спосіб відправки пошти в Laravel через поштові сервіси - це те ж саме, що і поточний. За тим лише винятком, що в першому випадку ми відправляємо листи через API сервісу, а в другому - звертаючись до поштового сервера безпосередньо.

Ну, і при відправленні через SMTP ви можете користуватися будь-яким поштовим сервісом, який надає таку можливість (Gmail, Яндекс Пошта і т.д.), а взаємодію з сервісом по АПИ, ви маєте доступ лише до обраних, які підтримує Laravel. Ось і вся різниця 🙂

Все, що потрібно зробити користувачам, щоб скористатися можливістю відправки листів в Laravel через SMTP - це зареєструватися в сервісі і дізнатися настройки підключення до SMTP-серверу (адреса або доменне ім'я сервера, порт, шифрування і т.д.).

Ну, і ввести їх в Laravel належним чином:

MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 587 MAIL_USERNAME = Ваше_імя_пользователя MAIL_PASSWORD = ваш_пароль MAIL_ENCRYPTION = tls

Вище наведено приклад налаштувань Laravel для відправки пошти через SMTP сервер поштового сервісу Google - Gmail. Я вирішив вибрати саме його, тому що поштову скриньку gmail.com є, напевно, практично у всіх, тому даний спосіб підійде більшості.

Laravel пошта - відправка за допомогою PHP mail ()

Питається - «Що це за нісенітниця?» :-). Навіщо використовувати PHP mail () в якості драйвера для відправки пошти, якщо можна безпосередньо викликати цю функцію в коді? Відповідь все той же, що і раніше - для зручності, тому що при використанні драйвера ми отримуємо можливість використовувати API Laravel для «прокачаної» і більш зручною відправки листів.

Отже, якою буде порядок настройки?

Для даного способу він буде самим що ні на є примітивним. Досить буде змісту в файлі оточення .env наступного рядка:

MAIL_DRIVER = mail

Відправлення листа в Laravel через sendmail

Скажу чесно, про те, що з sendmail я познайомився порівняно недавно. Рівне тоді, коли дізнався, що в Laravel є можливість відправляти email за допомогою даної штуки.

Тому дозволю зробити невеликий вступ для таких же, як я, про те, що таке sendmail.

Sendmail, як говорить Wikipedia - це один з найдавніших агентів відправки пошти на рівні ОС.
На даним момент існують версія програми для практично під всі операційні системи і апаратні платформи.

Майже у всіх Unix-подібних системах є в базовій комплектації. Для запуску під Windows, наскільки я встиг помітити, потрібно додатково завантажувати.

Розповсюджується безкоштовно у вигляді виконуваного файлу з конфіга і вихідним кодом. Таким чином, для запуску sendmail необхідно буде запустити його виконуваний файл.

Ну, а для відправки пошти в Laravel за допомогою sendmail по-перше, потрібно вказати відповідний драйвер в файлі оточення .env:

MAIL_DRIVER = sendmail

І оскільки відправка email буде здійснюватися за допомогою системної утиліти, то фреймворку необхідно вказати шлях до її виконуваного файлу. Для цього в конфіги /config/mail.php є спеціальний параметр, як значення якого прописуємо шлях до sendmail на сервері (або локальної машині):

'Sendmail' => '/ usr / sbin / sendmail -bs',

В даному прикладі наведено код за замовчуванням, який буде працювати на Unix-подібних системах.

Laravel пошта - запис логів

Наостанок я залишив огляд драйвера відправки пошти в Laravel, за допомогою якого email відправити не вийде. Зате він відмінно підходить для дебага процесу формування і відправлення листа.

Це стає можливим завдяки записи в логи Laravel сформованого тексту email повідомлення, яке зазвичай відправляється додатком на поштову скриньку кінцевого користувача.

Щоб включити дану можливість в Laravel, необхідно виконати примітивну настройку, як і в разі використання PHP mail (). Достатньо всього лише вказати драйвер відправки пошти в .env:

MAIL_DRIVER = log

У підсумку, при якому зазначається вдале надсилання повідомлення ми отримаємо запис в логах наступного формату:

[2017-09-12 8:23:06] local.DEBUG: Message-ID: <[email protected]> Date: Tue, 12 Sep 2017 8:23:06 +0000 Subject: Your Subject From: Sender <receiver @ test.com> To: Receiver <[email protected]> MIME-Version: 1.0 Content-Type: text / plain; charset = utf-8 Content-Transfer-Encoding: quoted-printable Test

Нагадую, що при використанні даного драйвера відправка листа на пошту користувача не проводиться, тому їм користуватися можна тільки при локальної розробці для настройки підсумкового повідомлення, і ні в якому разі не в Production оточенні.

А також, запис проводиться в файл логів Laravel /storage/logs/laravel.log, а не в логи сервера.

Вибираємо оптимальний спосіб відправки email в Laravel

Ну, ось ми і розглянули всі наявні в Laravel драйвера відправки пошти, використання кожного з яких дозволяє виробляти email sending різними способами.

Тепер саме час оцінити достоїнства і недоліки кожного з них і в порівнянні з іншими, щоб виявити найбільш оптимальний для подальшого використання.

Отже, на порядку для у нас відправка email через поштові сервіси по їх API, через SMTP сервера, за допомогою PHP mail () і sendmail. Запис в логи зі зрозумілих причин способом відправки email ми не вважаємо, тому що вона при використанні драйвера log не проводиться. Однак, зовсім ігнорувати використання даного драйвера теж не варто, тому що він є зручним інструментом дебага, і їм рекомендується користуватися перед реальною відправкою пошти, щоб надмірно не навантажувати сервер і поштові сервіси не заблокували ваш сайт, як генератор спаму.

Інша справа, що записи в логах дозволять вам відстежити сам факт оправлення email і виникають при цьому помилок, однак ніяк не допоможуть в корекції верстки шаблону листа. Але, для цього в Laravel є зручний інструмент предпросмотра листи в браузері, про який ми з вами обов'язково поговоримо надалі.

Отже, який же спосіб відправки листів в Laravel нам вибрати?

Відправлення email в Laravel через поштові сервіси за допомогою API і через SMTP сервера - це, по суті, одне і те ж, тому що в обох випадках листи будуть відправлятися не з сервера на якому розташований сайт, а зі стороннього. Єдина відмінність в них - це порядок взаємодії. У першому випадку ви спілкуєтеся з поштовим сервісом через спеціальних API-методів, а в другому - посилаєте запит на сервер для відправки пошти.

Таким чином, при використанні API список можливостей у вас може бути трохи ширше, ніж при відправці email через SMTP. Але, по крайней мере, при стандартному використанні API Laravel для відправки листів і бібліотеки SwiftMailer ми цих можливостей не відчутний.

Також, як стверджують деякі розробники, при відправці листів через SMTP сервер фіксується IP адреса, з якого йде звернення до сервера, що може бути небажано в окремих випадках.

Ну, і при роботі через API швидкість взаємодії може бути злегка вище, ніж при використанні SMTP серверів. За крайній мірі, так стверджує Mailgun . А як воно насправді - чесно кажучи, не перевіряв 🙂 Так що якщо ви маєте в своєму розпорядженні більш точної і повної інформацією з даного приводу, то прошу поділитися їй в коментарях.

З приводу использование PHP mail () и sendmail - ЦІ підході, як и попередні, Досить схожі. Їх головні схожістю є відправки листів на сервері, на якому розташованій сайт. Інші розходження полягають у суб'єктивному зручність настройки, споживання серверних ресурсів і т.д.

Але, як на мене, ці розбіжності настільки мізерні, що прямують до нуля, тому заглиблюватися в їх опис я не стану. Тим більше, що багато хто з них просто стирає Laravel при використанні його API для налаштування і використання перерахованих способів.

Якщо раптом я забув про щось принципово важливому - прохання виправити мене в коментарях під статтею.

Розсилка листів в Laravel на сервері додатка або через сторонній?

Отже, наші чотири основні способи відправки листів в Laravel розділилися на дві групи, основною відмінністю яких є підхід до розсилки пошти.

В першу потрапили використання поштових сервісів через АПИ і їх SMTP серверів, а в другу - експлуатація PHP mail () і sendmail. Всередині груп відмінності між способами незначні, а ось при порівнянні груп в цілому є що сказати.

До незаперечних переваг відправки email на сервері додатка (сервер, на якому працює додаток / сайт) над використанням стороннього можна віднести необмежену кількість повідомлень, що відправляються (може бути обмежена лише можливостями сервера і тарифним планом хостингу). Але, в той же час, частина листів (якщо не всі) потрапляють в папку «Спам» на поштовому клієнті і, отже, шанси, що одержувач ознайомиться з вашою кореспонденцією вчасно, катастрофічно мізерні.

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

Ну, і ще до мінусів відправки пошти з сервера додатки можна віднести витрата серверних ресурсів, що при використанні віртуального хостингу і великих обсягів листів може стати істотним недоліком.

Якщо говорити про другу групу способів відправки листів в Laravel (використання API і SMTP серверів поштових сервісів), то у них даний момент є найголовнішою перевагою, тому що листи відсилаються на сторонніх серверах, тобто витрачаються їхні ресурси, а не ваші. Зате ви будете постійно упиратися в обмеження, тому що при використанні безкоштовних тарифів кількість email лімітовано і коливається в межах від 10000 на місяць для MailGun, закінчуючи 60000 у Gmail і Amazon SES.

У деяких поштових сервісів, до речі, взагалі немає безкоштовних тарифів, як у SparkPost, наприклад. Природно, вас будуть запевняти в інших перевагах використання поштових сервісів, які стають доступними в преміум-акаунтів ... Не здивуюся, якщо з'ясується, що міфи про спамності PHP mail () вигадані ними ж 😉

Все може бути ... Треба ж їм якось існувати і конкурувати не тільки один з одним, але і з безкоштовними аналогами. Але я більш не має наміру продовжувати цю розмову, тому що ні перші, ні другі за рекламу мені не платять 🙂

Повернемося до реальних і об'єктивних особливостей. І тут хочеться сказати, що навіть якщо закрити очі на штучні обмеження числа листів, відправка пошти через сторонній сервіс сама має низку недоліків. До числа одним з найголовніших хочеться віднести велику тривалість процедури відправки email, зокрема, через SMTP Gmail, яку я помітив на практиці.

Ну самі поміркуйте: якщо для відправлення листа на сервері додатка вам потрібно відправити локальний запит і отримати від нього відповідь, то при використанні сторонніх сервісів їх сервера можуть розташовуватися в іншій країні, а то і на іншому континенті (мало не написав планеті :-)) , куди запит і відповідь на нього буде йти набагато довше першого варіанту.

Додайте до цього ще час очікування черги (вас же не одного обслуговують!) І самої обробки запиту. Думаю, зрозуміло, до чого я веду 🙂

Можливо, що при розсилці повідомлень порціями час запиту до локального сервера і віддаленого будуть приблизно рівні, але при відправці одиночних повідомлень поштові сервіси програють PHP mail (), sendmail і іншим локальним засобам розсилки листів.

Так, під час цього дійства витрачаються ресурси сторонніх серверів, але за цей плюс доводиться розплачуватися часом.

Але, тим не менше, відправка листів через API і SMTP сервера поштових сервісів все одно дуже популярна серед розробників і клієнтів. Тим більше, що великі порції листів (масові розсилки) часто проводяться в фоновому режимі, і при цьому абсолютно все одно, скільки часу вони займають. Зате на великих проектах, де ресурси серверів економляться до межі зважаючи на велику кількість виконуваних завдань, можливість винести частину процесів на сторонній ресурс вельми приваблива і обгрунтована.

Тому, виходячи з даних міркувань, я при подальшій розробці буду використовувати відправку пошти в Laravel через сторонні поштові сервіси. А точніше, через SMTP Gmail. Чому саме цей спосіб? Тому що у мене там вже є обліковий запис, налаштована для використання SMTP сервера, а на інших поштовика немає, і мені лінь її створювати 🙂

Це абсолютно не означає, що даний метод ідеальний (самі могли переконатися, скільки мінусів у нього вдалося знайти). Навіть сам заголовок про вибір найбільш оптимального способу відправки пошти в Laravel не зовсім коректний, але треба ж було вас якось зацікавити прочитати весь матеріал 🙂 Тим більше, що тепер ви познайомилися з перевагами і недоліками кожного підходу і зможете самостійно вибрати те, що вам більше до душі або підходить в конкретній ситуації.

На цьому сьогоднішня стаття з оглядом способів відправки пошти в Laravel добігає кінця. Сподіваюся, ви тепер розумієте моє бажання розділити теорію і практику реалізації відправки email в Ларавель на різні публікації, тому що одна стаття про все це була б просто неосяжної і ви б половину її не читали б ... А так є мізерний шанс, що ви дійшли до цих рядків 🙂 Якщо так - з вас лайк під статтею.

Ну, а наступну публікацію я вже цілеспрямовано присвячу реалізації відправки email через API Laravel, для чого скористаюся методами фасаду Mail і детально опишу його можливості. Інші можливості API розглянемо вже далі, коли у нас буде готовий до роботи сайт. Та й, можливо, не всі цього і захочуть ...

На цьом все. Пишіть ваші відгуки в коментарях і не забувайте вступати в соціальні спільноти. Також приймаються ваші пропозиції з приводу нових статей про речі, які будуть вам цікаві.

До скорої зустрічі!

PS: если вам потрібен сайт або необходимо внести правки на існуючій, но для цього немає часу и бажання, можу Запропонувати свои послуги.

Більше 5 років досвіду професійної розробки сайтів. Робота з PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular и іншімі технологіямі web-розробки.

Досвід розробки проектів різного уровня: Лендінзі, корпоративні сайти, Інтернет-магазини, CRM, портал. У тому чіслі підтримка и розробка HighLoad проектів. Твір Ваші заявки на email [email protected] .

І з друзями не забудьте Поділитися 😉

Питається - «А що ще потрібно-то?
Com'; $ Result = mail ($ to, $ subject, $ message, implode ( "\ r \ n", $ headers)); echo $ result?
Php?
Відкриваємо перший з перерахованих і що ж ми бачимо?
Навіщо використовувати PHP mail () в якості драйвера для відправки пошти, якщо можна безпосередньо викликати цю функцію в коді?
Отже, якою буде порядок настройки?
Отже, який же спосіб відправки листів в Laravel нам вибрати?
Розсилка листів в Laravel на сервері додатка або через сторонній?
Чому саме цей спосіб?
Питається - «А що ще потрібно-то?