メール等でファイルを送信したり、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