Python プログラム

pythonでOutlookのテンプレートメールをテキストファイルから作成する方法

最近はなにかと仕事関係でメールを送ることが多いので、メールのテンプレートを作成して時短していこうとしています。

以前の記事で紹介したのと少しバージョンが異なるものとなりますが、汎用性が高いためご紹介しておきます。
関連記事:pythonを使用しExcelのすべてを更新してOutlookでメールを自動送信する

Outlook(アウトルック)のメールテンプレートを作成

今回はテキストファイル(txt)を読み込み、メールのテンプレートを作成していきます。

テキストファイルを変更すればテンプレートも変更になるため使い勝手が良くなります。

また、今回のやり方を学ぶことで複数のテンプレートメールを作成したり、複数の人にその人に合ったメールを作成することもできるようになります。

とりあえず一通りのプログラムの紹介。

import win32com.client
import os

txt_file_path = r'C:\Users\user\sample.txt'

#テキストファイルを読み込み(windowsの場合はencodingしておかないとErrorがでる)
f = open(txt_file_path, encoding='utf-8_sig')
f = f.read()

#特定の部分の文字を置き換え
bodyReplace = f.replace('--URL',r'http://wheelchairtext.net/')


#Outlookオブジェクト生成とMail作成
outlook = win32com.client.Dispatch('Outlook.Application')
mailCreate = outlook.CreateItem(0)


#送り先のメールアドレス
mailCreate.To = 'hoga@gmail.com'

#拡張子を含めたファイル名を取得
file_name = os.path.basename(txt_file_path)#sample.txt

#拡張子を外して件名に入れたいのでsplitextで分解。この時にタプル型になります。
print(os.path.splitext(file_name))#('sample', '.txt')
mailCreate.Subject = os.path.splitext(file_name)[0]


#置き換えた文章をメール本文に追加
mailCreate.Body = bodyReplace

# メール送信
mailCreate.Send()

以下に解説していきます。

テキストファイル(txt)の作成

まずメールのテンプレートにするためのtxtファイルを作成しておきましょう。

今回は簡単にファイル名をsampleにして、本文を以下のようにしました。
簡単なもので良いのでtxtファイルを作成してみてください。

txtの読み込みとEncodigの問題

まずtxtファイルのpathを指定していきます。
これはpathさえ変えてしまえば、メールの本文を簡単に変えることができるためいちいちプログラムをいじらなくてもいいというメリットがあります。


txt_file_path = r'C:\Users\user\sample.txt'

テキストのファイルを指定したら、テキストファイルの本文を読み込みます。
テキストファイルの本文はメールの本文に使用します。

本文の一部を変えたいときなどもあると思います。その時に有効なのが、特定の文字列をtxtにあらかじめ仕込んでおき、置換してしまうのが割と楽にできる作業になります。
下記の一部では"--URL"を置換しています。


txt_file_path = r'C:\Users\user\sample.txt'

#テキストファイルを読み込み(windowsの場合はencodingしておかないとErrorがでる)
f = open(txt_file_path, encoding='utf-8_sig')
f = f.read()

#特定の部分の文字を置き換え
bodyReplace = f.replace('--URL',r'http://wheelchairtext.net/')


またtxtファイルを読み込み、別ファイルに書き込みするときに起こりやすいのが、Encodingの問題です。
Macであれば”utf_8”でいいのだが、windowsだとencodingが”utf-8_sig”にしておかないと下記のようなエラーが出る。

UnicodeDecodeError: 'cp932' codec can't decode byte 0x99 in position 31: illegal multibyte sequence

これは、csvに出力する際やExcelに出力するときに文字化けやエラーが発生しやすい問題なので覚えておいたほうがいいでしょう。

送り先のメールアドレス

通常で送りたい場合であれば、Toで送りましょう。


mailCreate.To = 'hoga@gmail.com'

複数送りたい場合や、CC・BCCなどは下記を使いましょう。


mailCreate.To = "foga@co.jp; fuga@co.jp"
mailCreate.CC = ""
mailCreate.BCC = ""

件名の作成

件名はtxtファイル名を使用しましょう。こうすることで、いちいち件名を変更しなくて済むことになり、汎用性が高くなります。

pathからファイル名を取得するにはos.path.basenameを使用する必要があります。ただ、os.path.basenameは拡張子を含めて返されるため、os.path.splitextで区切る必要があります。

os.path.splitextは分解してタプル型で返すため、[0]番目の要素を指定するとsampleという文字が返ってきます。


#拡張子を含めたファイル名を取得
file_name = os.path.basename(txt_file_path)#sample.txt

#拡張子を外してファイル名を件名に入れたいのでsplitextで分解。この時にタプル型になります。
print(os.path.splitext(file_name))#('sample', '.txt')
mailCreate.Subject = os.path.splitext(file_name)[0]


本文を追加してメールを送信

先程作成したbodyReplaceをメールの本文に追加します。

その後メールを送信します。


#置き換えた文章をメール本文に追加
mailCreate.Body = bodyReplace

# メール送信
mailCreate.Send()

同じ人に複数の別のテンプレートメールを送信する

複数のテンプレートを送るようなプログラムを作成します。

import win32com.client
import os

txt_file_path = [
        r'C:\Users\user\sample.txt'
        ,
        r'C:\Users\user\sample2.txt'
        ]

def mailSend(file_path):
    #テキストファイルを読み込み(windowsの場合はencodingしておかないとErrorがでる)
    f = open(file_path, encoding='utf-8_sig')
    f = f.read()
    
    #特定の部分の文字を置き換え
    bodyReplace = f.replace('--URL',r'http://wheelchairtext.net/')
    
    
    #Outlookオブジェクト生成とMail作成
    outlook = win32com.client.Dispatch('Outlook.Application')
    mailCreate = outlook.CreateItem(0)
    
    
    #送り先のメールアドレス
    mailCreate.To = 'hoga@gmail.com'
    
    #拡張子を含めたファイル名を取得
    file_name = os.path.basename(file_path)
    
    #拡張子を外して件名に入れたいのでsplitextで分解。この時にタプル型になります。
    print(os.path.splitext(file_name))
    mailCreate.Subject = os.path.splitext(file_name)[0]
    
    
    #置き換えた文章をメール本文に追加
    mailCreate.Body = bodyReplace
    
    # メール送信
    mailCreate.Send()
    return


for file_path in txt_file_path:
    mailSend(file_path)

以下に解説していきます。

別のテキストファイル(txt)の作成

先程作成したsmaple.txtとは別のsample2.txtを作成しておきます。

今回はテキストファイルの本文の名前を変更していますが、本文を変更してもらっても構いません。

複数のテキストファイルのパスを追加

txt_file_pathをリスト型にしてファイルのパスを追加します。

最初に使用したsample.txtとsample2.txtのファイルパスをリストに追加しておきます。


txt_file_path = [
        r'C:\Users\user\sample.txt'
        ,
        r'C:\Users\user\sample2.txt'
        ]

def文で関数としてまとめる

メールを送る処理を関数としてまとめます。

メールを送る処理は同じため、違うのはテキストのファイルパスのみになります。


def mailSend(file_path):
    #テキストファイルを読み込み(windowsの場合はencodingしておかないとErrorがでる)
    f = open(file_path, encoding='utf-8_sig')
    f = f.read()
    
    #特定の部分の文字を置き換え
    bodyReplace = f.replace('--URL',r'http://wheelchairtext.net/')
    
    
    #Outlookオブジェクト生成とMail作成
    outlook = win32com.client.Dispatch('Outlook.Application')
    mailCreate = outlook.CreateItem(0)
    
    
    #送り先のメールアドレス
    mailCreate.To = 'hoga@gmail.com'
    
    #拡張子を含めたファイル名を取得
    file_name = os.path.basename(file_path)
    
    #拡張子を外して件名に入れたいのでsplitextで分解。この時にタプル型になります。
    print(os.path.splitext(file_name))
    mailCreate.Subject = os.path.splitext(file_name)[0]
    
    
    #置き換えた文章をメール本文に追加
    mailCreate.Body = bodyReplace
    
    # メール送信
    mailCreate.Send()
    return

for文でループして関数を呼び出し送る

for文でループしてリストに入っているtxt_file_pathをfile_pathに格納して、先程の関数を呼び出し、メールを作成して送ります。


for file_path in txt_file_path:
    mailSend(file_path)

こうすることで複数のテンプレートを作成でき便利になります。

複数の人に別のテンプレートメールを送る

あと、良く使う機能だと複数の人ごとに別テンプレートを作成する場合ですね。

これもdictionary型を上手く使って対処できます。

import win32com.client
import os

txt_file_path = {
        'hoga@gmail.com': r'C:\Users\user\sample.txt'
        ,
        'huga@gmail.com': r'C:\Users\user\sample2.txt'
        }


def mailSend(mail_address,file_path):
    #テキストファイルを読み込み(windowsの場合はencodingしておかないとErrorがでる)
    f = open(file_path, encoding='utf-8_sig')
    f = f.read()
    
    #特定の部分の文字を置き換え
    bodyReplace = f.replace('--URL',r'http://wheelchairtext.net/')
    
    
    #Outlookオブジェクト生成とMail作成
    outlook = win32com.client.Dispatch('Outlook.Application')
    mailCreate = outlook.CreateItem(0)
    
    
    #送り先のメールアドレス
    mailCreate.To = mail_address
    
    #拡張子を含めたファイル名を取得
    file_name = os.path.basename(file_path)
    
    #拡張子を外して件名に入れたいのでsplitextで分解。この時にタプル型になります。
    print(os.path.splitext(file_name))
    mailCreate.Subject = os.path.splitext(file_name)[0]
    
    
    #置き換えた文章をメール本文に追加
    mailCreate.Body = bodyReplace
    
    # メール送信
    mailCreate.Send()
    return


for mail_address, file_path in txt_file_path.items():
    mailSend(mail_address,file_path)

上記で重要なのが、mail_addressとfile_pathの2種類を渡して、関数を呼び出している点です。
もう少し詳しく説明していきましょう。

dict型(辞書型)について

例えば下記の例であると、mail_addressがkeyとなり、file_pathがvalueとなります。
メールアドレスとメールのテンプレートをセットにしておくことで間違いがしづらくなります。


txt_file_path = {
        #key:value
        'hoga@gmail.com': r'C:\Users\user\sample.txt'
        ,
        'huga@gmail.com': r'C:\Users\user\sample2.txt'
        }

for文でdictionary型を分解

dictionary型は、keyとvalueに分かれています。

それをfor文でmail_addressとfile_pathに分解。


for mail_address, file_path in txt_file_path.items():
    mailSend(mail_address,file_path)

分解した値をmailSend関数に渡してメールを送ります。

まとめ

割と簡単にできるメールのテンプレートの作り方と複数の人にメールを送るやり方の紹介です。

送る相手やテンプレートが多くなってきた場合は、上記のようなリストやdictを使わず、csvファイルを作成してみるともっと管理がしやすく応用ができるようになります。

[kattene]
{
"image": "https://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=487311778X&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&tag=rakugaki020-22",
"title": "退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング",
"description": "Al Sweigart (著)",
"sites": [
{
"color": "orange",
"url": "https://amzn.to/2NyiJS8",
"label": "Amazon",
"main": "true"
},
{
"color": "red",
"url": "https://hb.afl.rakuten.co.jp/hgc/17704933.97ca066a.17704934.54034512/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F14994167%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Fbook%2Fi%2F18615836%2F&link_type=hybrid_url&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJoeWJyaWRfdXJsIiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjB9",
"label": "楽天"
}
]
}
[/kattene]

-Python, プログラム