見出し画像

Ubuntu上のNextcloudからGmailへバックアップ済み以外をバックアップするPythonスクリプト

Nextcloudを利用しているので、シンプルなバックアップのスクリプトを用意しました。Googleドライブだと共有ミスが心配。テキストエディタで文章を書くと、バックアップしてくれます。Nextcloud側のノートの名前の変更なども行いたいですが、とりあえずコピペの手作業は無くせたのでバックアップ漏れの可能性は減らせています。

pipが入っておらず、

上記もChatGPT+に質問して解決しています。なので、Ubuntuの基本(rootとかファイルの場所とか、名前をつけて保存とか)が分かれば、質問してどうにかなります。

というわけで、昨日の環境より便利になりました。

import os  # ファイルやディレクトリ操作のための標準ライブラリ
import shutil  # ファイルの移動などの操作を行うライブラリ
import smtplib  # SMTPを使ってメールを送信するためのライブラリ
from datetime import datetime  # 日付を扱うためのモジュール
from email.mime.text import MIMEText  # メール本文を作成するためのクラス
from email.header import Header  # メールのヘッダー(件名など)をエンコード付きで作成
from email.utils import formataddr  # メールの差出人名付きアドレスを整形するため
import markdown  # MarkdownをHTMLに変換するための外部ライブラリ

# ===== 設定 =====
note_dir = "Nextcloudのパス"  # ノートが保存されているフォルダのパス
archive_dir = os.path.join(note_dir, "送信済み")  # 処理済みノートを移動するフォルダ
gmail_address = "自分のGmailアドレス"  # 送信元兼宛先のGmailアドレス
app_password = "アプリパスワード"  # Gmail用のアプリパスワード(2段階認証時に必要)

# ===== 処理対象のノートを収集 =====
entries = []  # ノートのタイトルと内容を格納するリスト
os.makedirs(archive_dir, exist_ok=True)  # 送信済みフォルダがなければ作成する

for filename in os.listdir(note_dir):  # ノートフォルダ内のファイルをすべて確認
    if filename.endswith(".md"):  # 拡張子が .md(Markdown)であるファイルのみ対象
        path = os.path.join(note_dir, filename)  # フルパスを作成

        # 送信済みフォルダ内のファイルはスキップする
        if os.path.commonpath([path, archive_dir]) == archive_dir:
            continue

        with open(path, "r", encoding="utf-8") as f:  # ノートファイルをUTF-8で開く
            content = f.read()  # 内容を読み込む

        lines = content.strip().splitlines()  # 各行に分割してリスト化
        title_line = next((line for line in lines if line.startswith("# ")), None)  # 見出しを取得
        title = title_line[2:].strip() if title_line else filename.replace(".md", "")  # タイトルがなければファイル名から取得
        date_str = datetime.now().strftime("%Y-%m-%d")  # 現在の日付を文字列で取得
        new_filename = f"{date_str}_{title}.md"  # 新しいファイル名(送信日+タイトル)を作成
        new_path = os.path.join(archive_dir, new_filename)  # 新しいファイルの保存先を作成
        shutil.move(path, new_path)  # 元ファイルを送信済みフォルダに移動
        entries.append((title, content))  # タイトルと内容を記録

# ===== MarkdownをHTMLに変換 =====
html_body = "<html><body><h1>Nextcloud ノートまとめ</h1>"  # HTMLの本文ヘッダー

for title, md_content in entries:  # 収集したノートを順に処理
    html_content = markdown.markdown(md_content)  # MarkdownをHTMLに変換
    html_body += f"<h2>{title}</h2>{html_content}<hr>"  # HTML本文に追記(タイトル付き)

html_body += "</body></html>"  # HTML本文を閉じる

# ===== メール送信 =====
if entries:  # 処理すべきノートがある場合のみ実行
    msg = MIMEText(html_body, "html", "utf-8")  # HTMLメール本文を作成
    msg["Subject"] = Header("Nextcloud ノート バックアップ", "utf-8")  # 件名をUTF-8で指定
    msg["From"] = formataddr((str(Header("Nextcloud Bot", "utf-8")), gmail_address))  # 差出人名を設定
    msg["To"] = gmail_address  # 宛先を自分自身に設定

    try:
        with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:  # GmailのSMTPサーバにSSLで接続
            server.login(gmail_address, app_password)  # アプリパスワードでログイン
            server.send_message(msg)  # メールを送信
        print("送信成功")  # 成功メッセージ
    except Exception as e:
        print("送信失敗:", e)  # エラー内容を表示
else:
    print("送信対象のノートはありませんでした。")  # 処理すべきファイルがなかった場合のメッセージ

NotionかGoogleドライブなどを利用すれば済む話なのですが……。Ubuntuを間に入れると柔軟にいろいろできそうです。



いいなと思ったら応援しよう!

三澤直己 | カラストラガラ / Trgr | フォロバ100% ここまでお読み下さり感謝。各種SNSでのシェアも励みになります。非営利の取り組みが多いため、チップのご検討、助かります。