Отправка электронной почты в Ruby - SMTP

SMTP (Simple Mail Transfer Protocol) — это набор правил для передачи почты с адреса источника на адрес назначения, и он управляет тем, как сообщения пересылаются.

Ruby предоставляет Net::SMTP для отправки электронной почты и предоставляет два метода: new и start:

newМетод имеет два параметра:

  • имя сервераПо умолчанию localhost
  • номер портаПо умолчанию 25

startМетод имеет следующие параметры:

  • server- IP-адрес SMTP-сервера, по умолчанию localhost
  • port- Номер порта, по умолчанию 25
  • domain- Домен отправителя, по умолчанию ENV["HOSTNAME"]
  • account- Имя пользователя, по умолчанию nil
  • password- Пароль пользователя, по умолчанию nil
  • authtype- Тип аутентификации, по умолчаниюcram_md5

Метод экземпляра объекта SMTP вызывает sendmail со следующими параметрами:

  • source- Строка, массив или что-либо, возвращаемое итератором each в любой момент времени.
  • sender- Строка, отображаемая в поле формы электронного письма.
  • recipients- Строка или массив строк, представляющих адрес получателя.

Пример

Ниже приведён простой скрипт на Ruby для отправки электронной почты:

Пример

require 'net/smtp' message = <<MESSAGE_END From: Private Person <me@fromdomain.com> To: A Test User <test@todomain.com> Subject: SMTP e-mail test This is a test e-mail message. MESSAGE_END Net::SMTP.start('localhost') do |smtp| smtp.send_message message, '[email protected]', '[email protected]' end
В приведенном выше примере вы настроили базовое электронное письмо. Обратите внимание на правильный формат заголовка. Электронному письму требуются From, To и Subject, а между текстовым содержимым и информацией заголовка должна быть пустая строка.

Используйте Net::SMTP для подключения к SMTP-серверу на локальной машине и используйте метод send_message для отправки электронного письма. Параметрами метода являются адрес электронной почты отправителя и адрес электронной почты получателя.

Если на вашей локальной машине не запущен SMTP-сервер, вы можете использовать Net::SMTP для связи с удаленным SMTP-сервером. Если вы пользуетесь службами веб-почты (например, Hotmail или Yahoo Mail), ваш почтовый провайдер предоставит вам данные сервера исходящей почты:

Net::SMTP.start('mail.your-domain.com')

Приведённый выше код подключится к почтовому серверу с хостом mail.your-domain.com и портом 25. Если нужно указать имя пользователя и пароль, код выглядит так:

Net::SMTP.start('mail.your-domain.com', 25, 'localhost', 'username', 'password', :plain)

В приведённом выше примере для подключения к почтовому серверу с хостом mail.your-domain.com и портом 25 используются указанные имя пользователя и пароль.


Отправка HTML-письма с помощью Ruby

Net::SMTP также поддерживает отправку писем в формате HTML.

При отправке письма можно задать версию MIME, тип документа и кодировку, чтобы отправить письмо в формате HTML.

Пример

В следующем примере показано, как отправить письмо в формате HTML:

Пример

require 'net/smtp' message = <<MESSAGE_END From: Private Person <me@fromdomain.com> To: A Test User <test@todomain.com> MIME-Version: 1.0 Content-type: text/html Subject: SMTP e-mail test This is an e-mail message to be sent in HTML format <b>This is HTML message.</b> <h1>This is headline.</h1> MESSAGE_END Net::SMTP.start('localhost') do |smtp| smtp.send_message message, '[email protected]', '[email protected]' end

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

Если вам нужно отправить электронное письмо со смешанным содержимым, необходимо установить Content-type в multipart/mixed. Так вы сможете добавить содержимое вложения в письмо.

Перед отправкой вложению необходимо использовать функциюpack("m"), чтобы преобразовать его содержимое в формат base64.

Пример

Следующий пример отправит электронное письмо с вложением /tmp/test.txt:

Пример

require 'net/smtp' filename = "/tmp/test.txt" #Прочитайте файл и закодируйте его в формате base64 filecontent = File.read(filename) encodedcontent = [filecontent].pack("m") # base64 маркер = "AUNIQUEMARKER" тело =<<EOF Это is a тест электронное письмо чтобы отправить an вложение. EOF #Определите основную информацию заголовка part1 =<<EOF From: Private Person <me@fromdomain.net> Кому: A Тестовый Пользователь <test@todmain.com> Тема: Отправка Вложение MIME-Версия: 1.0 Содержимое-Type: multipart/mixed; boundary=#{marker} --#{marker} EOF # Определить действие сообщения part2 =<<EOF Content-Type: text/plain Content-Transfer-Encoding:8bit #{body} --#{marker} EOF #Определить часть вложения part3 =<<EOF Content-Type: multipart/mixed; name=\"#{filename}\"Content-Transfer-Encoding:base64 Content-Disposition: attachment; filename="#{filename}" #{encodedcontent} --#{marker}-- EOF mailtext = part1 + part2 + part3 # Отправить письмо begin Net::SMTP.start('localhost') do |smtp| smtp.sendmail(mailtext, '[email protected]', ['[email protected]']) end rescue Exception => e print "Произошло исключение: " + e end

Примечание:Можно указать несколько адресов получателей, но их нужно разделять запятыми.

Другие расширения