2011-06-28 42 views
6

Tôi cần gửi models.FileField làm tệp đính kèm email bằng cách sử dụng Django. Tôi đã thấy các đoạn mã cho thấy cách thực hiện điều này với dữ liệu thô request.FILES (vẫn chứa Content-Type), nhưng không thể tìm thấy bất kỳ thứ gì cho thấy cách thực hiện khi bạn đã lưu tệp trong một models.FileField. Loại nội dung dường như không thể truy cập được từ models.FileField.Làm thế nào để gửi một tệp tin Django FileField dưới dạng tệp đính kèm?

Ai đó có thể cho tôi ví dụ về cách tính năng này hoạt động không? Tôi bắt đầu nghĩ rằng tôi có thể phải lưu trữ Kiểu nội dung trong mô hình khi tôi lưu tệp.

Cảm ơn!

+0

Bạn có thể cung cấp giải pháp mà bạn tìm thấy làm câu trả lời không? Tôi cũng muốn xem đoạn trích. – Doppelganger

Trả lời

0

Tôi sẽ không cung cấp loại nội dung và cho phép ứng dụng email khách của người nhận làm việc. Trừ khi nó sẽ là một cái gì đó bất thường nó không phải là một vấn đề.

RFC2616 trạng thái:

Nếu và chỉ nếu loại phương tiện truyền thông không phải là đưa ra bởi một trường Content-Type, các nhận THỂ cố gắng đoán loại phương tiện truyền thông qua kiểm tra hàm lượng và/hoặc (các) tên mở rộng của URI được sử dụng để xác định tài nguyên .

nhưng ... Nếu bạn muốn xác định nó sau đó lưu trữ các loại nội dung trên upload là một ý tưởng rất tốt. Cần lưu ý rằng tài liệu của riêng django nói đến verify the data from users

Nếu bạn đang ở trên một hệ điều hành * unix bạn có thể thử để đoán/kiểm tra nó:

import subprocess 
subprocess.check_output(['file', '-b', '--mime', filename]) 

(từ How to find the mime type of a file in python?)

+0

Cảm ơn! Tôi sẽ cung cấp cho một đi và báo cáo lại! –

13

Gắn tệp tin models.FileField cho một thư email đẹp và đơn giản trong Django:

from django.core.mail import EmailMultiAlternatives 
kwargs = dict(
    to=to, 
    from_email=from_addr, 
    subject=subject, 
    body=text_content, 
    alternatives=((html_content, 'text/html'),) 
) 
message = EmailMultiAlternatives(**kwargs) 
message.attach_file(model_instance.filefield.path) 
message.send() 
3

Cách tiếp cận khác :

from django.core.mail.message import EmailMessage 

msg = EmailMessage(subject=my_subject, body=my_email_body, 
     from_email=settings.DEFAULT_FROM_EMAIL, to=[to_addressed]) 
msg.attach_file(self.my_filefield.file) # self.my_filefield.path for Django 1.7+ 
msg.send(fail_silently=not(settings.DEBUG)) 
+0

Điều này làm việc cho tôi, cảm ơn. – Prateek

+2

Tôi đã phải sử dụng 'msg.attach_file (self.my_filefield.path)' với Django 1.7.1 – sspross

Các vấn đề liên quan