SMTP送信時の認証をPerlで記述する方法

このQ&Aのポイント
  • SMTP送信時に認証が必要なメールサービスがあり、これをPerlで記述する方法を教えてください。
  • 現在、pop befor smtpの方法やauthでの認証を試してみましたが、うまくいきませんでした。ご指導いただけると助かります。
  • 添付された現状のソースコードでは、メールの送信ができていません。どのように修正すれば良いでしょうか。
回答を見る
  • ベストアンサー

smtp送信時の認証をperlで書きたい

smtpで認証が必要なメールサービスがあり、これをperlで記述しています。 「pop befor smtp」では、駄目でした。 そのた、authでの認証(良く分からず)行って見ましたが、システムでは無視されました。何方かご指導よろしくお願いします。 現状のソースを添付します。 $smtp = Net::SMTP->new("smtp$server"); $smtp->mail($from); $smtp->to($to); $smtp->data(); $smtp->datasend("Date:2009/01/10 18:30\n"); $smtp->datasend("From:$from\n"); $smtp->datasend("To:$to\n"); $smtp->datasend("Subject:$Subject\n"); $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); $smtp->datasend("Content-Type: text/plain;charset=\"iso-2022-jp\"\n\n"); $smtp->datasend("\n"); $smtp->datasend("これは、テストです。\n"); $smtp->dataend(); $smtp->quit;

  • Perl
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

ググると Authen::SASL が必要というウェブページ http://yoosee.net/d/archives/2004/08/25/002.html が見つかります。サーバには Authen::SASL はインストールされて いるでしょうか。 また、Net::SMTP_auth http://search.cpan.org/~apleiner/Net-SMTP_auth-0.08/SMTP_auth.pm というモジュールもありますね。

kiyo-hg
質問者

補足

早速アドバイス有難う御座います。 デバッグを1にして、動作を確認しましたが私には正常に働いて居る様に見えます。途中で終了している事は無いようで、最後にclosingが確認できます。 下記に添付します。また、SMTP_authモジュールは、インストールされて居ない様です。 メーラーの送信時に認証と同じ処理を、perlで書きたいのですがもしかしてAUTHでは、無いのでしょうか? すみません、素人で判りません。もし宜しければ、ご存知の方ご指導下さい。 Net::SMTP=GLOB()<<< 220 pbsg500.nifty.com ESMTP Nifty Mail Server Net::SMTP=GLOB()>>> EHLO localhost.localdomain Net::SMTP=GLOB()<<< 250-pbsg500.nifty.com Hello sv13.xxxxxdmein.jp [210.***.***.***], pleased to meet you Net::SMTP=GLOB()<<< 250-ENHANCEDSTATUSCODES Net::SMTP=GLOB()<<< 250-PIPELINING Net::SMTP=GLOB()<<< 250-8BITMIME Net::SMTP=GLOB()<<< 250-SIZE 20971520 Net::SMTP=GLOB()<<< 250-DSN Net::SMTP=GLOB()<<< 250-AUTH=PLAIN LOGIN CRAM-MD5 Net::SMTP=GLOB()<<< 250-AUTH PLAIN LOGIN CRAM-MD5 Net::SMTP=GLOB()<<< 250-DELIVERBY Net::SMTP=GLOB()<<< 250 HELP Net::SMTP=GLOB()>>> MAIL FROM: Net::SMTP=GLOB()<<< 250 2.1.0 ... Sender ok   :   : Net::SMTP=GLOB()>>> Subject:メールの送信テスト Net::SMTP=GLOB()>>> Content-Transfer-Encoding: 7bit Net::SMTP=GLOB()>>> Content-Type: text/plain;charset="iso-2022-jp" Net::SMTP=GLOB()>>> これは、テストです。 Net::SMTP=GLOB()>>> . Net::SMTP=GLOB()<<< 250 2.0.0 n0I68aE4016150 Message accepted for delivery Net::SMTP=GLOB()>>> QUIT Net::SMTP=GLOB()<<< 221 2.0.0 pbsg500.nifty.com closing connection 以上、有難う御座います。

その他の回答 (2)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

Authen::SASL モジュールがインストールされていないときの動きに 似ていますね。 perl -e 'use Authen::SASL' すると Can't locate Authen/SASL.pm ... と表示されませんか。 このように表示された場合は、 cpan -i Authen::SASL で CPAN から Authen::SASL モジュールを インストールすることができます。

kiyo-hg
質問者

お礼

アドバイス有難う御座います。 確かに、エラーが表示されました。 早速レンタルサーバ管理者へ、確認をお願いしてみます。 結果は、改めて報告したいと思います。 ご指導有難う御座います。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

質問時にあげられているコードには、認証処理のコードが入っていません。 $smtp->auth($user, $passwd) のような認証処理をする部分が 必要ですが、テストされているコードには記述されているのでしょうか。

kiyo-hg
質問者

お礼

回答有難う御座います。 実際には、$smtp->auth($user, $passwd)指摘どおり UserIDとパスワード引数として渡しております。 エラーは、発生していないようです。 出張で、お礼が遅くなりました(^^;;;。済みません。 有難う御座います。何かお気付きの点が有りましたら、よろしくお願いします。

関連するQ&A

  • Perl でメール送信プログラム。

    Perl でメール送信プログラムを作ったのですが、自宅の環境から会社に持ってきてテストすると文字化けしてしまいます。 自宅は、Yahoo ! , Biglobe なので送信できたのですが、会社は、自社でメールサーバを構築しているようです。 メールサーバは、qmail のようです。 ソースは、 $smtp = Net::SMTP->new("mailserver"); $smtp->mail($mailaddress); $smtp->to($mailaddress); $smtp->data(); $smtp->datasend("Date:$date\n"); $smtp->datasend("From:$mailaddress\n"); $smtp->datasend("To:$mailaddress\n"); $smtp->datasend("Subject:あいうえお\n"); $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); $smtp->datasend("Content-Type: text/plain;charset=\"iso-2022-jp\"\n\n"); $smtp->datasend("\n"); $smtp->datasend("$StringBuffer\n"); $smtp->dataend(); $smtp->quit; こんな感じで一般的なものです。 “あいうえお”が“ツつツつ「ツつ、ツつヲツつィツ”こんな感じに文字化けしています。 どなたかわかる方いませんか?

    • ベストアンサー
    • CGI
  • perlでSMPT認証してメールを送信したい。

    こんばんわ。 Perlで一点伺いたいことがございます。 SMTP認証して、メールを送信したいのですが ネット上でサンプルをさがしてきて実際に試したのですが うまくいきません。 どうしたらいでしょうか?以下が実施に動かしているコードです。 #!/perl/perl/bin/perl use strict; use warnings; use CGI::Carp qw(fatalsToBrowser); print"content-type: text/html\r\n\r\n"; print "Hello World!\n"; use Net::SMTP; #SMTPサーバの指定 my $mailhost = 'smtp.gmail.com'; my $mailport = 587; my $mail_username = 'XXX@gmail.com'; my $mail_password = 'パスワード'; my $to_mail = '宛先'; my $from_mail = '送信先'; my $smtp = Net::SMTP->new($mailhost,Port => $mailport); $smtp->auth($mail_username, $mail_password); #メールの送信先 $smtp->mail($from_mail); $smtp->to($to_mail); #メールの内容 $smtp->data(); $smtp->datasend("From: $from_mail\n"); $smtp->datasend("To: $to_mail\n"); $smtp->datasend("Subject: test\n"); $smtp->datasend("\n"); $smtp->datasend("test\n"); #メール内容終わり $smtp->dataend(); #接続を切る。 $smtp->quit; print $smtp; ほぼコピーアンドペーストなのですが、うまくいきません。 とりあえず、newしたオブジェクト $smtpを出力してみると アドレス的なものが表示されます。 Net::SMTP=GLOB(0x7d15ec) ただ、これは認証情報が適当でも出力されるようです。 何度やってもメールは届いていないようなので認証の時点でまちがっているのでしょうか? ただ、認証情報は実際にメールソフトで使っているものなので、間違いないと思うのですが、識者の方よろしくご教授お願いします。

    • ベストアンサー
    • Perl
  • Net::SMTPでエラーの場合のリトライ方法

    PerlのSMTP処理がエラーの場合に、リトライする方法 下記のようなPerlスクリプトを例に、質問させていただきます。2点あります。 ------------------------------------------------------------------------- 01: use Net::SMTP; 02: use Encode; 03: my($smtp,$ret); 04: $smtp = Net::SMTP->new('xxx.xxx.jp', Hello=>"xxx.com", Timeout => 120); 05: $ret = $smtp->mail($from); 06: $ret = $smtp->to($to); 07: $ret = $smtp->cc($cc) if("$cc" ne ""); 08: $ret = $smtp->data(); 09: $ret = $smtp->datasend("From:$from\n"); 10: $ret = $smtp->datasend("To:$to\n"); 11: $ret = $smtp->datasend("Cc:$cc\n") if("$cc" ne ""); 12: Encode::from_to($subject,"s-jis","jis"); 13: $ret = $smtp->datasend("Subject:$subject\n"); 14: $ret = $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); 15: $ret = $smtp->datasend("Content-Type: text/plain;charset=\"ISO-2022-JP\"\n\n"); 16: Encode::from_to($body,"s-jis","jis"); 17: $ret = $smtp->datasend("$body\n"); 18: $ret = $smtp->dataend(); 19: $ret = $smtp->quit; ------------------------------------------------------------------------- ($from,$to,$cc,$subject,$body 等は上位で設定しているものとします) 質問1) 例えば、08行目でエラー($ret==0)になった場合に、リトライしたければ、 少し待って(sleep等)から、08行目からを再実行すればOKでしょうか、 それとも、05行目、あるいは、04行目のSMTP->newの再取得からやり直さなければならないでしょうか。 質問2) また、18行目でエラー($ret==0)の場合、実際にはメールは送信されるようですが、 そのまま放置しておいても特に問題ないでしょうか。 以上、よろしくお願いいたします。

  • NET::SMTPについて

    おねがいします。 NT環境からperlでメール送信したいと思っています。 NET::SMTPをPPMでダウンロードしました。 以下のサンプルプログラムを得て、SMTPサーバ名など を入れました。でも、エラーにはなりませんが送信されず。 そもそも、IDとpassの認証部分がないですよね。 このサンプルだと「SMTPサーバ名さえわかれば誰でも そのSMTPサーバからメールできちゃう」ってことに なりませんか?? 他の方の質問にあった、 $smtp->auth( USERNAME, PASSWORD ); も試しましたが、エラーになりました。 認証うける方法があるのでしょうか? よろしくおねがいします。 #!/usr/local/bin/perl -w use Net::SMTP; $smtp = Net::SMTP->new('mailhost'); $smtp->mail($ENV{USER}); $smtp->to('postmaster'); $smtp->data(); $smtp->datasend("To: postmaster\n"); $smtp->datasend("\n"); $smtp->datasend("A simple test message\n"); $smtp->dataend(); $smtp->quit;

  • cgi 実行時のエラー

    perl初心者でまた質問させていただきます。「送信」ボタンをクリックすると、HPで入力してもらった情報をメールで送信するcgiを作成しました。ただ、実行すると、 Can't locate object method "new" via package "Net::SMTP" (perhaps you forgot to load "Net::SMTP"?) at C:\www\cgi-bin\downloadmail.cgi line 62. というエラーが出ます。 cgiは、 my $smtp = Net::SMTP->new($192.1.1.1); $smtp->mail($email); $smtp->to($to); $smtp->data(); $smtp->datasend("From:$email\n"); $smtp->datasend("To:***@***.co.jp\n"); $smtp->datasend("Subject:テストメール\n"); #件名 $smtp->datasend("Content-Type: text/plain; charset=iso-2022-jp\n\n"); $smtp->datasend("テストメール\n"); $smtp->dataend(); $smtp->quit; というものです。どなたか分かりましたらお願いします。

    • ベストアンサー
    • Perl
  • Centos5(utf8)のperl でメール送信の関数プログラムを作

    Centos5(utf8)のperl でメール送信の関数プログラムを作成しています。 bccにもメールを送信したいのですが、呼び出される度にbccのメールアドレスの数が異なります。以下はテスト的に作った動くサンプルです。 #!/usr/bin/perl use Net::SMTP; use Encode; use strict; 1 my $ServerName = 'mail.server.jp'; 2 my $from = 'from@mailaddress'; 3 my $to = 'to@mail.address'; 4 my $bcc = 'bcc0@mail.address'; 5 my $anotherbcc = 'bcc1@mail.address'; 6 my $onemorebcc = 'bcc2@mail.address'; 7 my $smtp = Net::SMTP->new($ServerName, Debug => 0); 8 $smtp->mail($from); 9 $smtp->to($to); 10 $smtp->bcc($bcc, $anotherbcc, $onemorebcc); 11 # to ( ADDRESS [, ADDRESS [...]] ) 12 # cc ( ADDRESS [, ADDRESS [...]] ) 13 # bcc ( ADDRESS [, ADDRESS [...]] ) 14 $smtp->data(); 15 $smtp->datasend("From: $from\n"); 16 $smtp->datasend("To: $to\n"); 17 my $SUBJECT = "日本語タイトル"; 18 my $body = "日本語本文\n"; 19 Encode::from_to($SUBJECT, "utf8", "iso-2022-jp"); 20 Encode::from_to($body, "utf8", "iso-2022-jp"); 21 $smtp->datasend("Subject: ".$SUBJECT."\n"); 22 $smtp->datasend("MIME-Version: 1.0\n"); 23 $smtp->datasend("Content-Type: text/html; charset=iso-2022-jp\n"); 24 $smtp->datasend("\n"); 25 $smtp->datasend($body); 26 $smtp->dataend(); 27 $smtp->quit; 10行目の通り、メールアドレスを羅列して渡すとメールは配信されます。 メールアドレスを配列渡し( @bccarray=('bcc0@mail.address', ・・・); で@bccarrayを渡す)と配信されません。 これを関数化し、bccアドレスの数を可変にしたいのですが良い方法はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlでSMTP-AUTH認証をする

    現在、さくらのレンタルサーバにてperlスクリプトを稼動しています。 今回、さくらのレンタルサーバのメール認証がPOP before SMTPからSMTP認証(SMTP-AUTH)に変更になりましたので、perlスクリプト内で自動メール送信させるのにNet::SMTP::TLSモジュールを利用することにしました。そこで (1)SMTPサーバー名、ポート番号、ユーザー名、パスワードを設定する (2)宛先などの必要な設定をする (3)メール内容を設定する (4)メールヘッダを設定する (5)メールを送信する という流れで現在perlスクリプトを以下のように記述しました。 #!/usr/bin/perl use CGI::Carp qw(fatalsToBrowser); use Net::SMTP::TLS; use Authen::SASL; my $smtp = Net::SMTP::TLS->new($mailhost, Port => $mailport, User => $mail_username, Password => $mail_password ); $smtp->mail($from_mail); $smtp->to($tomail); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; 変数の値は割愛していますが、 上記のスクリプトは、POP before SMTPの時は問題なくメール送信できたのですが、サーバのメール認証がSMTP認証(SMTP-AUTH)に変更になってからは以下のようなエラーが出ます。 invalid SSL_version specified at /usr/local/perl/5.8/lib/perl5/site_perl/5.8/IO/Socket/SSL.pm line 418 何か間違いであるとか、他に必要な設定がありますでしょうか? 宜しくご教授お願いいたします。

    • ベストアンサー
    • Perl
  • Perl メール文字化け

    #メール本体設定 my $start = '~ホームページより以下の内容を受け取りました~'; my $Name =$q->param('Name'); if($Name eq ""){ print "Content-type: text/plain; charset=Shift_JIS\n\n"; print "名前が入力されていません。\n\nブラウザの戻るボタンで戻ってください。"; exit(1); } my $Sex =$q->param('q1'); my $Age =$q->param('q2'); my $ie =$q->param('ie'); my $Tell =$q->param('Tell'); my $body = $q->param('body'); if($body eq ""){ print "Content-type: text/plain; charset=Shift_JIS\n\n"; print "本文が入力されていません。\n\nブラウザの戻るボタンで戻ってください。"; exit(1); } #my $subject = $q->param('subject'); my $End = '~~~~~~~~~~~~~~~~~~~~~'; #メール送信オブジェクト設定 my $smtp = Net::SMTP->new('n-doboku.jp'); if ( !$smtp ) { print "メールサーバーにアクセスできません!"; exit; } #メール文字コード変換 Encode::from_to($start, 'shiftjis', 'iso-2022-jp'); Encode::from_to($Name, 'utf8', 'shiftjis'); Encode::from_to($Sex, 'utf8', 'shiftjis'); Encode::from_to($Age, 'utf8', 'shiftjis'); Encode::from_to($ie, 'utf8', 'shiftjis'); Encode::from_to($Tell, 'utf8', 'shiftjis'); Encode::from_to($body, 'utf8', 'shiftjis'); Encode::from_to($End, 'shiftjis', 'iso-2022-jp'); #メール送信 $smtp->mail($from); $smtp->to($mailto); $smtp->to($mailcc); $smtp->data(); $smtp->datasend($header); $smtp->datasend("$start\n\n"); $smtp->datasend("名   前 : $Name\n\n"); $smtp->datasend("性   別 : $Sex\n\n"); $smtp->datasend("年   齢 : $Age\n\n"); $smtp->datasend("住   所 : $ie\n\n"); $smtp->datasend("電話番号 : $Tell\n\n"); $smtp->datasend("本   文 : $body\n\n"); $smtp->datasend("$End\n\n"); $smtp->dataend(); $smtp->quit; 現在、 SMTPを使用しメール送信を作成している最中です。 やっと、パソコンからパソコンへメール送信では文字化けしなくなったのですが まず (1)パソコンでも異字体などは文字化けしてしまう(髙や﨑等) おそらく「Content-Transfer-Encoding: 8bit」これを使うのですが、使いかたがわからないです・・・ (2)スマホにメール送信したときはすべて文字化けしてしまうのですが、 スマホでの文字コードとはなんなのでしょうか・・・? また、一回utf8に変換しているのですが、この場合どうするのでしょうか・・・?

    • ベストアンサー
    • Perl
  • smtpでメール送信

    いつもお世話になっております。 mail()、mb_send_mail() が使用できないため、smtp から 直接メール送信をしようと考えております。 (なぜ、mail()、mb_send_mail() が使用できないのかはわかりません。) // 件名 $subject = mb_convert_encoding($subject, "JIS", "EUC-JP"); $subject = '=?iso-2022-jp?B?' . base64_encode($subject) . '?='; // 本文 $msg = mb_convert_encoding($msg, "JIS", "EUC-JP"); // 送信 $fp = fsockopen('localhost', 25, $err_str, $err_no, 5); $header = "From: " . $from . "\r\n"; $header .= "To: " . $to . "\r\n"; $header .= "Reply-To: " . $from . "\r\n"; $header .= "Subject: " . $subject . "\r\n"; $header .= "Mime-Version: 1.0\r\n"; $header .= "Content-Type: Text/Plain; charset=iso-2022-jp\r\n"; $header .= "Content-Transfer-Encoding: 7bit\r\n"; fputs($fp, "HELO " . $smtp . "\r\n" ); fputs($fp, "MAIL FROM:" . $from . "\r\n"); fputs($fp, "RCPT TO:" . $to . "\r\n"); fputs($fp, "DATA \r\n"); fputs($fp, $header . $msg . "\r\n.\r\n"); fputs($fp, "QUIT \r\n"); 上記のように書きました。 一回目は送信できるのですが、二回目以降が送信できません。 サーバを再起動するとまた送信できるようになるのですが、 二回目以降はやはり送信できません。 何か原因が考えられますでしょうか。 ご教示よろしくお願いいたします。

    • 締切済み
    • PHP
  • Perl メールフォーム

    Perl勉強中です。ご教示お願いします。 #!/usr/bin/perl -w use Encode qw(from_to encode); use Net::SMTP; use strict; my $from = 'xxxx@xxxxx.jp'; my $mailto= 'xxxx@xxxxx.jp'; my $mailcc= 'xxxx@xxxxx.jp'; my $subject = 'ホームページからのお問い合わせ'; from_to($subject, 'shiftjis', 'iso-2022-jp'); encode('MIME-Header-ISO_2022_JP', $subject); my $header = << "MAILHEADER"; From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = 'ISO-2022-JP" Content-Trensfer-Encoding: 7bit MAILHEADER my $message = "テスト"; from_to($message, 'shiftjis', 'iso-2022-jp'); my $smtp = Net::SMTP->new('xxxx-xxxx.jp'); if ( !$smtp ) { print "メールサーバーにアクセスできません!"; exit; } #メール送信 $smtp->mail($from); $smtp->to($mailto); $smtp->to($mailcc); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; 現在ここまでできています。 「ホームページ→お問い合わせクリック→メール送信」 そして、今回教えていただきたいのが、 イメージなのですが、 ホームページ→お問い合わせクリック→メールフォームのページに移動→内容入力 →確認ボタンクリック→確認画面→送信ボタンクリック→送信+送ってきた人へ自動返信(定型文) という風にしたいのですが、どうすればいいのかわかりません・・・ できればコードを教えて頂ければ嬉しいです。

    • ベストアンサー
    • Perl