はじめに
GmailにExcelファイルを添付してメールを送るというのを自動化したくて試してみました。
Googleのサンプルスクリプトだとファイル添付はできるのですが、ダウンロードするとファイルが壊れてしまいました。
いろいろと調べて、Excelファイルが持つMIMEタイプをそのまま適用するのがよくないようで、この方法にたどり着きました。
参考にした投稿
Gmail APIの利用の始め方からスクリプトの書き方までとても参考になりました。ありがとうございました。
ExcelファイルをGmailに添付して下書きを作るスクリプト
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
import base64
from email import encoders
def create_message_with_attachment(送信先アドレス, 送信元アドレス, タイトル, CCのアドレス, 本文, 添付ファイルのフルパス):
message = MIMEMultipart()
message["to"] = 送信先アドレス
message["from"] = 送信元アドレス
message["subject"] = タイトル
if CCのアドレス:
message["Cc"] = CCのアドレス
# attach message text
enc = "utf-8"
msg = MIMEText(本文.encode(enc), _charset=enc)
message.attach(msg)
#このMIMETypeの書き方にしないと、Excelファイルを添付できてもダウンロードしたあとに、ファイルが壊れて開けない。
part = MIMEBase('application', "octet-stream")
part.set_payload(open(添付ファイルのフルパス, "rb").read())
encoders.encode_base64(part)
p = Path(添付ファイルのフルパス)
part.add_header('Content-Disposition', 'attachment', filename=p.name)
message.attach(part)
encode_message = base64.urlsafe_b64encode(message.as_bytes())
return {"raw": encode_message.decode()}
if __name__ == '__main__':
#API認証を終えて、gmailのサービスオブジェクトを”service”として取得している前提。
message_body = create_message_with_attachment(送信先アドレス, 送信元アドレス, タイトル, CCのアドレス, 本文, 添付ファイルのフルパス)
message = {'message': message_body}
draft = service.users().drafts().create(userId=送信元アドレス, body=message).execute()