English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Учебник Ruby на базовом уровне

Учебник Ruby на высоком уровне

Отправка почты SMTP с помощью Ruby

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  - Строка или массив, или что-то, что возвращает каждый итератор в любое время.

  • sender - Строка,出现的电子邮件表单.

  • recipients - Строка или массив строк, представляющие адреса получателей.

Онлайн-пример

Ниже приведен простой скрипт на Ruby для отправки писем:

Онлайн-пример

require 'net/smtp'
 
message = <<MESSAGE_END
От: Частное лицо <[email protected]>
Кому: Пользователь теста <[email protected]>
Тема: тест SMTP-почты
 
Это тестовое электронное письмо.
MESSAGE_END
 
begin
  smtp.send_message message, '[email protected]', 
                             '[email protected]'
end

В предыдущем примере был создан базовый электронный адрес, обратите внимание на правильный формат заголовка. Электронное письмо должно содержать поля From, To и Subject, между текстом и заголовками должна быть пустая строка.

Для подключения к локальному SMTP-серверу с помощью Net::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.

Использование Ruby для отправки HTML-писем

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

При отправке электронной почты вы можете установить версию MIME, тип документа и кодировку для отправки HTML-писем.

Онлайн-пример

Следующий пример предназначен для отправки писем в формате HTML:

Онлайн-пример

require 'net/smtp'
 
message = <<MESSAGE_END
От: Частное лицо <[email protected]>
Кому: Пользователь теста <[email protected]>
MIME-Version: 1.0
Тип содержимого: text/html
Тема: тест SMTP-почты
 
Это электронное письмо, которое будет отправлено в формате HTML
 
<b>This is HTML message.</b>
<h1>This is headline.</h1>
MESSAGE_END
 
begin
  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
 
marker = "AUNIQUEMARKER"
 
body =<<EOF
This is a test email to send an attachement.
--#{marker}--
 
# 定义主要的头部信息
part1 =<<EOF
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=#{marker}
--#{marker}
--#{marker}--
 
# 定义消息动作
part2 =<<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit
 
#{body}
--#{marker}
--#{marker}--
 
# 定义附件部分
part3 =<<EOF
Content-Type:.multipart/mixed; name=\"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename="#{filename}"
 
Content-Disposition: attachment; filename="#{filename}"
#{encodedcontent}
--#{marker}--
 
EOF
 
mailtext = part1 + part2 + part3
# Отправка почты 
  begin
     Net::SMTP.start('localhost') do |smtp|
                          ['[email protected]'])
  end
rescue Exception => e  
  print "Exception occurred: " + e  
end

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