佐賀人のIT技術者のブログ

IT技術、日常のブログです。たまに地元・佐賀について書きます。

ファイルを保存せずにファイルを送信する

メール等でファイルを送信したり、Webからダウンロードする際、よく行われるのがファイルを一度ディスクに保存して送信するやり方である。

それでもいいが、送信後に不要なファイルが残るケースもあるので、ファイルを保存せずに送信するやり方を紹介する。

言語はPythonである。

メール送信

import smtplib
import csv
import io
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

# メールオブジェクトを作成
body = 'Send mail by Python.'
msg = MIMEMultipart()
msg['Subject'] = 'Pythonからのテストメール(添付ファイル付き)'
msg['To'] = 'To@exam.com'
msg['From'] = 'From@exam.com'
msg.attach(MIMEText(body))

# 添付ファイルをメールに添付
file_obj = io.BytesIO()
file_obj.write("これはテストです".encode())
file_obj.seek(0)
attachment = MIMEApplication(file_obj.read())
attachment.add_header("Content-Disposition", "attachment", filename="test.txt")
msg.attach(attachment)

# CSVファイルをメールに添付
file_obj = io.StringIO()
writer = csv.writer(file_obj)
writer.writerow([1, 2, 3])
writer.writerow(["a", "b", "c"])
file_obj.seek(0)
attachment = MIMEApplication(file_obj.read())
attachment.add_header("Content-Disposition", "attachment", filename="test.csv")
msg.attach(attachment)

# メールサーバに接続・送信
server = smtplib.SMTP(server, port)
server.login(account, password)
server.send_message(msg)
server.quit()

バイトデータを利用する場合は、io.BytesIO()

文字列を利用する場合は、io.StringIO()

を利用する。

PDFもバイトデータを生成できるライブラリであればこの方法が利用できる。

私が利用しているwkhtmltopdfはファイルが作成されるので、あまり効果はなかった orm