2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonでGmailにExcelファイルを添付する

Posted at

はじめに

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()

2
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?