[ruby-list:49671] Re: net/smtp sslでのwhileループメール送信
From:
Taiki Kimura <taikimura8182@...>
Date:
2013-11-14 08:58:17 UTC
List:
ruby-list #49671
お世話になっております。
メール送信が上手くできていなかった件ですが、
宛先アドレスを指定していたヒアドキュメントの改行コードが問題で
end of file reached (EOFError)
このようなエラーがでて送信できなかったことがわかりました。
そこで、知人のアドバイスにより次のようなコードで試したところ期待通りの動作が確認できました。
------------------------------------------------------
#送信先リスト
to_list = <<EOF
aaa1@hoge.net
aaa2@hoge.net
aaa3@hoge.net
EOF
# fromとtoからメッセージ本文を作って返す
def msg(from, to)
<<EOF
From: #{from}
To: #{to}
Subject: SES Mail TEST
Date: #{Time.now.to_s}
\r\n
てすとめーる
\r\n
EOF
end
# smtp初期化
smtp = Net::SMTP.new(HOST, PORT)
smtp.enable_ssl
# to_listの各行を処理
to_list.lines do |to|
# 改行コードを抜く
to = to.gsub("\r\n", "").gsub("\r", "").gsub("\n", "")
# 送信処理
smtp.start(HELO, ACCESS_KEY, SECRET_KEY, :plain) {|s|
s.send_message msg(from, to), from, to
}
end
------------------------------------------------------
また、
※to_listのヒアドキュメントの代わりに、宛先メールアドレスをdata.txtに書き、
input = open("data.txt")としても期待通りに動くことが確認できました。
※gsubの代わりにto = to.chompでも期待通りに動くことが確認できました。
これでやりたいことができるようになりましたので、
今回のコードを参考にして基本的なことの理解を深めるようにしたいと思います。
いろいろご教示いただきましてありがとうございました!
2013/11/13 Taiki Kimura <taikimura8182@gmail.com>:
> 下田さん
>
>
> こちらの通りに書いてテストしているのですが、
>
> ----------------------------------------------
> # smtp初期化
> smtp = Net::SMTP.new(HOST, PORT)
> smtp.enable_ssl
>
> # to_listの各行を処理
> to_list.lines do |to|
> # 送信処理
> smtp.start(HELO, ACCESS_KEY, SECRET_KEY, :plain) {|smtp|
> smtp.send_message msg(from, to), from, to
> }
> end
> ----------------------------------------------
>
> やはり、最初に投稿した時に掲示したエラーと同じエラーがでてメール送信ができません。。。
>
> ----------------------------------------------
> /usr/local/lib/ruby/site_ruby/1.9.1/openssl/buffering.rb:174:in
> `sysread_nonblock': end of file reached (EOFError)
> from /usr/local/lib/ruby/site_ruby/1.9.1/openssl/buffering.rb:174:in
> `read_nonblock'
> from /usr/local/lib/ruby/1.9.1/net/protocol.rb:141:in `rbuf_fill'
> from /usr/local/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
> from /usr/local/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:929:in `recv_response'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:915:in `block in getok'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:939:in `critical'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:913:in `getok'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:907:in `quit'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:613:in `do_finish'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:522:in `ensure in start'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:522:in `start'
> from test.rb:38:in `block in <main>'
> from test.rb:36:in `lines'
> from test.rb:36:in `<main>'
> ----------------------------------------------
>
>
> で、エラーメッセージから推測して調べたところ、
> ↓このモジュールを有効にする必要があるのでは???と予測しておりますが見当違いでしょうか。
>
> http://fistfvck.sakura.ne.jp/ruby/rurima-1.9.3/class/-open-s-s-l=3a=3a-buffering.html
>
>
> ちなみに、試しに、smtp.enable_sslを、
> smtp.enable_ssl(OpenSSL::Buffering)と書いてみたところエラーメッセージが変わりました。
> こちらsmtp.enable_ssl(OpenSSL::Buffering)の場合のエラーメッセージです。
>
> ----------------------------------------------
> /usr/local/lib/ruby/1.9.1/net/smtp.rb:575:in `initialize': wrong
> argument (Module)! (Expected kind of OpenSSL::SSL::SSLContext)
> (TypeError)
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:575:in `new'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:575:in `ssl_socket'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:580:in `tlsconnect'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:551:in `do_start'
> from /usr/local/lib/ruby/1.9.1/net/smtp.rb:519:in `start'
> from test.rb:38:in `block in <main>'
> from test.rb:36:in `lines'
> from test.rb:36:in `<main>'
> ----------------------------------------------
>
>
>> ところで別件なのですが
>> MLに同じテーマの話題を投稿するときは
>> 自分が返信したいメールにそのまま「返信」しましょう。
>
> 了解しました。
> 一応、非常に簡単にではありますが、
> 過去の投稿で似たようなものがないかを調べてみたのですが、
> 同じようなテーマでの投稿をみつけられなかったので新規で投稿してしまいました。