#気まぐれ & 気まま & 天邪鬼な老いぼれ技術屋の日々の記録のうち、主に Perl・CGI・HTMLなど Web技術に関連した記事です。
右端上端の同一カテゴリージャンプボタンで同じカテゴリーの他の記事を順番にご覧いただけます。
Access Counter:  総アクセス数

楽 天 の 商 品

-2090- XAMPP: perlでSMTP接続
= 今日は画像なし m(_ _)m =
前回に続いて狭い話。
やっと自前ローカルサーバーからプロバイダのメールサーバー(SMTP)に接続してメール送信が出来るようになった。ただし、gmailなどの ssl/tls接続を必要とするサーバーと、yahooなどのように単なる smtp認証すればいいサーバーとは別スクリプトになってしまった。
まずはyahooなど一般のsmtpサーバー用スクリプト

************************* ***************************
#!/usr/bin/perl -w

### Yahoo smtp mail serverからメール送信するサンプル SSL/TLS接続でない通常の smtp接続用

use strict;
use warnings;
use Net::SMTP;
use Authen::SASL;
use Encode qw(from_to encode);

my $smtp = 'smtp.mail.yahoo.co.jp';
my $port = 587;
my $user = 'my_adress@yahoo.co.jp';
my $pass = 'password';
my $from = 'my_adress@yahoo.co.jp';
my $to = 'to_adress@to_domain.com';
my $sbj = 'メール from yahoo server';
$sbj = encode('MIME-Header-ISO_2022_JP', "$sbj"); # 件名の漢字コード変換
my $msg = "SMTP test mail: テストメール from $smtp";
from_to($msg, 'utf-8', 'iso-2022-jp'); # 本文の漢字コード変換
my $header = "From: $from\n";
$header .= "To: $to\n";
$header .= "Subject: $sbj \n";
$header .= "MIME-Version: 1.0"."\n";
$header .= "Content-type: text/plain; charset=ISO-2022-JP"."\n";
$header .= "Content-Transfer-Encoding: 7bit"."\n";

my $mail = Net::SMTP->new( $smtp, Port => $port, Debug=>1);
$mail->auth($user, $pass);
$mail->mail( $from );
$mail->to( $to );
$mail->data();
$mail->datasend($header);
$mail->datasend("\n");
$mail->datasend("$msg \n");
$mail->dataend();
$mail->quit;
************************* ***************************

多くのページでは上記コードに
$mail->starttls();
を追加しただけで gmailサーバーにも接続できると書いているが、私は結局 Net::SMTPモジュールでは接続できず、 Email::Simpleなどを使用した以下のようなコードにしないと接続できなかった。
ssl/tls 接続が必要なメールサーバー(例:gmail)用は

************************* ***************************
#! /usr/bin/perl -w

### SSL/TLS による接続保護のメールサーバー用
### Google設定で「安全性の低いアプリの許可: 有効」にしないと送信できない

use strict;
use warnings;
use Email::Simple;
use Email::Sender::Simple qw/sendmail/;
use Email::Sender::Transport::SMTP::TLS;
use Encode;

my $mailto = 'to_adress@to_domain.com';
my $from = 'my_adress@gmail.com';
my $sbj = 'メール from gmail server';
my $msg = "SMTP test mail: テストメール from $from";

my $sender = Email::Sender::Transport::SMTP::TLS->new(
host => 'smtp.gmail.com',
port => 587,
username => $from,
password => 'password',
);

my $email = Email::Simple->create(
header => [
From => "My Name"."< $from >",
To => $mailto,
Subject => encode('MIME-Header-ISO_2022_JP', 'SMTP test mail: テストメール'),
],
attributes => {
content_type => 'text/plain',
charset => 'ISO-2022-JP',
encoding => '7bit',
},
body => "Mail send test:メール本文 from $from", # メール本文
);

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

Try & Errorの結果なので Encode モジュールの使い方等がイマイチだが、現時点(2019/09)でとりあえずこれで漢字コード込みのメールが gmail/yahoo から送信できている。
2019/09/01