2012-12-05 16 views
6

Próbuję uruchomić skrypt, który pobiera plik tekstowy, kompresuje go za pomocą Archive :: Zip i wysyła plik zip jako załącznik za pomocą smtp za pomocą Email :: Nadawca, aby utworzyć wiadomość MIME.Plik ZIP wysłany z perlem E-mail :: Nadawca jest uszkodzony

Mogę wysyłać pliki txt w perlu bez uszkodzenia. Mogę wysłać plik, który perl zamki ręcznie bez korupcji. Nie mogę wysłać ręcznie spakowanego pliku przez perl.

Podejrzewam, że mój problem polega na czytaniu spakowanego pliku lub tworzeniu wiadomości MIME. Oto odpowiedni kod, który jest w istocie kod ze streszczenia Email :: MIME, gdzie $ fileToSend jest ścieżką do skompresowanego pliku.

Wszelkie pomysły?

use strict; 
use warnings; 
use Email::MIME; 
use Email::Sender::Transport::SMTP; 
use Email::Sender::Simple qw(sendmail); 
use Archive::Zip qw(:ERROR_CODES :CONSTANTS); 
use IO::All; 

my $message = 
     Email::MIME->create(
     header_str => [ 
    From => $sender, 
    To  => $recipient, 
    Subject => $subject, 
    ], 
      attributes => { 
       filename  => $filename, 
       content_type => 'application/zip', 
       disposition => 'attachment', 
       name   => $filename, 
      }, 
      body => io($fileToSend)->binary->all, 
      #body => io($fileToSend)->all, 
    ); 
+0

Jaka jest różnica między wysyłanych i odbieranych plików? – Tim

+0

Otrzymany plik zip jest nieco mniejszy niż wysłany zip (822 kb vs 893 kb). Właśnie dlatego podejrzewam, że io() jest problemem. – Dodd10x

+0

dlaczego ta złożona metoda, po prostu wyślij plik jako załącznik? – netawater

Odpowiedz

5

Znaleźliśmy problem. Dodanie tej linii rozwiązało problem.

$message->encoding_set('base64'); 
0
my $transport = Email::Sender::Transport::SMTP->new({ 
        host => $smtpserver, 
        port => $smtpport, 
        sasl_username => $smtpuser, 
        sasl_password => $smtppassword, 
        ssl => 'starttls'}); 

Email::Stuffer->from('[email protected]') 
      ->to('[email protected]') 
      ->text_body('hello') 
      ->attach_file ('zipfile') 
      ->transport($transport) 
      ->send();