Отправка писем с Ruby

Отправка писем с Ruby

12 апреля 2022 г.

Допустим, у вас есть работающее приложение Ruby, и вам нужно добавить в него функцию доставки электронной почты. Это может быть связано с аутентификацией пользователя или любым другим видом транзакционной электронной почты, это не имеет значения. Это руководство предназначено для того, чтобы помочь вам реализовать отправку электронных писем с помощью Ruby.


Если вы хотите прочитать полную статью, загляните в блог Mailtrap: Отправка писем с помощью Ruby


Параметры отправки электронной почты в Ruby


В основном вы можете выбрать один из трех вариантов.


Самый простой — использовать класс Net::SMTP. Он предоставляет функциональные возможности для отправки электронной почты через SMTP. Недостаток этого варианта в том, что в Net::SMTP отсутствуют функции для составления электронных писем. Вы всегда можете создать их самостоятельно, но это требует времени.


Второй вариант — использовать специальный Ruby gem, например Mail, Pony или другие. Эти решения позволяют обрабатывать электронную почту простым и эффективным способом. Action Mailer — идеальное решение для работы с электронной почтой через призму Rails. И, скорее всего, это будет ваш выбор.


Третий вариант — это класс Socket. В основном этот класс позволяет устанавливать связь между процессами или внутри процесса. Таким образом, отправка электронной почты также может быть реализована с его помощью. Однако правда в том, что Socket не предоставляет вам обширных функций, и вы вряд ли захотите использовать его.


Теперь давайте попробуем отправить электронное письмо, используя каждое из описанных решений.


Как отправлять электронные письма в Ruby через Net::SMTP


По нашему опыту, использование этой опции в обычном веб-приложении встречается редко. Однако отправка электронной почты через Net::SMTP может подойти, если вы используете mruby (облегченная реализация языка Ruby) на каком-либо устройстве IoT. Также подойдет при использовании в бессерверных вычислениях, например, AWS Lambda. Сначала ознакомьтесь с этим примером скрипта, а затем мы рассмотрим его подробно.


требовать 'net/smtp'


сообщение = <<END_OF_MESSAGE


От: YourRubyApp <info@yourrubyapp.com>


Кому: BestUserEver <your@bestuserever.com>


Тема: любая тема электронной почты, которую вы хотите


Дата: Вт, 02 июля 2019 15:00:34 +0800


Лорем Ипсум


END_OF_MESSAGE


Net::SMTP.start('your.smtp.server', 25) сделать |smtp|


сообщение smtp.send_message,


'info@yourrubyapp.com',


'ваш@bestuserever.com'


конец


Это простой пример отправки текстового электронного письма через SMTP (официальную документацию можно найти здесь). Вы можете увидеть четыре заголовка: From, To, Subject и Date. Имейте в виду, что вы должны отделить их пустой строкой от основного текста электронной почты. Не менее важно подключиться к SMTP-серверу.


Net::SMTP.start('your.smtp.server', 25) сделать |smtp|


Естественно, здесь будут ваши данные вместо «your.smtp.server», а 25 — это номер порта по умолчанию. При необходимости вы можете указать другие данные, такие как имя пользователя, пароль или схему аутентификации (:plain, :login и :cram_md5). Это может выглядеть следующим образом:


Net::SMTP.start('your.smtp.server', 25, 'localhost', 'имя пользователя', 'пароль' :plain) do |smtp|


Здесь вы подключитесь к SMTP-серверу, используя имя пользователя и пароль в текстовом формате, а имя хоста клиента будет идентифицировано как localhost.


После этого можно использовать метод send_message и указать в качестве параметров адреса отправителя и получателя. Блочная форма SMTP.start (Net::SMTP.start('your.smtp.server', 25) do |smtp|) автоматически закрывает сеанс SMTP.


В Ruby Cookbook отправка электронных писем с помощью библиотеки Net::SMTP называется минимализмом, поскольку вам нужно создавать строку электронной почты вручную. Тем не менее, это не так безнадежно, как вы можете подумать. Давайте посмотрим, как вы можете улучшить свое электронное письмо с помощью HTML-контента и даже добавить вложение.


Отправка электронной почты в формате HTML в Net::SMTP


Посмотрите этот пример скрипта, который относится к разделу сообщений.


сообщение = <<END_OF_MESSAGE


От: YourRubyApp <info@yourrubyapp.com>


Кому: BestUserEver <your@bestuserever.com>


MIME-версия: 1.0


Тип содержимого: текст/html


Тема: любая тема электронной почты, которую вы хотите


Дата: вторник, 02 июля 2019 г., 15:00:34 +0800


Немного простого текста.


<strong>Начало вашего HTML-контента.</strong>


<h1>И немного заголовка.</h1>


END_OF_MESSAGE


Помимо HTML-тегов в теле сообщения у нас есть два дополнительных заголовка: «MIME-Version» и «Content-type». MIME относится к многоцелевым расширениям почты Интернета. Это расширение протокола электронной почты в Интернете, позволяющее комбинировать различные типы содержимого в одном теле сообщения. Значение MIME-Version обычно равно 1.0. Это указывает на то, что сообщение имеет формат MIME.


Насчет заголовка Content-type все понятно. В нашем случае у нас есть два типа — HTML и обычный текст. Кроме того, обязательно разделите эти типы контента с помощью определения границ.


Кроме MIME-Version и Content-type, вы можете использовать другие заголовки MIME:


  • Content-Disposition – указывает стиль презентации (встроенный или прикрепленный)

  • «Content-Transfer-Encoding» — указывает схему преобразования двоичного кода в текст (7-битная, кавычки-печатная, base64, 8-битная или двоичная).

Отправка письма с вложением в Net::SMTP


Давайте добавим вложение, например файл PDF. В этом случае нам нужно обновить Content-type на multipart/mixed. Кроме того, используйте функцию pack("m"), чтобы закодировать прикрепленный файл в кодировке base64.


требовать 'net/smtp'


имя файла = "/tmp/Attachment.pdf"


file_content = File.read(имя файла)


encoded_content = [file_content].pack("m")   # base64


marker = "AUNIQUEMARKER"


После этого вам нужно определить три части вашего электронного письма.


Часть 1. Основные заголовки


part1 = <<END_OF_MESSAGE


От: YourRubyApp <info@yourrubyapp.com>


Кому: BestUserEver <your@bestuserever.com>


Тема: Добавление вложения в электронное письмо


MIME-версия: 1.0


Content-Type: multipart/mixed; граница = #{маркер}


--#{маркер}


END_OF_MESSAGE


Часть 2. Действие сообщения


part2 = <<END_OF_MESSAGE


Тип содержимого: текст/html


Контент-Передача-Кодирование:8bit


Немного простого текста.


<strong>Начало вашего HTML-контента.</strong>


<h1>И немного заголовка.</h1>


--#{маркер}


END_OF_MESSAGE


Часть 3 – Приложение


part3 = <<END_OF_MESSAGE


Content-Type: multipart/mixed; имя = "#{имя файла}"


Контент-Передача-Кодировка: base64


Content-Disposition: вложение; имя_файла = "#{имя_файла}"


#{закодированное_содержимое}


--#{маркер}--


END_OF_MESSAGE


Теперь мы можем собрать все части воедино и завершить сценарий. Вот как это будет выглядеть:


требовать 'net/smtp'


имя файла = "/tmp/Attachment.pdf"


file_content = File.read(имя файла)


encoded_content = [file_content].pack("m")   # base64


marker = "AUNIQUEMARKER"


part1 = <<END_OF_MESSAGE


От: YourRubyApp <info@yourrubyapp.com>


Кому: BestUserEver <your@bestuserever.com>


Тема: Добавление вложения в электронное письмо


MIME-версия: 1.0


Content-Type: multipart/mixed; граница = #{маркер}


--#{маркер}


END_OF_MESSAGE


part2 = <<END_OF_MESSAGE


Тип содержимого: текст/html


Контент-Передача-Кодирование:8bit


Немного простого текста.


<strong>Начало вашего HTML-контента.</strong>


<h1>И немного заголовка.</h1>


--#{маркер}


END_OF_MESSAGE


part3 = <<END_OF_MESSAGE


Content-Type: multipart/mixed; имя = "#{имя файла}"


Контент-Передача-Кодировка: base64


Content-Disposition: вложение; имя_файла = "#{имя_файла}"


#{закодированное_содержимое}


--#{маркер}--


END_OF_MESSAGE


сообщение = часть1 + часть2 + часть3


начать


Net::SMTP.start('your.smtp.server', 25) do |smtp|


сообщение smtp.send_message,


'info@yourrubyapp.com',


'ваш@bestuserever.com'


конец


Могу ли я отправить электронное письмо нескольким получателям в Net::SMTP?


Определенно, вы можете. send_message ожидает, что второй и последующие аргументы будут содержать электронные письма получателей. Например, вот так:


Net::SMTP.start('your.smtp.server', 25) сделать |smtp|


сообщение smtp.send_message,


'info@yourrubyapp.com',


'ваш@bestuserever1.com',


'ваш@bestuserever2.com',


'ваш@bestuserever3.com


конец


Лучшие драгоценные камни Ruby для отправки электронных писем


В экосистеме Ruby вы можете найти определенные жемчужины электронной почты, которые могут улучшить ваш опыт отправки электронной почты.


Рубиновая почта


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


Пони


Возможно, вы слышали сказку об отправке письма одной командой. Держитесь за свои шляпы, потому что они настоящие и предоставлены драгоценным камнем Pony.


ActionMailer


Это самый популярный гем для отправки электронных писем на Rails. Если ваше приложение написано поверх него, ActionMailer обязательно подойдет. Он позволяет отправлять электронные письма, используя классы и представления почтовой программы.


Использование Mailtrap для проверки отправки электронной почты с помощью Net::SMTP


Настройка очень проста. Как только вы окажетесь в почтовом ящике с демонстрацией, скопируйте учетные данные SMTP на вкладке «Настройки SMTP» и вставьте их в свой код. Или вы можете получить готовый шаблон простого сообщения в разделе Интеграции. Просто выберите язык программирования или фреймворк, на котором построено ваше приложение.


требовать 'net/smtp'


сообщение = <<END_OF_MESSAGE


От: YourRubyApp <info@yourrubyapp.com>


Кому: BestUserEver <your@bestuserever.com>


Тема: любая тема электронной почты, которую вы хотите


Дата: вторник, 02 июля 2019 г., 15:00:34 +0800


Лорем Ипсум


END_OF_MESSAGE


Net::SMTP.start('smtp.mailtrap.io', 587, '<имя пользователя>', '<пароль>', :cram_md5) do |smtp|


сообщение smtp.send_message,


'info@yourrubyapp.com',


'ваш@bestuserever.com'


конец


Если все в порядке, вы увидите свое сообщение в папке «Входящие» Mailtrap Demo. Кроме того, вы можете попробовать проверить свою электронную почту с HTML-содержимым и вложением. Mailtrap позволяет вам увидеть, как будет выглядеть ваша электронная почта, и при необходимости проверить HTML.


Создайте учетную запись Mailtrap и попробуйте бесплатно протестировать ее самостоятельно!


Вы только что прочитали полное руководство о том, как тестировать и отправлять электронные письма в Ruby. Когда дело доходит до Ruby Mail, Pony и Action Mailer, еще многое предстоит проверить.


Узнайте больше о Ruby Gems и Socket Class в нашей полной статье Отправка электронных писем с помощью Ruby на Mailtrap.io.





Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE