end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Net::SMTPS for perl による Gmail SMTP利用には、アプリパスワードが必要

end0tknr.hateblo.jp 以前↑このように書いて動作していた気がしますが、 googleに2段階認証が導入された為でしょううか? 動作しなくなっていたので、以下のように修正しました。

#!/usr/local/bin/perl
use strict;
use utf8;
use FindBin;
use File::Spec;
use lib File::Spec->catdir( $FindBin::Bin, '../lib' );
use Encode;
use Net::SMTPS;
use MIME::Base64;
use Data::Dumper;

my $SMTP_CONF = {
    host     => 'smtp.gmail.com',
    port     => '587',
    from     => 'ないしょ@gmail.com',
    auth_uid => 'ないしょ@gmail.com',

    ### NOTICE!! application password
    ### https://myaccount.google.com/security#signin
    ### https://support.google.com/mail/answer/14257
    auth_pw  => 'ここは、アプリパスワード'
};

main();

sub main {
    my $ssl = 'starttls';    # 'ssl' / 'starttls' / undef

    my $smtp = Net::SMTPS->new(
        $SMTP_CONF->{host},
        Port  => $SMTP_CONF->{port},
        doSSL => $ssl,
        Debug => 1
    );

    $smtp->auth( $SMTP_CONF->{auth_uid}, $SMTP_CONF->{auth_pw} )
        or die "can't login smtp server";

    my $mailto = ['ないしょ@gmail.com'];
    my $mailto_str = join( ',', @$mailto );

    my $subject_org = 'これはテストです';
    my $subject = Encode::encode( 'MIME-Header-ISO_2022_JP', $subject_org );

    my $message = <<EOF;
このメールはテストです
EOF

    #メールのヘッダーを構築
    my $header = << "MAILHEADER_1";
From: $SMTP_CONF->{from}
Return-path: $SMTP_CONF->{from}
Reply-To: $SMTP_CONF->{from}
To: $mailto_str
MAILHEADER_1

    $header .= <<"MAILHEADER_2";
Subject: $subject
Mime-Version: 1.0
Content-Type: text/plain; charset = "ISO-2022-JP"
Content-Transfer-Encoding: 7bit
MAILHEADER_2

    $message = encode( 'iso-2022-jp', $message );

    $smtp->mail( $SMTP_CONF->{from} );
    $smtp->to(@$mailto);
    $smtp->data();
    $smtp->datasend("$header\n");
    $smtp->datasend("$message\n");
    $smtp->dataend();
    $smtp->quit;
}

アプリパスワードでなく、通常?のgoogleのログインパスワードを使用すると次のようなエラーとなります。

$ ./test_send_mail_by_gmail_smtp.pl 
Net::SMTPS>>> Net::SMTPS(0.03)
Net::SMTPS>>>   IO::Socket::INET(1.33)
Net::SMTPS>>>     IO::Socket(1.36)
Net::SMTPS>>>       IO::Handle(1.34)
Net::SMTPS>>>         Exporter(5.68)
Net::SMTPS>>>   Net::SMTP(3.05)
Net::SMTPS>>>     Net::Cmd(3.05)
Net::SMTPS>>>     IO::Socket::IP(0.37)
Net::SMTPS=GLOB(0x2b41ae0)<<< 220 smtp.gmail.com ESMTP i69sm1748185pfk.30 - gsmtp
Net::SMTPS=GLOB(0x2b41ae0)>>> EHLO localhost.localdomain
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-smtp.gmail.com at your service, [61.21.205.219]
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-SIZE 35882577
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-8BITMIME
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-STARTTLS
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-ENHANCEDSTATUSCODES
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-PIPELINING
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-CHUNKING
Net::SMTPS=GLOB(0x2b41ae0)<<< 250 SMTPUTF8
Net::SMTPS=GLOB(0x2b41ae0)>>> STARTTLS
Net::SMTPS=GLOB(0x2b41ae0)<<< 220 2.0.0 Ready to start TLS
Net::SMTPS=GLOB(0x2b41ae0)>>> EHLO localhost.localdomain
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-smtp.gmail.com at your service, [61.21.205.219]
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-SIZE 35882577
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-8BITMIME
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-ENHANCEDSTATUSCODES
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-PIPELINING
Net::SMTPS=GLOB(0x2b41ae0)<<< 250-CHUNKING
Net::SMTPS=GLOB(0x2b41ae0)<<< 250 SMTPUTF8
Net::SMTPS=GLOB(0x2b41ae0)>>> AUTH LOGIN
Net::SMTPS=GLOB(0x2b41ae0)<<< 334 VXNlcm5hbWU6
Net::SMTPS=GLOB(0x2b41ae0)>>> c21hcnQ4MTZwaWthQGdtYWlsLmNvbQ==
Net::SMTPS=GLOB(0x2b41ae0)<<< 334 UGFzc3dvcmQ6
Net::SMTPS=GLOB(0x2b41ae0)>>> 
Net::SMTPS=GLOB(0x2b41ae0)<<< 535-5.7.8 Username and Password not accepted. Learn more at
Net::SMTPS=GLOB(0x2b41ae0)<<< 535 5.7.8  https://support.google.com/mail/answer/14257 i69sm1748185pfk.30 - gsmtp