3 способа отправки писем в Ruby

29 Фев
2012

Оборудование: Ubuntu Server 11.04, Postfix, Ruby 1.8.7, Rubygems 1.8.15, Rails 2.3.11 (собственно ActionMailer тоже 2.3.11).
И так, приступим…

Начнем, как все уже догадались, с ActionMailer’а, но без рельсов.



#!/usr/bin/ruby
require 'rubygems'
require 'action_mailer'
ActionMailer::Base.raise_delivery_errors = true
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.template_root='./'
ActionMailer::Base.smtp_settings = {
:address => "example.com",
:port => 25,
:domain => 'example.com',
#у меня постфикс локально без пароля позволяет отправлять почту, но о настройках почтовых серверов не здесь
#:user_name => 'root',
#:password => 'root_password',
}
class Notifier < ActionMailer::Base
def email()
recipients "komu@example.ru"
from "ot_kogo@example.com"
subject "Тема"
content_type "multipart/alternative"
body = { :hello => "Привет", :person => "медвед"}
part :content_type => "text/plain", :body => render_message('email', body)
end
end
Notifier.deliver_email

И в той же папке что и скрипт создаем папку notifier, а в ней файл email.html.erb с примерно таким содержанием:
<%= @hello+' '+@person %>

Подробнее можно почитать на офф. сайте.
Ну тут ничего сложного и не было, да и многие так и отправляют почту (я сам тоже), но есть же еще интересные моменты…

Net/SMTP — стандартный, класс!


#!/usr/bin/ruby
require 'rubygems'
require 'net/smtp'
from = 'ot_kogo@example.com'
to = 'komu@example.ru'
theme = 'Вот это тема!'
text="Привет медвед"
message=""
message<<"From: ot kogo <#{from}>\n"
message<<"To: #{to}\n"
message<<"Subject: #{theme}\n"
message<<text
Net::SMTP.new('localhost', 25).start('example.com') do |smtp|
smtp.send_message message, from, to
end

Просто и со вкусом, но без рюшечек, которые можно делать в actionmailer’е.
Об этом классе можно почитать здесь.

Socket или на каком языке разговаривает postfix?!


#!/usr/bin/ruby
require 'socket'

host = 'localhost'
port = 'smtp'
server = 'example.com'
from = 'ot_kogo@example.com'
to = 'komu@example.ru'
data = "from: #{from}\nto: #{to}\nsubject: Вот такая вот тема.\nА это текст письма."
request=''
r = TCPSocket.open(host, port){ |t|
t.puts('NOOP')
request << "NOOP\r\n"+t.gets
t.puts("EHLO #{server}\r\n")
request << "EHLO #{server}\r\n"+t.gets+t.gets+t.gets+t.gets+t.gets+t.gets+t.gets+t.gets+t.gets+t.gets
t.puts("MAIL FROM:<#{from}>\r\n")
request << "MAIL FROM:<#{from}>\r\n"+t.gets
t.puts("RCPT TO:<#{to}>\r\n")
request << "RCPT TO:<#{to}>\r\n"+t.gets
t.puts("DATA\r\n")
request << "DATA\r\n"+t.gets
t.puts("#{data}\r\n.\r\n")
request << "#{data}\r\n.\r\n"+t.gets
t.puts("QUIT\r\n")
request << "QUIT\r\n"+t.gets
}
puts request

Тут можно проследить как общается скрипт с почтовым сервером — довольно-таки интересная картина, но так отправлять почту это тоже самое что добывать огонь трением имея в кармане коробок спичек.
О Socket’е читаем тут.

Собстевенно для более новых версий интерпретатора и гемов проблем с реализацией также возникнуть не должно.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх