Outlook Power Automate Python

リモートワークで必要になった出退勤手入力作業をPythonで自動化する 回答する


#自動化 #PowerAutomate #Python #働き方改革関連法 #入退室管理 #出勤表

働き方改革関連法が施行されて以降、私が勤めている会社でも出退勤管理をするようになり、当初はみんなオフィスに出勤していたので、入居ビルの入退室管理システムで十分でした。そこにコロナが直撃し、リモートワークが多くなり、自宅から働いている人は出勤表システムに直接入力が必要になり、これが案外面倒!ということで、自動化したいという声が上がっています。

案としては、

①出勤:Outlookから最初に送信したメール時刻

②退勤:Outlookから最後に送信したメール時刻

をまずは、第一段階として取得したいと考えています。

が、私Pythonまだ初心者なので、どなたかお分かりになる方教えてください!

Power Automateを使った方法も大歓迎です。

Jetsetter 2021.04.24 09:30:40 (2021.05.08 15:08:54 更新) 206

コメントする

コメントするには ログイン していただく必要があります。

回答 1


こんにちは、アンドノート公式アカウントです。アンドノートのご利用ありがとうございます。

Pythonを利用する場合、次のようなコードで本日最初に送信したメールと最後に送信したメールの時刻を取得することができます。

こちらは、メールサービスとしてOutlook 365を利用している場合の例になりますが、例えばGmailの場合はimap_hostをimap.gmail.comにすれば利用が可能だと思います。

usernameにはメールアドレスを、passwordにはパスワードを設定してください。

また、送信済みのメールを含むメールボックス名(この例では「送信済みアイテム」)も利用環境によって違うと思いますので、適宜mailboxを変更してみてください。

import imaplib
import email.utils
import time
import base64

# 参考:https://stackoverflow.com/questions/12776679/imap-folder-path-encoding-imap-utf-7-for-python
def utf7_encode(s):
    """"Encode a string into RFC2060 aka IMAP UTF7"""
    s = s.replace('&', '&-')
    unipart = out = ''
    for c in s:
        if 0x20 <= ord(c) <= 0x7f:
            if unipart != '':
                out += '&' + base64.b64encode(unipart.encode('utf-16-be')).decode('ascii').rstrip('=') + '-'
                unipart = ''
            out += c
        else:
            unipart += c
    if unipart != '':
        out += '&' + base64.b64encode(unipart.encode('utf-16-be')).decode('ascii').rstrip('=') + '-'
    return out

# 接続情報
imap_host = 'outlook.office365.com'
username = 'username@example.com'
password = 'xxxxxxxx'
mailbox = '送信済みアイテム'

# メールサーバーに接続
imap = imaplib.IMAP4_SSL(imap_host)
imap.login(username, password)

# 受信ボックスを選択
imap.select(utf7_encode(mailbox))

# 今日送信したメールを取得
typ, list = imap.search(None, '(ON {0})'.format(time.strftime('%d-%b-%Y')))

# 送信時刻の一覧を取得
sent_times = []
for num in list[0].split():
    typ, data = imap.fetch(num, '(RFC822)')
    raw_email = data[0][1]
    message = email.message_from_string(raw_email.decode('utf-8'))
    date = email.utils.parsedate(message.get('Date'))
    sent_times.append('{:02d}時{:02d}分{:02d}秒'.format(date[3], date[4], date[5]))

# 最初と最後の送信時刻を出力
print(sent_times[0])
print(sent_times[len(sent_times) - 1])

# メールサーバーへの接続を切断
imap.close()
imap.logout()

このスクリプトを実行すると、その日の最初と最後のメールの送信時間が

09時10分50秒

15時15分25秒

のような形で出力されると思います。

Andnote公式 2021.05.08 16:41:28 (2021.05.08 16:58:50 更新)

コメントする

コメントするには ログイン していただく必要があります。


回答する
質問に回答するには ログイン していただく必要があります。

一覧に戻る