LoginSignup
2
5

More than 5 years have passed since last update.

ScanSnapで領収書の読み込みをしたらデータがすぐfreeeに送信される方法(Mac編)

Last updated at Posted at 2018-04-05

なぜこんなものを作ろうかと思ったのか(前口上とも言う)。

freeeはMacでも使える→便利だ
freeeは領収書の画像を上げれば推測して仕訳を切ってくれる→便利だ
freeeは、しかし、画像を上げるためにはFinderを開けて、ドラッグ&ドロップしないといけない→不便だ!

な訳なもので、ScanSnapで読み込んだら自動的にfreeeに画像を飛ばせるようにするにはという覚え書です。

どうやって飛ばすのか(方法)

候補

freeeに領収書の画像を飛ばす方法は
・Webでドラッグ&ドロップ→それを自動で行うプログラムを書ける自信がない
・DropBoxに自動的に上げる→便利そうだけどもWeb上での操作が必要なのでボツ
画像ファイルをメールで送るこれならできそう!

てな訳で、ScanSnapで画像ファイルを読み込ませて、それをfreeeに自動的に送信するプログラム、と言うか、システムもどきを作りました。

方法を分解してみた。

こんな方法でfreeeに飛ばすようにしてみました。

  1. ScanSnapで画像を保存して、特定の場所に保存する。
  2. 画像の読み込みが終わったら自動送信プログラムを立ち上げる。
  3. 自動送信プログラムからメールで領収書画像をfreeeに送る。

システム(もどき)作成

逆の順番で説明します。つまり、自動送信プログラムの作成→自動送信プログラムを立ち上げるプログラムの作成→ScanSnapの設定、の順番です。

自動送信プログラムの作成

Python3で、フォルダにあるjpegファイルを抽出して、これらをメールで送るというものです。

jpegsender.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

import glob
import smtplib

#フォルダ内にあるJpegファイルの一覧を取得する。
#入力
#dir:対象となるフォルダ名(絶対パス、相対パスいずれも可)
#出力
#ファイル名を収納した配列(文字列)
def jpeglist(dir):
    ret = []

    files = glob.glob(dir + "/*")
    print(dir)

    for i in files:
        if (i[-4:] == ".jpg") | (i[-5:] == ".jpeg"):
            ret.append(i)

    return ret


encoding = 'utf-8'

FROM_ADDRESS  = "hogehoge@hoge.hoge" #送信者のメールアドレスを入れます。
TO_ADDRESS    = "hogehoge@hogehoge.co.jp" #freeeから指定された画像送信用のメールアドレスを入れます。
SMTP_SERVER     = "hogehoge.com" #サーバーのアドレスを入れます。
SMTP_PASSWORD = "hoge1234" #サーバーのパスワードを入れます。
JPEG_FOLDER   = "/Users/hoge/hoge/receipt" #画像を保存するフォルダ名を入れます。

msg1 = MIMEMultipart()
msg = MIMEText("recipt".encode(encoding), 'plain', encoding)
msg1['Subject'] = "send_message"
msg1['From']    = FROM_ADDRESS
msg1['To']      = TO_ADDRESS

files = jpeglist(JPEG_FOLDER)

for i in files:
    print(i)
    img = open(i, 'rb').read()
    mj = MIMEImage(img, 'jpeg', filename=i)
    mj.add_header("Content-Disposition", "attachment", filename=i)
    msg1.attach(mj)

msg1.attach(msg)

smtp = smtplib.SMTP(SMTP_SERVER, 587)
smtp.ehlo()
smtp.starttls()

smtp.ehlo()
smtp.login(FROM_ADDRESS, SMTP_PASSWORD)

smtp.sendmail(FROM_ADDRESS, [TO_ADDRESS], msg1.as_string())
smtp.close()

関数jpeglistで、jpegファイルの一覧を取得して、他の部分はメール文の作成、メールの送信を行っています。これはほとんど写経のようなもので、あまり人に見せられるものではない…。

自動送信するプログラムを立ち上げるアプリケーションを作成する。

先程のプログラムを自動的に立ち上げる
なんでこんなことをするかといいますと、MacでScanSnapからプログラムを立ち上げるのはアプリケーションが一番簡単だからなんです。
これは、 Macでシェルスクリプトを .appアイコン化する方法を参考に作りました。
方法はほとんどこのままで、シェルスクリプトの中のみ違います。
シェルの中に書くのはたった1行
python3 (Pythonファイルのある場所フルパス)/jpegsender.py
です。

ScanSnapの設定

実はこれが一番大変でした。

手順は以下のとおりです。
まず、ScanSnapのアイコンからメニューを呼び出して、
スクリーンショット 2018-04-05 18.46.33.png
設定をクリックします。

そうすると、設定画面が現れますので読み取り設定のところにある上下の矢印の部分をクリックして、
スクリーンショット 2018-04-05 18.51.02.png

メニューが出ますので、「新しい読み取り設定」をクリックして、

スクリーンショット 2018-04-05 18.52.39.png
名前の入力を求められますので適当な名前を入れておきます。新しい設定ができますので…。

スクリーンショット 2018-04-05 18.53.24.png
今度は先程作った、プログラムを実行するためのアプリケーションを設定するために、下の方にある「追加と削除…」を押します。

スクリーンショット 2018-04-05 19.23.10.png
上のような画面が出てきますので、「追加」を押して、プログラムを実行するためのアプリケーションを追加しておきます(ここではすでに追加されてますが…)。追加できたら、「閉じる」ボタンを押して、

元の設定の画面に戻りますので、「アプリケーションの選択」のところで、先程追加したアプリケーションを選択します。

次に、「アプリケーションの選択」の上にある「保存先」と書かれているタブをクリックして、

スクリーンショット 2018-04-05 20.26.32.png

先程、Pythonのファイルで設定したjpegファイルの参照先と同じになるようにイメージの保存先を設定します。

あとは適用を押して終わります。

問題点

ウイルス対策ソフトと和解せよ

このシステム(もどき)はウイルス対策ソフトと仲が悪く、警告が出ることも結構あります。
その場合は、手作業でこれは安全だよと設定することが必須です。

メールサーバーと和解せよ

私はこのシステム(もどき)においてメール送信はGMailをつかったのですが、当初ログインがブロックされました。というのも、信頼性が低いアプリと認定されたらしく設定を変えないといけないらしいです。
ただ、これはリスクを伴うので要注意。

TODO

  • 送り終えたファイルを別の場所に送るか、削除しないと次に送るときには二重送信されてしまうのでどうにかしないと。
  • 複数の事務所に対応できるようにしたい。会計事務所の人は複数箇所関わっているし。
  • サイズオーバー、サーバーの応答なし等エラーへの対応ができていないし。
  • スパゲッティコードをどうにかしないと。
  • あと、この文章のまとまりの無さもどうにかしないと。

参考文献

Pyhton で JPEG画像を添付してメールを送信
Macでシェルスクリプトを .appアイコン化する方法

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5