2014-05-05 11 views
6

Obecnie zezwalam użytkownikom na wybór pewnych parametrów i na ich podstawie generuję plik csv i przesyłaję go jako plik do pobrania dla użytkowników. na przykładwysyłaj dynamicznie generowany plik jako wiadomość e-mail

send_data <generated csv data>, :disposition => 'attachment' :type => 'text/csv' 

Czasami, gdy dane stają się zbyt duże, aby je obliczyć, nie chcę, aby użytkownicy czekali na przesłanie pliku do pobrania. Chcę wysłać ten plik jako załącznik do wiadomości e-mail.

Mogę wysłać wiadomość e-mail w normalny sposób. Mogę wysłać już obecny plik jako załącznik. Nie chcę zapisywać tego pliku. Chcę wysłać je bezpośrednio do użytkownika.

Jak to zrobić?

+0

Witamy w przepełnieniu stosu! – fotanus

Odpowiedz

6

@juanpastas - Zrobiłem to tak, jak zasugerowałeś. Ale to spowodowało, że plik jest wyświetlany jako tekst w treści wiadomości e-mail.

Tak to wyglądało w wiadomości e-mail.

Treści-typ: tekst/csv; charset = UTF-8; filename = data.csv Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename = Data.csv Content-ID: xyzxyz [zawartości pliku csv jako tekst]

Potem zawarte treść wiadomości i to działało.

mail(to: user.email, subject: 'XYZ', body: 'XYZ') 

To spowodowało, że wiadomość e-mail zawierała treść i temat, który podałem, a plik pojawił się jako załącznik.

+0

Próbuję to teraz zrobić. Czy możesz pokazać mi kod, którego używasz do 'csv_data'? Próbuję wymyślić, jak się do tego odnosić. Obecnie, gdy moja aplikacja generuje plik csv, zostaje zapisany do głównego katalogu, w którym znajdują się 'app',' db', 'config'. Czy używasz czegoś innego niż ten blok: 'CSV.open (" my.csv "," w ") wykonaj' –

5

Nie testowałem tego, ale to powinno działać:

class YourMailer < ActionMailer::Base 
    def csv_mail(user, csv_data) 
    attachments['a.csv'] = csv_data 
    mail(to: user.email) 

    end 
end 

A w kontrolerze:

YourMailer.csv_mail(user, csv_data).deliver 

Zobacz attachments i inline attachments.

+0

Dzięki ... to prawie zadziałało. –

Powiązane problemy