前回の続きで、 今回は収集した情報を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 件のコメント:
コメントを投稿