ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Perlコミュのsendmailでメールが送れない

  • mixiチェック
  • このエントリーをはてなブックマークに追加
あるレンタルサーバーでsendmailを使いメールを配信しようと考えているのですが、メールが送れず、サーバーエラーになり困っております。プログラムは次のように記載したのですがどこが間違っていますでしょうか?
(sendmail対応のサーバーでパスは合っております。)

#!/usr/bin/perl

require "mimew.pl";
require "jcode.pl";

$sendmail = '/usr/sbin/sendmail';

$to = "宛先アドレス"; # 宛先アドレス
$from = "送信元アドレス"; # 送信元アドレス
$subject = "bbb";
$body = "aaa";

# 本文をJISコードへ変換
&jcode'convert(*body,'jis');

# 標題をJISコードへ変換してMIME エンコード
&jcode'convert(*subject,'jis');

$subject = mimeencode($subject);
$body = mimeencode($body);

# ファイルハンドルをsendmailへ紐付け
open(MAIL,"| $sendmail -t");

# sendmailへコマンドの出力
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "\n";
print MAIL "$body\n";
close(MAIL);

コメント(12)

mimeencodeで変換するのは、ヘッダーに格納される情報です。
subjectや、送信者の名前(メールアドレス以外に会社名などを明記する場合)
は、mimeencodeが必要です。

メールの本文は、jisのままで送れるので・・・
$body = mimeencode($body);
の行は、不要ですね。

sendmailへの送り込みは、こんな感じで記述すると、シンプルに書けますよ。
今回の事例と比較すると、何が抜けているかも把握できるかと・・・。

open(MAIL,"| $snd_path -t");
print MAIL <<"_END_";
Return-Path: $from
From: $name <$from>
To: $to
Subject: $subject
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

$body
_END_
close(MAIL);

あと、「あるレンタルサーバー」ってのは、問題も難しくする記述ですね。
昔・・・あるレンタルサーバーでは、Return-Path:が指定されていると、送信できなかったり・・・なんて事例も経験したのです・・・
あるレンタルサーバーなんて記述だと、自分がそのケースなのか判断できませんよね。

私の場合の「あるレンタルサーバー」はxreaのWindowsサーバーでした。
$bodyがエンコードされてても送信自体はされると思います。

今時requireなんかしないのでアレですが、

$subject = mimeencode($subject);

じゃなくて、

$subject = &mimeencode($subject);

じゃないですかね。
Webアプリケーションを作るときには

use CGI::Carp 'fatalsToBrowser';


を書いておくと、エラーの内容をブラウザに表示して
くれて幸せになれます。

あとですね、

use strict;
use warnings;

は是非使ってください。
デバッグの効率がはるかに向上します。
きっとPerl4で動かすのでしょうね。

いまどきだとNet::SMTPでしょうか、それとももっとよいものがある?
> 回答をくださったみなさん

ありがとうございます。
エラーの原因は、mimew.pl、jcode.plがないことでした。Jcode.pmを使用することによって解決致しました。
 実は Encode.pm も使える環境だったりとかしませんか?

 非常に古い文献を参照されているような気がします。
 Webプログラミングを学ばれるのでしたら、新しい文献を使うことをおすすめします。
捕捉として
Perl5.8以上ならEncodeモジュールが標準で使えます。
レンタルサーバということは、まあ通常なら5.8より古いのは今時無いと思います。
メール関係はMail::Sendmailを使えたら使います。楽だから
なかったらNet::SMTP
open(MAIL,"|sendmail -t");は使わないかな。

みなさん、いろいろとご指摘ありがとうございます。勉強になります。
>>質問者さん

一旦落ち着いて
$ perl -v
して下さい。どう表示されますか?
5.8 以上のバージョンが表示されたらあなたはとても幸福です。
今参考にしている教科書を一旦ちり紙交換に出して、ここ1-2年以内に出版された新しい参考書を買い直して下さい。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Perl 更新情報

Perlのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング