使用PAR :: Packer将Perl脚本转换为Exe

时间:2014-07-24 16:35:48

标签: perl exe perl-packager

我正在尝试使用命令(Windows 7 64位)将perl脚本转换为PAR :: Packer pp的可执行文件:

"pp -o teste.exe gmail_att.pl"

但我收到的消息是:

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

我在互联网上搜索此消息但没有成功

剧本:

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           => 'marchiore.matheus@gmail.com',
                    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 => 'marchiore.matheus@gmail.com',
                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> );

2 个答案:

答案 0 :(得分:0)

我在

上使用-x param进行编译时解决了这个问题

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

但现在我有另一个问题,我的exe访问xlsx文件,它试图在exe内找到它。错误消息:

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.

答案 1 :(得分:0)

解决问题将文件(xlsx)放在C:\中,并使用$ ENV {HOMEDRIVE}

获取此目录

它对我有用。

谢谢!