読者です 読者をやめる 読者になる 読者になる

FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

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はイケるのか……よく分からないっス。