FLYING

/* TODO: 気の利いた説明を書く */

Ruby1.9.1でsmtp.gmail.comを使ってメールを送ろうとするとunknown protocol

mswin32版もfreebsd7版も同じ状況。

require 'kconv'
require 'net/smtp'

class Mail
	attr_accessor :to, :from, :subject, :body
	
	def encoded
		# 参考: http://code.nanigac.com/source/view/108
		packed = @subject.tojis.split(//,1).pack('m').chomp
		encoded_subject = "=?ISO-2022-JP?B?" + packed.gsub('\n', '') + "?="
		
		header = <<HEADER_END
To: #{@to}
From: #{@from}
Mime-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: Text/Plain; charset=iso-2022-jp
Subject: #{encoded_subject}
Date: #{Time.now.rfc2822}
HEADER_END
		
		# 参考: http://d.hatena.ne.jp/takehikom/20091122/1258835349
		(header + "\n" + @body).tojis.force_encoding("US-ASCII")
	end
end

class SendGMail
	attr_accessor :account, :password
	
	def initialize(account, password)
		@account = account
		@password = password
	end
	
	def send(mail)
		smtp = Net::SMTP.new("smtp.gmail.com", 587)
		smtp.enable_tls
		smtp.start("localhost.localdomain", @account, @password, :login) {|smtp|
			smtp.sendmail(mail.encoded, mail.from, mail.to)
		}
	end
end

こんな感じのコードでSendGMail#sendすると下記の例外が。

/usr/local/lib/ruby/1.9/net/smtp.rb:580:in `connect'
/usr/local/lib/ruby/1.9/net/smtp.rb:580:in `tlsconnect'
/usr/local/lib/ruby/1.9/net/smtp.rb:553:in `do_start'
/usr/local/lib/ruby/1.9/net/smtp.rb:525:in `start'
gmail.rb:108:in `send'
gmail.rb:172:in `block in <main>'
gmail.rb:170:in `each'
gmail.rb:170:in `<main>'
SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol

1.8系でtlsmail使って送信したときはうまくいったんだけどなあ。ググっても全然情報が出てこなくてヽ(`Д´)ノウワァァン

できた

SMTPサーバーに接続する部分を次のように書き換えたら送信できた。

smtp = Net::SMTP.new("smtp.gmail.com", 465)
smtp.enable_ssl
smtp.start("localhost.localdomain", @account, @password, :login) {|smtp|
	smtp.sendmail(mail.encoded, mail.from, mail.to)
}

TLSはダメでSSLはイケるのか……よく分からないっス。