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 :)
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.
Ö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.
Açıklama için sağol şimdi tam olarak anladım.