【Ruby】メールを送受信する

2016年2月6日Ruby

こんにちは、しきゆらです

今回は、Rubyでメールの送受信をやってみます

 

追記:2016年3月27日

net/smtpのリンクが間違っていたのを修正しました

なぜか、リンク先が「何も言えなくて・・・夏」になってました

いい曲ですけどね

 

追記:2017年10月18日

スクリプトを少し書き換えたものを新しく投稿しました。

【Ruby】メールを送信する

 


 

 

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へログインし、設定を開きます

1

開いたら、青線で囲んだ部分「メール転送とPOP/IMAP」をクリック

その中で2

青線で囲んだ部分「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段階認証を行った端末などが一覧で表示されます

ここから
3

青線で囲んだ部分の「端末を選択」の部分で「その他の名前」を選択します

ここに、適当な名前を付けて[生成」をクリックすることで生成できます

(あとから見てもわかるような名前を付けるといいと思います)

 

生成されたパスワードを、上記コードの

mail.start('localhost', from, pass)

の「pass」のところに入れてあげると送信できると思います

 

これでメールの送信はできるようになりました!

あとはメールの確認をしたいですね

・・・ですが、現在はメールの確認ができません

「net/imap」を使っても「Net::IMAP.new」で怒られてしまいます

「SSL_connect returned=1 errno=0 state=error: certificate verify failed 」と出るので証明書関連なんでしょうが

証明書のある場所を指定してやっても上手くいかない状況です

この辺はもう少しいろいろやってみてからまた記事にしますね

 

おわり

Ruby

Posted by shikiyura