前回の続きで、 今回は収集した情報をKindle端末にメール送信してみたいと思います。
メール送信
メール送信するに当たり
Gemfileに以下のgemを追加します。gem "mail"
main.rbで追加したgemをrequireしますrequire 'mail'
メール送信部分の処理を追加します。gmailを使って送信を行います。
# 送信先メールアドレス(Kindle端末)
SEND_TO = 'XXXXXXX@kindle.com'.freeze
# 送信元メールアドレス(Gmail)
GMAIL_ADR = 'XXXXXXX@gmail.com'.freeze
# Gmailアカウントのパスワード
PASSWORD = 'XXXXXXXXXXXX'.freeze
# メール件名
SUBJECT = 'Github trends for a week.'.freeze
# メール送信メソッド
def send_mail
  # Gmail用のsmtpオプション
  options = {
            :address              => "smtp.gmail.com",
            :port                 => 587,
            :domain               => "smtp.gmail.com",
            :user_name            => GMAIL_ADR,
            :password             => PASSWORD,
            :authentication       => :plain,
            :enable_starttls_auto => true  }
  mail = Mail.new
  mail.to = SEND_TO
  mail.from = GMAIL_ADR
  mail.subject = SUBJECT
  mail.delivery_method(:smtp, options)
#  mail.add_file(※添付ファイル)
  mail.deliver
end
メールアドレスやパスワードは置き換えて下さい。
※
セキュリティ上、不明なアプリからのログインは通常認められていない為、
※
Net::SMTPAuthenticationErrorが発生した場合は認証の設定が必要です。セキュリティ上、不明なアプリからのログインは通常認められていない為、
- 安全性の低いアプリからのアクセスを許可する
- 2段階認証をONにしてアプリ用のパスワードを発行する
のいずれかを行う必要があります。
アカウント設定から設定できます。
アカウント設定から設定できます。
メールに添付するhtmlドキュメント作成
処理としては、Mechanizeで取得したトレンドデータをストックし、
erbを使ってhtmlに展開します。# Hashキー : リポジトリ名
KEY_REPOSITORY = :repository.freeze
# Hashキー : 作者名
KEY_AUTHOR = :author.freeze
# Hashキー : readme
KEY_README = :readme.freeze
# テンプレートファイル名
TEMPLATE_FILE = 'trends.html.erb'.freeze
# 作成htmlドキュメントファイル名
OUTPUT_FILE = 'trends.html'.freeze
# htmlドキュメント作成メソッド
def gen_html(trends)
  erb = ERB.new(File.read(TEMPLATE_FILE), nil, '-')
  ret = erb.result(binding)
  File.open(OUTPUT_FILE, "w:utf-8") do |f|
    f.write(ret)
  end
end
agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
page = agent.get('https://github.com/trending?since=weekly')
trends = []
page.search('h3 a').each do |link|
  trend = {}
  array = link.text.gsub(/(\s)/,"").split('/')
  # リポジトリ名の取得
  trend[KEY_REPOSITORY] = array[1]
  # 作者名の取得
  trend[KEY_AUTHOR] = array[0]
  # リポジトリのページへ遷移
  url = "#{GITHUB_TOP}#{link[:href]}"
  next_page = agent.get(url)
  # readmeの情報取得
  readme = next_page.at('#readme')
  trend[KEY_README] = readme
  # 配列に追加
  trends << trend
end
# html作成
gen_html(trends)
- テンプレートファイル
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="utf-8">
    <title>Github trends.</title>
  </head>
  <body>
<% trends.each do |trend| -%>
  <h1><%= trend[:repository] %></h1>
  <p><%= trend[:author] %></p>
  <hr>
  <pre><%= trend[:readme] %></pre>
  <br>
<% end -%>
  </body>
</html>
完成
これで一通りできたので、実際に試してみます。
Kindle端末に送信されれば成功です。
Kindle端末に送信されれば成功です。
- 送信されたドキュメントを開いた様子
画像やgifなどが表示されないのが残念な感じですが ><;
一応トレンドのリポジトリとreadme一覧がKindleで読めます^^;
一応トレンドのリポジトリとreadme一覧がKindleで読めます^^;
今回はテストでやってみましたが、今後色々と改良していきたいと思います。
- 完成したソース
# coding: utf-8
require 'erb'
require 'mail'
require 'mechanize'
GITHUB_TOP = 'https://github.com'.freeze
# Hashキー : リポジトリ名
KEY_REPOSITORY = :repository.freeze
# Hashキー : 作者名
KEY_AUTHOR = :author.freeze
# Hashキー : readme
KEY_README = :readme.freeze
# テンプレートファイル名
TEMPLATE_FILE = 'trends.html.erb'.freeze
# 作成htmlドキュメントファイル名
OUTPUT_FILE = 'trends.html'.freeze
# 送信先メールアドレス(Kindle端末)
SEND_TO = 'XXXXXXX@kindle.com'.freeze
# 送信元メールアドレス(Gmail)
GMAIL_ADR = 'XXXXXXX@gmail.com'.freeze
# Gmailアカウントのパスワード
PASSWORD = 'XXXXXXXXXXXX'.freeze
# メール件名
SUBJECT = 'Github trends for a week.'.freeze
# メール送信メソッド
def send_mail
  # Gmail用のsmtpオプション
  options = {
            :address              => "smtp.gmail.com",
            :port                 => 587,
            :domain               => "smtp.gmail.com",
            :user_name            => GMAIL_ADR,
            :password             => PASSWORD,
            :authentication       => :plain,
            :enable_starttls_auto => true  }
  mail = Mail.new
  mail.to = SEND_TO
  mail.from = GMAIL_ADR
  mail.subject = SUBJECT
  mail.delivery_method(:smtp, options)
  mail.add_file(OUTPUT_FILE)
  mail.deliver
end
# htmlドキュメント作成メソッド
def gen_html(trends)
  erb = ERB.new(File.read(TEMPLATE_FILE), nil, '-')
  ret = erb.result(binding)
  File.open(OUTPUT_FILE, "w:utf-8") do |f|
    f.write(ret)
  end
end
agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
page = agent.get('https://github.com/trending?since=weekly')
trends = []
page.search('h3 a').each do |link|
  trend = {}
  array = link.text.gsub(/(\s)/,"").split('/')
  # リポジトリ名の取得
  trend[KEY_REPOSITORY] = array[1]
  # 作者名の取得
  trend[KEY_AUTHOR] = array[0]
  # リポジトリのページへ遷移
  url = "#{GITHUB_TOP}#{link[:href]}"
  next_page = agent.get(url)
  # readmeの情報取得
  readme = next_page.at('#readme')
  trend[KEY_README] = readme
  # 配列に追加
  trends << trend
end
# html作成
gen_html(trends)
# メール送信
send_mail
 
0 件のコメント:
コメントを投稿