webスクレイピング技術はネットで効率よく情報収集するのに便利ですが、スクレイピングした情報をメールで確認することができれば、もっと便利になります。コレを応用すれば、
・決められた時間に株価をメールで通知・確認
・Webコミックが更新されたらメールで通知・確認
・サーバーで24時間作動しているプログラムの異常をメールで通知・確認
などなど、出来ることが一気に増えます、夢が広がりますね。
今回はPython3を使ってGmailでテキストを送る基本的な方法と、MIME形式でスクレイピング情報をまるっと送信する方法を紹介します。
【参考記事】seleniumで要素が取得できない時は6つの原因を疑え!
テキスト文をメールで送信
説明とか要らないから、早くコード見せんかい!
と考えている方もいると思うので、先にコードを公開します。
なお、このコードは無料で公開されている Automate the Boring Stuff with Python を参考にして書きました。
import smtplib address = input("Email_Address: ") password = input("Password: ") server = smtplib.SMTP("smtp.gmail.com", 587) server.starttls() server.login(address, password) server.sendmail(address, address, "Subject: test\nThis is a test.") server.quit() print("Email has been sent")
最初に smtplib モジュールをインポートします。SMTPとはインターネットで簡易メールを転送するためのプロトコル(規約)で、smtp.gmail.com, 587 と書くことで「Gmail で送信する」と教えています。
address と password の部分にメールアドレスと google のパスワードを書くわけですが、今回は安全上の理由とターミナルでテストすることを考えて、敢えてinputを使っています。
実際に Cron やタスクスケジューラで実行させる時はコードに書いても問題ないと思いますが、Github などに公開する時は環境変数を通して書くことをオススメします。
starttls() で TLS(Transport Layer Security) プロトコルを通して通信することを要求します。これによりメールの内容を第三者に読まれることを阻止できます。
sendmail() で第一引数を自分のメアド、第二引数を送信先のメアド、第三引数に件名と本文を記述します。Subject に \n が混ざっていますが、これで件名と本文を分けています。
最後に quit() で smtp プロトコルを抜けて、おまけで Success とターミナル越しに通知させます。
テキスト以外のコンテンツを送信したい場合
しかし、上記の方法ではテキスト(ASCII英数字)しか送信できません。つまり英文しかメールを送れません。
日本語や画像など英数字以外のコンテンツを送信するには、MIME という拡張仕様で送信させる必要があります。
そして、MIME を通してメール送信するには以下のようにコードを書き換えます。
from email.mime.text import MIMEText address = input("Email_Address: ") password = input("Password: ") msg = MIMEText("うえーい") msg['Subject'] = "コレで日本語でも画像でも送信できるよ" msg['From'] = address msg['To'] = address server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(address, password) server.sendmail(address, address, msg.as_string()) server.quit() print("Email has been sent")
smptlib ではなく、MIME関係のモジュールをインポートすることで、日本語文はもちろん画像や音声データなど様々な形式のデータを送ることが出来ます。
これを応用して、Web コミックの更新情報を gmail で教えてくれるプログラムを作りました。
【参考記事】Python×RSSでとなりのヤングジャンプの更新情報をスクレイピング
import datetime import urllib.request from bs4 import BeautifulSoup today = datetime.datetime.now() def rifle(): def onepunch(): def mazoku(): def mieruko(): def gmail(contents): gmail(onepunch()) gmail(rifle()) gmail(mazoku()) gmail(mieruko())
長くなるので全コードは書きませんが、これでスクレイピング情報をメールで確認することが出来るようになりました。
datetime.datetime.now() で日にちを出した後に %d で文字列にしてやれば、スクレイピングで得た更新日時と照会して個別に通知させることも出来ます。
これをレンタルサーバーの cron で時間を設定すれば「24時間webコミックの更新状況を監視するシステム」の出来上がりです。
【参考記事】プログラミング初心者だけどレンタルサーバーを使うメリットを語る
LINEでなく敢えてGmailを使う理由
LINE API を使うことで、メールでなく LINE で通知させるという手法もあります。
実際にボクもコレを試してみて、更新情報を確認するだけならこっちの方が簡単に見ることが出来ると思いました。
しかし、LINE ではなく敢えて Gmail で送信する方が良い場合もあると思います。
・LINE API に登録、トークンをもらう必要があるから実装が面倒
・会社の上司など比較的オフィシャルな場面で使う場合がある
パッと考えた感じ上記のようなシチュエーションが考えられます。もちろん最終的には両方使えるようになるのが良いと思うので、場合によって使い分けることが出来れば最強ですね。
まとめ
以上、Python で Gmail を送信する方法の紹介でした。
「スクレイピングした結果を Gmail で送信」というと複雑な事をやっているように見えますが、実際は簡単なので皆さんも是非やってみて下さい!
コメント