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

Re: Sending An Attachment Using Net::SMTP

by alejandro (Initiate)
on Feb 25, 2014 at 04:18 UTC ( [id://1076082]=note: print w/replies, xml ) Need Help??


in reply to Sending An Attachment Using Net::SMTP

Here is a working example of how to send multipart mail messages using Net::SMTP. Code for sending plain text, a plain text file, and a binary image (jpg) are provided.

Hope this helps!

#!/usr/bin/perl use Net::SMTP; use strict; use warnings; use MIME::Base64 qw( encode_base64 ); #use MIME::Base64 qw( decode_base64 ); my $from = 'from@email.com'; my $to = 'to@email.com'; my $attachBinaryFile= 'test.jpg'; my $attachTextFile = 'test.txt'; my $boundary = 'frontier'; open(DAT, $attachTextFile) || die("Could not open text file!"); my @textFile = <DAT>; close(DAT); my $smtp = Net::SMTP->new('your.smtp.com', Timeout => 60) || die("Coul +d not create SMTP object."); print "Sending mail\n"; $smtp->mail($from); $smtp->recipient($to, { SkipBad => 1 }); $smtp->data(); $smtp->datasend("To: $to\n"); $smtp->datasend("From: $from\n"); $smtp->datasend("Subject: Multi part test\n"); $smtp->datasend("MIME-Version: 1.0\n"); $smtp->datasend("Content-type: multipart/mixed;\n\tboundary=\"$boundar +y\"\n"); $smtp->datasend("\n"); $smtp->datasend("--$boundary\n"); $smtp->datasend("Content-type: text/plain\n"); $smtp->datasend("Content-Disposition: quoted-printable\n"); $smtp->datasend("\nToday\'s files are attached:\n"); $smtp->datasend("\nHave a nice day! :)\n"); $smtp->datasend("--$boundary\n"); $smtp->datasend("Content-Type: application/text; name=\"$attachTextFil +e\"\n"); $smtp->datasend("Content-Disposition: attachment; filename=\"$attachTe +xtFile\"\n"); $smtp->datasend("\n"); $smtp->datasend("@textFile\n"); $smtp->datasend("--$boundary\n"); $smtp->datasend("Content-Type: image/jpeg; name=\"$attachBinaryFile\"\ +n"); $smtp->datasend("Content-Transfer-Encoding: base64\n"); $smtp->datasend("Content-Disposition: attachment; filename=\"$attachBi +naryFile\"\n"); $smtp->datasend("\n"); my $buf; open(DAT, "../uploads/$attachBinaryFile") || die("Could not open binar +y file!"); binmode(DAT); local $/=undef; while (read(DAT, my $picture, 4096)) { $buf = &encode_base64( $picture ); $smtp->datasend($buf); } close(DAT); $smtp->datasend("\n"); $smtp->datasend("--$boundary\n"); $smtp->dataend(); $smtp->quit; print "Mail sent\n"; exit;
A PERL is but bytes arranged under a client's pressure!

Replies are listed 'Best First'.
Re^2: Sending An Attachment Using Net::SMTP
by melsael (Initiate) on Aug 26, 2014 at 07:20 UTC

    To make encoding to base64 better, use a chunk/buffer that is a multiple of 57 bytes. This will enable sending of large files.

    In the code that alejandro posted, the line:

    while (read(DAT, my $picture, 4096)) {

    could become:

    while (read(DAT, my $picture, 72*57)) {

    To read a bit more about this, see the examples section in http://perldoc.perl.org/MIME/Base64.html

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (3)
As of 2024-04-24 21:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found