Ruby ile POP3 ve SMTP

Merhabalar,

Önceki yazımızda Ruby ile FTP ve HTTP‘den bahsetmiÅŸ ve bu konuda birkaç örnek yapmıştık. Bununla beraber Ruby’nin aÄŸ yetenekleri içerisinde POP3, SMTP gibi elektronik posta ile ilgili yüksek seviyeli sınıfların varlığından da bahsetmiÅŸtik. BaÅŸlıktan da anlaşılacağı gibi, bu yazımızda sizlerle beraber POP3 ve SMTP konularına deÄŸineceÄŸiz. Kendimize güzel ve popüler birkaç sorun bulup bu sorunları çözmeye çalışacağız.

Öncelikle POP3 protokolü ile herhangi bir elektronik mail sunucusu ile haberleşme konusunu inceleyelim, sonrasında SMTP protokolü ile ilgili örneğimize geçiş yaparız.

POP3 protokolü ile ilgili popüler bir sorun olarak; WordPress‘i örnek verebiliriz. Åžimdi “ne alakası var kardeÅŸim” diyeceksiniz, demeyin :) biraz sabredin.. :) WordPress’in güzel bir yeteneÄŸi var, belirli bir e-posta adresini kontrol edebiliyor, eÄŸer bu e-posta adresine bir e-posta gelmiÅŸ ise, bu e-postanın içeriÄŸini bir yazı olarak yayımlıyor… :) güzel bir özellik deÄŸil mi, peki biz bunu Ruby’de nasıl yaparız ? Ä°ÅŸte asıl soru bu.

Ve işte sorunun cevabı :)
[ruby]require ‘net/pop’

# Yeni bir POP3 nesnesi yaratılır.
pop = Net::POP3.new(‘pop3.sunucu.com’)
begin
# start method’u protokol oturumu baÅŸlatılır.
pop.start(‘kullanici.ismi@sunucu.com’, ‘password’)
puts “BaÅŸarı ile sunucuya baÄŸlanıldı..”

# E-postaları sonucudan alınır.
pop.mails.each do |msg|
msgHeader = msg.header.split(“\r\n”)
puts msgHeader.grep(/^From: /)
puts msgHeader.grep(/^To: /)
puts msgHeader.grep(/^Subject: /)

# Mesajın Body bölümü diğer bölümlerden ayrılır.
lastHeaderRow = msg.header.to_a[-1]
foundEndOfHeader = false
body = “”
msg.all.each_line do |line|
if line == lastHeaderRow && foundEndOfHeader == false
foundEndOfHeader = true
elsif foundEndOfHeader
body << line << "\n" end end if body.size > 100
puts “Body : #{body[0,100]}…”
else
puts “Body : #{body}”
end
end
rescue Exception => err
puts err.message
puts err.backtrace.join(“\n”)
ensure
pop.finish if pop.started?
puts “BaÅŸarı ile sonlandı..” unless pop.started?
end[/ruby]
Şimdi Ruby ile mail gönderelim, herhangi bir ekstra kütüphane kullanmadan.
[ruby]require ‘net/smtp’

Net::SMTP.start(‘smtp.sunucu.com’, 25, ‘domain.sunucu.com’, ‘kullanici.ismi@sunucu.com’, ‘sifre’) do |smtp|
smtp.ready(‘kullanici.ismi@sunucu.com’, ‘uordek at esiyo.net’) do |mail|
mail.write “From: kullanici.ismi@sunucu.com\n”
mail.write “To: uordek at esiyo.net\n”
mail.write “Subject: Merhaba\n”
mail.write “\n”
mail.write “test mailini\n”
end
end[/ruby]

Kolay gelsin :)

Ruby ile POP3 ve SMTP” üzerine 3 yorum

  1. mail gönderme ile ilgili olan kodda

    Net::SMTP.start('smtp.sunucu.com', 25, 'domain.sunucu.com', 'kullanici.ismi@sunucu.com', 'sifre') do |smtp|

    şöyle olucak galiba

    Net::SMTP.start('smtp.sunucu.com', 25, 'domain.sunucu.com', 'kullanici.ismi@sunucu.com', 'sifre', :login) do |smtp|

    diğer türlü 504 CRAM-MD5 authentication mechanism not supported
    gibi bir hata veriyor.

  2. Öncelikle yaptığın yorum için çok teşekkür ederim, Onur Topçu.
    Tabii aslında biraz daha dikkatli olmam gerekirdi, haklısın :) Ä°ÅŸin aslı ‘start’ methodunun kullanımı ÅŸu ÅŸekildedir.
    Net::SMTP.start( server=’localhost’, port=25, domain=ENV[‘HOSTNAME’], acct=nil, passwd=nil, authtype=:cram_md5 ) {| smtp | block }.
    Bu yazımda, kalın yazı ile belirtiÄŸim parametreyi kullanmadım. Bu nedenle varsayılan deÄŸer olarak “:cram_md5” deÄŸerini aldı.
    “:cram_md5” deÄŸerinin anlamı gönderilen kullanıcı bilgilerinin CRAM-MD5 yöntemi ile ÅŸifreleneceÄŸi,
    senin belirttiÄŸin “:login” deÄŸerinin anlamı ise herhangi ÅŸifreleme yöntemi yapılmayacağıdır.

    Sanırım, senin sınama yaptığın sunucu CRAM-MD5 şifrelemesini desteklemediği için bu şekilde bir hata almışsın.

  3. Açıklama için sağol şimdi tam olarak anladım.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir