2013-07-11 9 views
15

Potrzebuję wygenerować plik CSV na podstawie wyniku zapytania, dołącz plik wynikowy do wiadomości e-mail jako załącznik i wyślij. Jak widzicie, potrzebuję iterować nad przypisanymi ścieżkami i zapisywać je do pliku, więc sądziłem, że wydajność przyniesie efekt. Teraz, gdy uruchamiam kod, otrzymuję wiadomość e-mail z załącznikiem z komunikatem poniżej, zamiast oczekujących. Jeśli użyję return, otrzymam jeden wiersz z wyniku zapytania.Dołącz wygenerowany plik CSV do wiadomości e-mail i wyślij z Django

<generator object data at 0x7f5e508d93c0> 

def send_lead_reminder(request): 
    usercompany = Listing.objects.filter(submitted_by=request.user) 
    assigned_leads = lead.objects.filter(assigned_to__in=usercompany).distinct() 
    def data(): 
     csvfile=StringIO.StringIO() 
     csvwriter =csv.writer(csvfile) 
     for leads in assigned_leads: 
      csvwriter.writerow([leads.business_name, leads.first_name, leads.last_name, leads.email, leads.phone_number,leads.address, leads.city, leads.state, leads.zipcode, leads.submission_date, leads.time_frame, leads.comments]) 
      yield csvfile.getvalue() 
    message = EmailMessage("Hello","Your Leads","[email protected]",["[email protected]"]) 
    message.attach('invoice.csv', data(), 'text/csv') 
    #message.to="[email protected]" 
    message.send() 
    return HttpResponseRedirect('/') 

Odpowiedz

24

Czy istnieje szczególny powód, dla którego w ogóle korzystasz z dodatkowej funkcji? Po prostu zbuduj swój CSV w pamięci - nie możesz tego uniknąć, jeśli załączasz go do e-maila - i wyślij to.

assigned_leads = lead.objects.filter(assigned_to__in=usercompany).distinct() 
csvfile = StringIO.StringIO() 
csvwriter = csv.writer(csvfile) 
for leads in assigned_leads: 
    csvwriter.writerow([leads.business_name, leads.first_name, leads.last_name, leads.email, leads.phone_number,leads.address, leads.city, leads.state, leads.zipcode, leads.submission_date, leads.time_frame, leads.comments]) 
message = EmailMessage("Hello","Your Leads","[email protected]",["[email protected]"]) 
message.attach('invoice.csv', csvfile.getvalue(), 'text/csv') 
+0

Spot on !! Dziękuję Ci. – shaytac

0

Python 3 i DictWriter przykład:

import csv 
from io import StringIO 
from django.core.mail import EmailMessage 

rows = [{'col1': 'value1', 'col2': 'value2'}] 
csvfile = StringIO() 
fieldnames = list(rows[0].keys()) 

writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
writer.writeheader() 
for row in rows: 
    writer.writerow(row) 

email = EmailMessage(
     'Subject', 
     'Body', 
     '[email protected]', 
     ['[email protected]'], 
    ) 
email.attach('file.csv', csvfile.getvalue(), 'text/csv') 
email.send() 
-1
Neither are working :(

Approach 1: 
     msg = EmailMultiAlternatives(subject, body, from_email, [to]) 
     msg.attach_alternative(file_content, "text/html") 
     msg.content_subtype = 'html' 
     msg.send() 

Approach 2: 
     # email = EmailMessage(
     #  'Report Subject', 
     #  "body", 
     #  '[email protected]', 
     #  ['[email protected]'], 
     #  connection=connection, 
     #) 
     # email.attach('Report.html', body, 'text/html') 
     # email.send() 
+0

Prosimy o komentarz/wyjaśnienie rozwiązania. – buhtz