Sending mail via SMTP in Perl

email, perl, smtp

Solution

You have to start a SMTP session (after authorization, if necessary) with a MAIL command giving the sender's email address. That's why the responses say "MAIL first" (5xx is an error response). So:

$smtp->auth($smtpuser, $smtppassword);
$smtp->mail('sender@example.com');
$smtp->to('mymail@gmail.com');

But if you're not a SMTP expert, why not use a higher-level module like Email::Sender instead of the low-level Net::SMTP?

use strict;
use warnings;

use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP ();
use Email::Simple ();
use Email::Simple::Creator ();

my $smtpserver = 'server';
my $smtpport = 25;
my $smtpuser   = 'username';
my $smtppassword = 'password';

my $transport = Email::Sender::Transport::SMTP->new({
  host => $smtpserver,
  port => $smtpport,
  sasl_username => $smtpuser,
  sasl_password => $smtppassword,
});

my $email = Email::Simple->create(
  header => [
    To      => 'mymail@gmail.com',
    From    => 'sender@example.com',
    Subject => 'Hi!',
  ],
  body => "This is my message\n",
);

sendmail($email, { transport => $transport });

Problem

I am trying to send mail via SMTP in Perl. I have written a script for this. ``` #!perl use warnings; use strict; use Net::SMTP; my $smtpserver = 'server'; my $smtpport = 25; my $smtpuser = 'username'; my $smtppassword = 'password'; my $smtp = Net::SMTP->new($smtpserver, Port=>$smtpport, Timeout => 10, Debug => 1); die "Could not connect to server!\n" unless $smtp; $smtp->auth($smtpuser, $smtppassword); $smtp->to('mymail@gmail.com'); $smtp->data(); $smtp->datasend("To: mymail\@gmail.com\n"); $smtp->quit; ``` When I run this script, my output is like following: ``` Net::SMTP>>> Net::SMTP(2.31) Net::SMTP>>> Net::Cmd(2.29) Net::SMTP>>> Exporter(5.65) Net::SMTP>>> IO::Socket::INET(1.31) Net::SMTP>>> IO::Socket(1.32) Net::SMTP>>> IO::Handle(1.31) Net::SMTP=GLOB(0x273faf0)<<< 220 server GMX Mailservices E Net::SMTP=GLOB(0x273faf0)>>> EHLO localhost.localdomain Net::SMTP=GLOB(0x273faf0)<<< 250-server GMX Mailservices Net::SMTP=GLOB(0x273faf0)<<< 250-8BITMIME Net::SMTP=GLOB(0x273faf0)<<< 250-ENHANCEDSTATUSCODES Net::SMTP=GLOB(0x273faf0)<<< 250-SIZE Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH=LOGIN PLAIN Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH LOGIN PLAIN Net::SMTP=GLOB(0x273faf0)<<< 250 STARTTLS Net::SMTP=GLOB(0x273faf0)>>> RCPT TO:<mymail@gmail.com> Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001} Net::SMTP=GLOB(0x273faf0)>>> DATA Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001} Net::SMTP=GLOB(0x273faf0)>>> To: mymail@gmail.com Net::SMTP=GLOB(0x273faf0)>>> . Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001} Net::SMTP=GLOB(0x273faf0)>>> QUIT Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001} ``` I don't have enough information about Perl and SMTP, so I couldn't understand this error. How can I solve this?

Original source