Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

Re: Using Net::SMTP to send pdf attachment

by thanos1983 (Parson)
on Mar 16, 2018 at 10:36 UTC ( #1211027=note: print w/replies, xml ) Need Help??

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

Hello Anonymous Monk,

See here Sending An Attachment Using Net::SMTP and also here Using Net::SMTP to send email attachments.

Hope this helps, BR.

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

Replies are listed 'Best First'.
Re^2: Using Net::SMTP to send pdf attachment
by Anonymous Monk on Mar 16, 2018 at 12:41 UTC

    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 = ''; my $emailfrom = ''; 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.

      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 = ''; # CHANGE ME my $DEFAULT_SENDER = ''; # CHANGE ME my $DEFAULT_RECIPIENT = '';# 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 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 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;".

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (7)
As of 2021-03-02 08:38 GMT
Find Nodes?
    Voting Booth?
    My favorite kind of desktop background is:

    Results (41 votes). Check out past polls.