AIの分野で注目のPython(パイソン)ですが、とても便利な言語で、いろいろなことができちゃいます。
ぼくは、クローリングツールを作る兼ね合いでPythonと出会い、クローリングツールの他に自動メール送信ツール、ビットコイン自動売買ツールなど、いろいろな物を試作しました。
その中で、gmailでファイル添付してメールを送信する仕組みが、調べた通りでできなかったため、自分なりに修正した物でを公開したいと思いました。
そのまま使えるはずですが、もしうまくいかない場合はご連絡ください。
Python3を使ってgmailでメールを送信するプログラム
mail.pyを作成する
mail.pyを作成し、以下をそのままコピーしてください。
from email.mime.text import MIMEText
from email.utils import formatdate
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import smtplib
def create_message(from_addr, to_addr, cc_addr, subject, body):
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = ",".join(to_addr)
msg['Cc'] = ",".join(cc_addr)
msg['Date'] = formatdate()
body = MIMEText(body)
msg.attach(body)
return msg
def create_message_attach(from_addr, to_addr, cc_addr, subject, body, mine, attach_file):
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = from_addr
msg['To'] = ",".join(to_addr)
msg['Cc'] = ",".join(cc_addr)
msg['Date'] = formatdate()
body = MIMEText(body)
msg.attach(body)
#添付ファイルのMIMEタイプを指定する
attachment = MIMEBase(mine['type'],mine['subtype'])
file = open(attach_file['path'],'rb')
attachment.set_payload(file.read())
file.close()
encoders.encode_base64(attachment)
msg.attach(attachment)
attachment.set_param('name',attach_file['name'])
attachment.add_header('Content-Dispositon','attachment', filename=attach_file['name'])
return msg
def send(from_addr, to_addrs, msg, my_password):
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(from_addr, my_password)
smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
smtpobj.close()
メインのファイルに追記する
次に、メインのファイルにて以下を入力してください。
import configparser
# iniファイルの読み込み
ini = configparser.ConfigParser()
ini.read('./config.ini','UTF-8')
# メール送信用データ
FROM_ADDRESS = ini['mail_info']['FROM_ADDRESS']
MY_PASSWORD = ini['mail_info']['MY_PASSWORD']
TO_ADDRESS = ini['mail_info']['TO_ADDRESS'].split(',')
CC_ADDRESS = ini['mail_info']['CC_ADDRESS'].split(',')
SUBJECT = 'タイトル'
BODY = '本文'
to_addr = TO_ADDRESS
cc_addr = CC_ADDRESS
subject = SUBJECT
body = BODY
to_addrs = to_addr + cc_addr
msg = mail.create_message(FROM_ADDRESS, to_addr, cc_addr, subject, body)
mail.send(FROM_ADDRESS, to_addrs, msg, MY_PASSWORD)
iniファイルを作成する
最後にiniファイルに送信先情報を記載します。
CC_ADDRESSとCC_ADDRESSは「,」区切りで複数登録することができます。
[mail_info]
FROM_ADDRESS = hoge@hoge.co.jp
MY_PASSWORD = password
TO_ADDRESS = to_hogehoge@hoge.co.jp
CC_ADDRESS = cc1_hogehoge@hoge.co.jp,cc2_hogehoge@hoge.co.jp
Pythonを使ってGmailでファイル添付してメールを送信するプログラム
メインのファイルに追記する
メインの部分だけ一部修正します。
import configparser
# iniファイルの読み込み
ini = configparser.ConfigParser()
ini.read('./config.ini','UTF-8')
# メール送信用データ
FROM_ADDRESS = ini['mail_info']['FROM_ADDRESS']
MY_PASSWORD = ini['mail_info']['MY_PASSWORD']
TO_ADDRESS = ini['mail_info']['TO_ADDRESS'].split(',')
CC_ADDRESS = ini['mail_info']['CC_ADDRESS'].split(',')
SUBJECT = 'タイトル'
BODY = '本文'
to_addr = TO_ADDRESS
cc_addr = CC_ADDRESS
subject = SUBJECT
body = BODY
to_addrs = to_addr + cc_addr
mine={'type':'text','subtype':'comma-separated-values'}
attach_file={'name':os.path.basename(convertFilePath),'path':convertFilePath}
msg = mail.create_message_attach(FROM_ADDRESS, to_addr, cc_addr, subject, body, mine, attach_file)
mail.send(FROM_ADDRESS, to_addrs, msg, MY_PASSWORD)
上記ではCSVを添付するように設定しています。
【まとめ】Pythonはやっぱり便利
ぼくは、クローリングの結果をメールで送信するプログラムを作りましたが、他にも使えると思います。
例えば、日報。システムで作業管理している場合には日報はないかもしれませんが、そういったものがない場合、個人的にエクセルで作業記録をし、そのエクセルの内容を文面に落とし込む処理を書き、Pythonで自動送信すれば、日報の出し忘れもなくなります。
ちなみに、クローリングとの相性は比較的良いと思います。
新しいデータが見つかったり、条件にあう情報が見つかったら、URLと内容を本文に記載してメールを自動送信することで、出先でも気づけるため、情報を取り扱う方に向いていると思います。
今後もPythonに関する情報を公開していきたいと思います。