http://www.perlmonks.org?node_id=1211033


in reply to Re: Using Net::SMTP to send pdf attachment
in thread Using Net::SMTP to send pdf attachment

Thank you thanos1983.

This is what I have tried:

use strict; use Net::SMTP; use MIME::Base64; my $smtphost = 'some_smtp_host'; my $username = 'some_username'; my $password = 'some_password'; my $emailto = 'to@hello.com'; my $emailfrom = 'from@hello.com'; my $subject = 'Hello world'; my $message = 'Test message'; sub date_r { my ($monthday, $mon, $yr, $ time, $hour, $str); my (@lt) = (); @lt = localtime(); $monthday = $lt[3]; $mon = $lt[4]+1; $yr = $lt[5] + 1900; $hour = $lt[2]; $time = sprintf("%02d:%02d:%02d", $hour, $lt[1], $lt[0]); $str = $mon . '/' .$monthday . '/' . $yr . ' ' . $time; return $str; } my $smtp = Net::SMTP->new($smtphost, Debug => 1, Timeout => 5); $smtp->datasend("AUTH LOGIN\n"); $smtp->datasend(encode_base64($username)); $smtp->datasend(encode_base64($password)); $smtp->mail($emailfrom); $smtp->to($emailto); $smtp->data(); my $boundary = 'frontier'; my $attachBinaryFile = 'helloworld.pdf'; $smtp->datasend("MIME-Version: 1.0\n"); $smtp->datasend("Content-type: multipart/mixed;\n\tboundary=\"$boundar +y\"\n"); $smtp->datasend("--$boundary\n"); $smtp->datasend("Content-type: text/plain;\n"); $smtp->datasend("\nSome plain text here in the body of the email\n"); $smtp->datasend("\n"); $smtp->datasend("--$boundary\n"); $smtp->datasend("Content-Type: application/pdf; charset=utf-8; name=\" +$attachBinaryFile\"\n"); $smtp->datasend("Content-Disposition: attachment; filename=\"$attachBi +naryFile\"\n"); $smtp->datasend("Content-Transfer-Encoding: 8bit\n"); my $pdfbody = do { local $/; open my $fh ,'<', "/path/helloworld.pdf" or die "pdfread: $!"; <>; }; $smtp->datasend("\n"); $smtp->datasend("$pdfbody\n"); $smtp->datasend("--$boundary\n"); $smtp->dataend(); $smtp->quit;

I do get the email message and the pdf attachment in the email. But I am not able to open the pdf attachment - some sort of data corruption.

Please help.

Replies are listed 'Best First'.
Re^3: Using Net::SMTP to send pdf attachment
by thanos1983 (Parson) on Mar 16, 2018 at 14:21 UTC

    Hello again Anonymous Monk,

    You need to treat the pdf as binary file. For the moment I do not have the time to play with your script to modify it but here is a sample of code that I just tested and works with pdf attachment using MIME::Lite.

    #!/usr/bin/perl use strict; use warnings; use MIME::Lite; use Getopt::Std; my $SMTP_SERVER = '127.0.0.1'; # CHANGE ME my $DEFAULT_SENDER = 'sender@example.com'; # CHANGE ME my $DEFAULT_RECIPIENT = 'recipient@example.com';# CHANGE ME MIME::Lite->send('smtp', $SMTP_SERVER, Timeout=>60); my (%o, $msg); # process options getopts('hf:t:s:', \%o); $o{f} ||= $DEFAULT_SENDER; $o{t} ||= $DEFAULT_RECIPIENT; $o{s} ||= 'Your binary file, sir'; if ($o{h} or !@ARGV) { die "usage:\n\t$0 [-h] [-f from] [-t to] [-s subject] file ...\n"; } # construct and send email $msg = new MIME::Lite( From => $o{f}, To => $o{t}, Subject => $o{s}, Data => "Hi", Type => "multipart/mixed", ); while (@ARGV) { $msg->attach('Type' => 'application/octet-stream', 'Encoding' => 'base64', 'Path' => shift @ARGV); } $msg->send( ); __END__ $ perl client.pl Documentation.pdf

    Hope this helps, BR.

    Seeking for Perl wisdom...on the process of learning...not there...yet!

      Thank you so much thanos1983 :)

      Have gotten the attach part to work with Sendmail, which is the default mail my web site is using. Have also tried Mail::Sender, which works too.

      Will keep yours view for now.

      Thanks for confirming that the pdf is a binary file.

      I tried with the code below (by astrobal from http://www.perlmonks.org/?node_id=1189197) but the pdf file opens with nothing:

      $smtp->datasend("Content-Type: application/pdf; name=\"$attachBinaryFi +le\"\n"); $smtp->datasend("Content-Transfer-Encoding: base64\n"); $smtp->datasend("Content-Disposition: attachment; filename=\"$attachBi +naryFile\"\n"); $smtp->datasend("\n"); open(DAT, "$path/$attachBinaryFile") || die("Could not open binary fil +e!"); binmode(DAT); local $/=undef; while (read(DAT, $picture, 4096)) { $buf = &encode_base64( $picture ); $smtp->datasend($buf); } close(DAT); $smtp->datasend("\n"); $smtp->datasend("--$boundary\n");

      I changed "Content-Type: image/jpeg;" in his code to "Content-Type: application/pdf;".

        Can you post the complete script please.

        poj