Search code examples
perlexeperl-packager

Convertion Perl Script to Exe with PAR::Packer pp


I'm trying to convert a perl script to a executable file with PAR::Packer pp with the command (Windows 7 64 bits):

"pp -o teste.exe gmail_att.pl"

but i'm receiving the message:

"# Use of runtime loader module Module::Runtime detected.  Results of static scanning may be incomplete."

I search for this message on the internet but without success

The script:

printf("Iniciando o envio de e-mails... \n");
use strict;
use Try::Tiny;
use IO::All;
use Email::MIME;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP::TLS;
use Spreadsheet::XLSX;
use File::Basename;


my $diretorioScript = dirname(__FILE__);
my $excel = Spreadsheet::XLSX->new( "$diretorioScript\\jofalista.xlsx", );
my $diretorio = "$diretorioScript\\arquivos\\";
my $email = "";
my $nome = "";

opendir(diretorio, "$diretorio");
my @lista = readdir(diretorio);
closedir(diretorio);

foreach my $arquivo(@lista)
{
    $email = "";
    $nome = "";

    if ($arquivo ne "." && $arquivo ne ".."){


        # print $arquivo;

        # rotina para buscar dentro do arquivo xls qual o email 
        # de destino do arquivo

        foreach my $sheet ( @{ $excel->{Worksheet} } ) {
            $sheet->{MaxRow} ||= $sheet->{MinRow};
            foreach my $row ( $sheet->{MinRow} .. $sheet->{MaxRow} ) {
                $sheet->{MaxCol} ||= $sheet->{MinCol};
                foreach my $col ( $sheet->{MinCol} .. $sheet->{MaxCol} ) {
                    my $cell = $sheet->{Cells}[$row][$col];
                    if ($cell) {
                        #printf( "( %s == %s ) \n", "$cell->{Val}.pdf", $arquivo );                     
                        if("$cell->{Val}.pdf" eq $arquivo){
                            $nome = $cell->{Val};
                            my $emailCell = $sheet->{Cells}[$row][$col+1];
                            $email = $emailCell->{Val};
                            #printf("%s", $email);
                        }
                        #printf( "( %s , %s ) => %s\n", $row, $col, $cell->{Val} );

                    }    
                }
            }
        }
        if($email ne ""){
            printf("Processando o arquivo $arquivo para o email: $email \n");
            # Create and array of email parts. 
            # Here i have 2 attachments ( an image and a pdf file) and a text message.
            my @parts = (
                Email::MIME->create(
                    attributes => {
                        filename     => "$arquivo",
                        content_type => "application/pdf",
                        encoding     => "base64",
                        disposition  => "attachment",
                        name         => "$arquivo",
                    },
                    body => io( "$diretorio$arquivo" )->all,
                ),
                Email::MIME->create(
                    attributes => {
                        content_type  => "text/html",
                    },
                    body => "Ola $nome este é um e-mail teste da JOFA",
                )
            );

            # Create the email message object.
            my $email_object = Email::MIME->create(
                header => [
                    From           => '[email protected]',
                    To             => $email,
                    Subject        => "Certificado $nome",
                    content_type   =>'multipart/mixed'
                ],
                parts  => [ @parts ],
            );

            # Create the transport. Using gmail for this example
            my $transport = Email::Sender::Transport::SMTP::TLS->new(
                host     => 'smtp.gmail.com',
                port     => 587,
                username => '[email protected]',
                password => ''
            );

            # send the mail
            try {
                   sendmail( $email_object, {transport => $transport} );
            } catch {
                   warn "Email sending failed: $_";
            };
        }
    }

}

printf("Pressione ENTER para Finalizar... \n");
chomp( my $input = <STDIN> );

Solution

  • I solved the problem during compilation using the -x param on

    "pp -o -x teste.exe gmail_att.pl"

    But now i have another problem, that my exe access a xlsx file and it's trying to find it inside exe. The error message:

    Iniciando o envio de e-mails... IO error: opening script\jofalista.xlsx for read : No such file or directory at C:/strawberry/perl/vendor/lib/PAR.pm line 636. Cannot open script\jofalista.xlsx as Zip archive at Spreadsheet/XLSX.pm line 33.