http://esiyo.net - uordek.essiyoo.each { |yazi| esiyo.net << yazi }

Ruby ile POP3 ve SMTP

13.01.2007, yazan Tankut ŞENTÜRK

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ı :)

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

Şimdi Ruby ile mail gönderelim, herhangi bir ekstra kütüphane kullanmadan.

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

Kolay gelsin :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails)

3 Yorum

  1. onur topçu

    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. Tankut ŞENTÜRK

    Ö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. onur topçu

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

Yaz aklındakini, çekinme :)

Lütfen: Yorumunuzun değerlendirilmesi ve yayınlanması uzun sürebilir. Yorumunuzu tekrar göndermeniz için bir neden yoktur, inanın tüm yorumları yayınlıyorum. Bazıları hariç :).