Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^3: Trouble emailing zip file

by haukex (Chancellor)
on Jul 04, 2018 at 10:04 UTC ( #1217874=note: print w/replies, xml ) Need Help??


in reply to Re^2: Trouble emailing zip file
in thread Trouble emailing zip file

Unfortunately I don't have any of the email modules installed

Please see Yes, even you can use CPAN - if you can install Perl scripts on the server, then normally you can install modules there too, for example with local::lib.

Could you please post an example on how to encode the zip file into the temp file?

I initially thought that uuencode could write its output to a file, but I was mistaken, it apparently always writes to its standard output. Since I don't recommend qx//, capturing its output is not trivial - see the section "Use a Piped open" in that link for a way to do it with pure Perl. Alternatively, you don't have to shell out at all, since pack supports uuencoding - with thanks to the Perl Power Tools:

# takes one argument, the filename to encode # returns one value, the filename of the temporary(!) output file use File::Temp qw/tempfile/; sub uuencode { my ($infile) = @_; my ($tfh,$tfn) = tempfile(UNLINK=>1); open my $fh, '<:raw', $infile or die "$infile: $!"; printf $tfh "begin %03o %s\n", ((stat($infile))[2] & 0666)||0644, $infile; my $buf; print $tfh pack 'u', $buf while read $fh, $buf, 45; print $tfh "`\n", "end\n"; close $fh; close $tfh; return $tfn; }

That will return the filename of the temporary file that you can then pass to mailx - but make sure to use the "list" form of system, as I showed in the above link as well.

By the way, in your original post, you said mailx -r $recipient1 - but the -r option sets the From address. Are you sure you've got your mailx command right?

Replies are listed 'Best First'.
Re^4: Trouble emailing zip file
by TonyNY (Beadle) on Jul 04, 2018 at 19:10 UTC

    Hi haukex,

    I'm getting the following after running the code below"

    Can't exec "/usr/bin/mailx uuencode $zipfile $zipfile -r -s": No such file or directory at ./test-email.pl line 42.

    system /usr/bin/mailx uuencode $zipfile $zipfile -r -s logs user@email.com failed: -1 at ./test-email.pl line 42

    #!/opt/bin/perl use strict; use warnings; my $home = $ENV{"HOME"}; print "$home\n"; my $zipfile = "$home/file.zip"; print "$zipfile\n"; my $emailcmd = '/usr/bin/mailx uuencode $zipfile $zipfile -r -s'; print "$emailcmd\n"; my $subject = 'logs'; print "$subject\n"; my $recipient = 'user@email.com '; print "$recipient\n"; # takes one argument, the filename to encode # returns one value, the filename of the temporary(!) output file use File::Temp qw/tempfile/; sub uuencode { my ($infile) = @_; my ($tfh,$tfn) = tempfile(UNLINK=>1); open my $fh, '<:raw', $infile or die "$infile: $!"; printf $tfh "begin %03o %s\n", ((stat($infile))[2] & 0666)||0644, $infile; my $buf; print $tfh pack 'u', $buf while read $fh, $buf, 45; print $tfh "`\n", "end\n"; close $fh; close $tfh; return $tfn; } #call uuencode sub with param &uuencode($zipfile); my @args = ("$emailcmd", "$subject", "$recipient"); system(@args) == 0 or die "system @args failed: $?";
      When using the LIST form of system() the first argument is the program to run, the rest of the arguments are the parameters for the program. I can almost guarantee you don't have a program called /usr/bin/mailx uuencode $zipfile $zipfile -r -s on your system. You probably have /usr/bin/mailx however. The other parts (uuencode $zipfile $zipfile -r -s) need to be passed as parameters to mailx.
      my @emailcmd = ('/usr/bin/mailx', 'uuencode', $zipfile, $zipfile, '-r' +, '-s'); #and later my @args = (@emailcmd, $subject, $recipient); system(@args) == 0 or die "system @args failed: $?";

      This is of course assuming that the command /usr/bin/mailx uuencode file.zip file.zip -r -s Subject Recipient indeed works on the command line.

      Use double quotes not single quotes here

      $emailcmd = "/usr/bin/mailx uuencode $zipfile $zipfile -r -s";

      Also the quotes can be removed here

      my @args = ($emailcmd, $subject, $recipient);
      poj

        still getting the same error and I have confirmed that the zip file does exist.

      Unfortunately, there are several issues with that code. As I documented in the comments, my sub uuencode returns a filename, but you're not using that return value anywhere. Instead, you seem to have just stuck the string "uuencode" into the command right after "mailx" and rearranged the command-line arguments - I'm not sure what you're trying to do there, since I'm pretty sure that doesn't work on the command line either. And Paladin has already identified the issue with your use of system (unfortunately poj's comment was misleading on that issue).

      At this point I have to recommend taking a step back. I know that stuff not working can be frustrating. But on the other hand, guessing at syntax doesn't (always) get you further either. I'd have to suggest taking the time to reread perlintro and the documentation on things like system, as well as my node on that topic, as well as Yes, even you can use CPAN and perhaps A Guide to Installing Modules. Invest some time now into understanding those topics to save yourself time afterwards.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1217874]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (3)
As of 2019-12-08 15:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?