よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

Gmailではてなブログに投稿する

はてなブログにメールで投稿するこちらの続き。



メール送信のPythonコード参考



以下、Jupyter Notebookで作業する。

セルにそのままコピペし実行すると次のようなものが出来上がる。

.(Send_mailフォルダ)

├── Gmailではてなブログに投稿する.md
├── __pycache__
│   ├── get_title_and_text.cpython-37.pyc
│   └── my_gmail_config.cpython-37.pyc
├── get_title_and_text.py
├── my_gmail_config.py
└── send_mail.py



mdファイルだけ(このファイルipynbをmdに変換させたもの)はSend_mailというフォルダに移動させた。



ここから実装




フォルダ作成と移動


↓を実行するとカレントディレクトリに「Send_mail」フォルダが作成され、そこに移動する。

%mkdir Send_mail
%cd Send_mail
/storage/emulated/0/qpython/notebooks/Send_mail


※「notebooks」というカレントディレクトリで作業している。



メルアドとメール投稿用アドレスの設定ファイル作成


メール送信用で自身のメールアカウントとパスワード、はてなブログのメール投稿アドレスの設定用ファイルを作成する。
後で自身のものに書き換えてください。

%%writefile my_gmail_config.py

my_gmail_account = "自分のメールアカウント" # "xx@gmail.com"
my_gmail_password = "自分のgoogleパスワード" # "xx@gmail.comのパスワード"

hatenablog_mail_address = "はてなブログの設定に載っているメール投稿用アドレス"  # 下書き用で実験
Writing my_gmail_config.py



markdownファイルからファイル名とファイルの中身を取り出す


ブログをmarkdown記法で投稿する設定にしている。そのためファイルもmarkdown形式。
mdファイルのファイル名=ブログタイトル、本文=mdファイルの中身を取得するファイルを作成する。

%%writefile get_title_and_text.py

import glob
import os

# Send_mailフォルダ内の全mdファイルをリストで取得
lst = glob.glob("*md")

for file in lst:
    # メールのsubject=title(拡張子切り離し)
    title = os.path.splitext(file)[0]
    
    # メール本文 body=text
    with open(file,"r") as f:
        text = f.read()
Writing get_title_and_text.py



メール投稿用プログラムファイル作成


メール送信で投稿するファイルの作成。

%%writefile send_mail.py

import my_gmail_config
import get_title_and_text

import smtplib, ssl
from email.mime.text import MIMEText

# 以下にGmailの設定を書き込む★ --- (*1)
gmail_account = my_gmail_account
gmail_password = my_gmail_password
# メールの送信先★ --- (*2)
mail_to = hatenablog_mail_address

# メールデータ(MIME)の作成 --- (*3)
subject = title
body = text
msg = MIMEText(body, "html")
msg["Subject"] = subject
msg["To"] = mail_to
msg["From"] = gmail_account

# Gmailに接続 --- (*4)
server = smtplib.SMTP_SSL("smtp.gmail.com", 465,
    context=ssl.create_default_context())
server.login(gmail_account, gmail_password)
server.send_message(msg) # メールの送信
print("ok.")
Overwriting send_mail.py



ここまでをJupyter Notebookにコピペして実行すれば、Send_mailなるフォルダと、その中に3つの.pyファイルが作られる。

あとはターミナルでSend_mailフォルダに移動し
python send_mail.pyと打つか、Jupyter Notebookからマジックコマンドで%run send_mail.pyを実行すればメール投稿される。
だがしかし、エラーが出ると思う。というか出た。
一番最初に貼り付けたマイナビクジラ飛行机さんの記事こちらにもあるように、Gmailのセキュリティに引っ掛かる。
オライリー『退屈なことはPythonにやらせよう』に載っている方法を使う。
Googleアプリパスワード詳細】
Sign in using App Passwords - Google Account Help



Googleアカウントログイン - Google アカウントにログインし、
セキュリティ
最近のセキュリティイベント
アプリパスワードの生成
Pythonのメール送信など適当な名前を付け
「生成ボタン」
パスワードが表示
→コピー
my_gmail_config.pyのパスワードに貼り付け


これでもう一度ターミナルからpython send_mail.pyを実行すると、たぶんはてなブログに投稿される。というか投稿された。



おわりに


これで、投稿するmarkdownファイルをSend_mailフォルダに入れてpython send_mail.pyを実行すれば、公開か下書きで投稿できるようになった。
本文を投稿フォームにコピペしタイトルを書いて投稿する微々たる手間を省ける。(^q^)



以上、自己満投稿でした。



追記
これでは複数のmdファイルを連続投稿できないな…。mdファイルをfor文で処理する所に送信処理する関数(関数化してないけど)を呼び出す必要があった。