2015-07-31 3 views
0

Я попытался отправить изображение по электронной почте. Я упомянул код ниже. Может ли кто-нибудь проверить, какая ошибка я сделал. Я упомянул ниже кодКак отправить электронную почту изображения в django

msg = EmailMultiAlternatives(subject, text_content, from_email, to, cc='',headers =sendgrid) 
msg.attach_alternative(html_content, "text/html") 
#print "path",os.path.join(settings.MEDIA_ROOT+'/instance/errorscreenshot/'+Image) 
for attachment in self.request.FILES.getlist("attachment"): 
     #Path = os.path.join(settings.MEDIA_ROOT+'/instance/errorscreenshot/'+attachment) ---->>>>> when i tried to give path of image, then also am getting error like "cannot concatenate str and InMemoryUploadedFile object"** 
     #print "path",attachment 
     fp = open(attachment,'rb') 
     msg_img = MIMEImage(fp.read()) 
     msg.attach(msg_img) 

msg.send(fail_silently=False) 

я получаю сообщение об ошибке, как показано ниже Принуждение в Unicode: нужен строку или буфер, InMemoryUploadedFile найдено

+0

Можете ли вы опубликовать полную трассировку стека сообщения об ошибке? В настоящее время неясно, из чего действительно возникает исключение. Кроме того, почему вы пытаетесь повторно открыть загруженный файл? Загруженные объекты Django имеют метод 'read()'. – dhke

+0

Я бы хотел отправить электронное письмо этого загруженного изображения. это я пытаюсь читать –

ответ

0

Попробуйте:

import os 
from django.core.mail import EmailMultiAlternatives 
from django.template.loader import render_to_string 
from email.MIMEImage import MIMEImage 

# You probably want all the following code in a function or method. 
# You also need to set subject, sender and to_mail yourself. 
html_content = render_to_string('foo.html', context) 
text_content = render_to_string('foo.txt', context) 
msg = EmailMultiAlternatives(subject, text_content, 
          sender, [to_mail]) 

msg.attach_alternative(html_content, "text/html") 

msg.mixed_subtype = 'related' 

for f in ['img1.png', 'img2.png']: 
    fp = open(os.path.join(os.path.dirname(__file__), f), 'rb') 
    msg_img = MIMEImage(fp.read()) 
    fp.close() 
    msg_img.add_header('Content-ID', '<{}>'.format(f)) 
    msg.attach(msg_img) 

msg.send() 

Источник: Sending emails with embedded images in Django

+0

Как это решить проблему OP, что он не может получить данные изображения из загрузки формы? – dhke

0

Вы не можете позвонить по телефону open() с помощью управляемого django файл как первый параметр. open() хочет, чтобы путь к файлу был первым аргументом, и вы не передаете его, следовательно, сообщение об ошибке.

Вместо Django предоставляет файл абстракции API, который позволяет напрямую считывать данные изображения из загруженного файла объекта, предоставленный Вам Джанго:

msg = EmailMultiAlternatives(...) 
# [...] 
for attachment in self.request.FILES.getlist("attachment"): 
    # rewind file object, make sure it's open 
    img_file.open('rb') 
    try: 
     # directly read in data from uploaded file object 
     img_data = img_file.read() 
     msg_img = MIMEImage(img_data) 
     msg.attach(msg_img) 
    finally: 
     # not strictly mandated by django, but why not 
     img_file.close() 

msg.send() 

PS .: Ваш оригинальный код потенциально может привести к утечке файловый дескриптор. Всегда старайтесь комбинировать with с open.

Смежные вопросы