10

application/pdfHTMLフォームのユーザー入力から(reportlab + pypdfを使用して)PDFを動的に生成し、 MIMETypeでHTTP応答を返すdjangoアプリがあります。

上記を実行するか、生成された pdf を電子メールで送信するかを選択したいのですが、EmailMessage クラスのattach(filename=None, content=None, mimetype=None)メソッドの使用方法がわかりません。ドキュメントには、どのような種類のオブジェクトcontentが想定されているかについての説明はあまりありません。application/pdfファイル オブジェクトと上記のHTTP 応答を試しました。

現在、ビューで pdf をディスクに保存する回避策があり、その方法を使用して、結果のファイルを送信メールに添付しますattach_file()。これは私には間違っているように思えますが、もっと良い方法があると確信しています。

4

4 に答える 4

6

わかりました。

の 2 番目の引数にattach()は文字列が必要です。ファイル オブジェクトのread()メソッドを使用して、探しているものを生成しました。

from django.core.mail import EmailMessage

message = EmailMessage('Hello', 'Body goes here', 'from@example.com',
    ['to1@example.com', 'to2@example.com'], ['bcc@example.com'],
    headers = {'Reply-To': 'another@example.com'})
attachment = open('myfile.pdf', 'rb')
message.attach('myfile.pdf',attachment.read(),'application/pdf')

代わりに tempfile を使用することになりましたが、概念は通常のファイル オブジェクトと同じです。

于 2010-05-07T19:16:38.900 に答える
4

ファイル一時を生成します。

from django.utils import timezone    
from io import BytesIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

def generate_pdf(pk):
    y = 700
    buffer = BytesIO()
    p = canvas.Canvas(buffer, pagesize=letter)
    p.setFont('Helvetica', 10)
    p.drawString(220, y, "PDF generate at "+timezone.now().strftime('%Y-%b-%d'))
    p.showPage()
    p.save()
    pdf = buffer.getvalue()
    buffer.close()
    return pdf

PDFをメッセージに添付

from django.core.mail import EmailMessage
def send(request)
    pdf = generate_pdf(pk)
    msg = EmailMessage("title", "content", to=["email@gmail.com"])
    msg.attach('my_pdf.pdf', pdf, 'application/pdf')
    msg.content_subtype = "html"
    msg.send()
于 2016-03-21T18:56:23.120 に答える
0

あなたのリンクの例に基づいて:

message.attach('design.png', img_data, 'image/png')

PDF のコンテンツは、通常 PDF ファイルに書き込む出力と同じではないでしょうか? generated_pdf_data を myfile.pdf に保存する代わりに、それを message.attach のコンテンツ フィールドに挿入します。

message.attach('myfile.pdf', generated_pdf_data, 'application/pdf')
于 2010-05-07T15:48:25.407 に答える