【Ruby】メールを送受信する
こんにちは、しきゆらです
今回は、Rubyでメールの送受信をやってみます
追記:2016年3月27日
net/smtpのリンクが間違っていたのを修正しました
なぜか、リンク先が「何も言えなくて・・・夏」になってました
いい曲ですけどね
追記:2017年10月18日
スクリプトを少し書き換えたものを新しく投稿しました。
Rubyでのメール送受信というと、「Mail」というgemを使う方法が一般的なようですが
今回は標準で入っているライブラリの「net/smtp」などを用いてやってみます
なお、Windows8.1上でMingw64+MSYS2環境で行いました
(コマンドプロンプトからは送信ができませんでした)
上記リンクのなかの「とにかくメールを送る」の部分を使います
メール本体の書式は以下のようにするようです
Date: 日付 From: 送信元アドレス To: 送信先アドレス Subject: 題名 Mine-Version: 1.0 Content-Type: text/plain; charset=utf-8 本文
では、実際にやってみます
今回はGmailを使うので、Gmailの設定を行う必要があります
Gmailへログインし、設定を開きます
開いたら、青線で囲んだ部分「メール転送とPOP/IMAP」をクリック
青線で囲んだ部分「IMAPアクセス」のところの「IMAPを有効」にします
これで設定を保存すれば準備完了です
コードは以下のような感じで
from = "from@example.com" to = "to@example.com" subject = "Test Mail by Ruby!!2" body = "send mail by Ruby!!" content = <<EOS Date: #{Time::now.strftime("%a, %d %b %Y %X")} From: #{from} To: #{to} Subject: #{subject} Mine-Version: 1.0 Content-Type: text/plain; charset=utf-8 #{body} EOS puts "Sending Mail ..." # メール送信部分 mail = Net::SMTP.new('smtp.gmail.com', 465) mail.enable_ssl mail.start('localhost', from, pass) mail.send_mail(content , from, to) mail.finish puts "end"
これでメールが送信されるはずです
わざわざmailという変数を用いず、startメソッドにブロックを与えることでひとまとめにできるようですが
その場合、sslを有効にする方法がよくわからなかったので今回はこんな感じにしました
なお、GmailのIMAPのポート番号などの情報はこちらで確認できます
もし、以下のようなエラーが出る場合、もうひと手間かける必要があります
`check_auth_response': 534-5.7.9 Application-specific password required. Learn more at (Net::SMTPAuthenticationError)
このエラーは、Gmailで2段階認証を有効にしている場合に出るようです
この場合は、Googleの2段階認証の設定を行います
こちらのサイトに飛び
「2段階認証プロセス」→「アプリ固有のパスワード」→「アプリ固有のパスワードの管理」
の順にクリックしていきます
すると、2段階認証を行った端末などが一覧で表示されます
青線で囲んだ部分の「端末を選択」の部分で「その他の名前」を選択します
ここに、適当な名前を付けて[生成」をクリックすることで生成できます
(あとから見てもわかるような名前を付けるといいと思います)
生成されたパスワードを、上記コードの
mail.start('localhost', from, pass)
の「pass」のところに入れてあげると送信できると思います
これでメールの送信はできるようになりました!
あとはメールの確認をしたいですね
・・・ですが、現在はメールの確認ができません
「net/imap」を使っても「Net::IMAP.new」で怒られてしまいます
「SSL_connect returned=1 errno=0 state=error: certificate verify failed 」と出るので証明書関連なんでしょうが
証明書のある場所を指定してやっても上手くいかない状況です
この辺はもう少しいろいろやってみてからまた記事にしますね
おわり