チームで情報共有する際、Dropboxを利用している人も多いだろう。しかし、たまに情報を確認したいだけなのに、Dropboxをインストールするほどでもないという場面もある。そんなときに活用したいのが、API経由でファイルを取得する方法だ。今回は、Pythonを使ってDropboxにあるExcelファイルを取得し、メール送信するツールを作ってみよう。
Dropboxは便利 - API経由でファイルにアクセスできる
Dropboxとは、言わずと知れたクラウドストレージサービスだ。ファイルをクラウド上に保存することで、パソコンやスマートフォンなど、様々なデバイスからアクセスできるのが特徴だ。また、チームでファイルを共有する際にも便利だ。
今回は、DropboxにAPI経由でアクセスして、任意のファイルをダウンロードするプログラムを作る。そもそも「API (Application Programming Interface)」とは、ある機能を外部のプログラムから利用できるようにするための「窓口」のようなものだ。昨今のWebサービスやアプリではAPIが公開されていることが多く、それを利用することで様々なサービスと連携できる。
Dropboxもこの仕組みを提供しており、APIを利用することでDropbox上のファイルをプログラムから操作できる。Python向けには、公式のDropboxパッケージが提供されている。
pipコマンドを使ってインストールしよう。ターミナル(WindowsならPowerShell、macOSやLinuxならターミナル)を起動して、次のコマンドを実行しよう。このコマンドは、DropboxのAPIを操作するパッケージをインストールするものだ。
pip install dropbox
Dropboxの認証情報を取得しよう
ただし、APIを利用するにはDropboxの認証情報が必要だ。まずはブラウザでこちらにあるDropboxの開発者向けサイトにアクセスし、ログインしよう。そして、「アプリを作成」ボタンをクリックしよう。画面は英語だが、基本的には選択していくだけで大丈夫だ。
最初の画面では、アプリの名前を指定する必要がある。この名前は世界中で一意である必要がある。そのため、「FileReader20260406-1613」のように日時やランダムな数字を付けるか、自分の名前やドメイン名などと組み合わせて指定しよう。そして「Create App(アプリ作成)」ボタンをクリックしよう。
次に、アプリの設定をする画面が表示される。まずは、アプリにファイルの読み込み権限を与えよう。「Permissions(権限)」をクリックして、権限一覧の中から「files.content.read(ファイルコンテンツ読み込み)」にチェックを入れて「Submit」ボタンをクリックしよう。
今回は自分のDropboxにアクセスできるアプリを作るだけなので、特に設定は変更せず、そのまま下にスクロールして、「OAuth 2」のところにある「Generate access token(アクセストークンの作成)」ボタンをクリックしよう。すると、APIアクセスに必要なトークンが生成される。このアクセストークンをコピーしよう。
なお、筆者がハマったのは、先に権限を変更してからアクセストークンを作成しなければならない点だ。もし先にアクセストークンを作成してしまった場合は、権限を変更した後でブラウザ画面をリロードし、アクセストークンを取得し直そう。
アクセストークンを環境変数に登録しよう
アクセストークンを取得したら、APIから手軽に使えるように環境変数へ登録しよう。Windowsであれば、コントロールパネルを開いて、「システム」→「詳細システム設定」→「環境変数」と進み、「システム環境変数」の「新規」をクリックして、変数名に「DROPBOX_ACCESS_TOKEN」、値にコピーしたトークンを貼り付けよう。
macOSであれば、ZSHの設定ファイル「~/.zshrc」に下記を追記して、ターミナルで「source ~/.zshrc」を実行して反映させよう。
export DROPBOX_ACCESS_TOKEN="ここにコピーしたトークンを貼り付ける"
簡単なプログラムを作成しよう
以上で準備完了だ。次のプログラムを実行してテストしてみよう。これは、Dropboxのルートディレクトリにあるファイルの一覧を表示するものだ。「files.py」という名前で保存しよう。
import os
import sys
import dropbox
# トークンを環境変数から取得 --- (※1)
TOKEN = os.environ.get("DROPBOX_ACCESS_TOKEN")
if not TOKEN:
print("環境変数 DROPBOX_ACCESS_TOKEN が設定されていません。")
sys.exit(1)
# Dropboxに接続 --- (※2)
dbx = dropbox.Dropbox(TOKEN)
# ルートディレクトリのファイル一覧を取得して表示
print("--- Dropbox ルートのファイル一覧 ---")
try:
# ファイル一覧を取得 --- (※3)
res = dbx.files_list_folder('') # ルート('')を指定
for entry in res.entries:
# フォルダかどうか判定 --- (※4)
if isinstance(entry, dropbox.files.FolderMetadata):
print(f"フォルダ: {entry.name}")
elif isinstance(entry, dropbox.files.FileMetadata):
print(f"ファイル: {entry.name}")
except dropbox.exceptions.ApiError as err:
print(f"APIエラーが発生しました: {err}")
ターミナルで次のコマンドを実行してみよう。
python files.py
すると、次の画面のように、Dropboxのルートディレクトリにあるファイル一覧が表示されるはずだ。
プログラムを簡単に確認しよう。(※1)は環境変数からトークンを読み込んでいる。トークンは、先ほど取得したアクセストークンだ。そして、(※2)でDropboxに接続し、(※3)でファイル一覧を取得している。最後に(※4)でフォルダかどうか判定して、ファイル名を表示している。
ファイルを取得してメール送信するツールを作ろう
それでは、次に、実際にDropboxからファイルをダウンロードして、メールで送信するプログラムを作ってみよう。
なお、メール送信に関しては、本連載の112回目と123回目で扱っているので、そちらも参照してほしい。
改めて設定方法を書くと、Googleアカウントの設定で二段階認証を有効にした上で、アプリパスワードを発行する。
その後、SMTP送信のための環境変数を設定しよう。設定するのは以下の2つだ。
- GMAIL_ACCOUNT: Gmailのメールアドレスを指定
- GMAIL_PASSWORD: Googleアカウント設定で発行したアプリパスワード
今回は、Dropboxにある「売上データ.xlsx」というファイルをダウンロードし、メールで送信するプログラムを作ってみた。読者の用途に応じて書き換えて使ってほしい。以下のプログラムを「send.py」という名前で保存しよう。プログラムは、こちらにもアップロードしている。
"""DropboxからファイルをダウンロードしてGmailで送信"""
import os
import dropbox
import smtplib
from email.message import EmailMessage
import sys
# 定数の設定 --- (※1)
MAIL_TO = "mailto@example.com" # ★要変更 - メールを送信する宛先を指定
DROPBOX_FILE = "/売上データ.xlsx" # ★要変更 - 送信したいファイル
DIR_ROOT = os.path.dirname(os.path.abspath(__file__))
LOCAL_FILE = os.path.join(DIR_ROOT, "売上データ.xlsx")
# 環境変数からトークンなどを読み取る --- (※2)
TOKEN = os.environ.get("DROPBOX_ACCESS_TOKEN")
GMAIL_ACCOUNT = os.environ.get("GMAIL_ACCOUNT")
GMAIL_PASSWORD = os.environ.get("GMAIL_PASSWORD")
def download_file(local_path, dropbox_path) -> bool:
"""Dropboxからファイルをダウンロードする""" # --- (※3)
dbx = dropbox.Dropbox(TOKEN)
try:
dbx.files_download_to_file(local_path, dropbox_path)
print("ファイルをダウンロードしました:", dropbox_path)
return True
except dropbox.exceptions.ApiError as err:
print(f"APIエラーが発生しました: {err}")
return False
def send_mail():
"""GMAILでメール送信""" # --- (※4)
msg = EmailMessage()
msg["From"] = GMAIL_ACCOUNT # 送り主
msg["To"] = MAIL_TO # 送り先
# 件名の指定
msg["Subject"] = "Dropboxからダウンロードしたファイル"
# 本文の指定
msg.set_content("Dropboxからダウンロードしたファイルを添付します。")
with open(LOCAL_FILE, "rb") as f:
msg.add_attachment(f.read(),
maintype="application",
subtype="octet-stream",
filename=os.path.basename(LOCAL_FILE))
try:
# ログインして送信 --- (※5)
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
smtp.login(GMAIL_ACCOUNT, GMAIL_PASSWORD)
smtp.send_message(msg)
print("メールを送信しました!")
except Exception as e:
print(f"メール送信中にエラーが発生しました: {e}")
def main():
"""メイン処理""" # --- (※6)
if download_file(LOCAL_FILE, DROPBOX_FILE):
send_mail()
if __name__ == "__main__":
if not (TOKEN and GMAIL_ACCOUNT and GMAIL_PASSWORD):
print("環境変数を設定してください")
sys.exit(1)
main()
プログラムを実行するには、ターミナルで次のコマンドを実行しよう。ただし、(※1)のメールの送り先やDropboxのファイル名は変更しよう。
python send.py
すると、Dropboxからファイルがダウンロードされ、メールが送信される。送信後にGmailを開き、正しく送信できたか確認してみよう。次の画面のように、メールが送信されたことが表示されるはずだ。
簡単にプログラムを確認しよう。(※1)ではメールの送り先とDropboxのファイル名を指定している。そして、(※2)では環境変数からトークンなどを読み込んでいる。その後、(※3)でDropboxからファイルをダウンロードして、(※4)でメールを送信する。最後に(※5)でGmailにログインしてメールを送信する。(※6)はメイン処理だ。
まとめ
今回は、DropboxからダウンロードしたファイルをGmailで送信するプログラムを作ってみた。DropboxのAPIは公式に提供されており、とても扱いやすいと感じた。開発者サイトでトークンを発行する手間はあるものの、一度手順を覚えてしまえば、次回以降はスムーズに利用できるだろう。
今回作成したプログラムでは、ファイルのダウンロードとメール送信を別々の関数に分けている。そのため、複数ファイルのダウンロードに対応させるなどの改良も難しくない。実際にこのプログラムを活用して、日々の作業の自動化に挑戦してみよう。なお、プログラムを、長期間にわたり運用しようとすると、アクセストークンの有効期限切れの問題に直面するだろう。この点については、次回、改良方法を紹介する。お楽しみに。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。これまで50冊以上の技術書を執筆した。直近では、「大規模言語モデルを使いこなすためのプロンプトエンジニアリングの教科書(マイナビ出版)」「Pythonでつくるデスクトップアプリ(ソシム)」「実践力を身につける Pythonの教科書 第2版」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」など。






