アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

Perlでメール送信をしたいのですが、
HELOコマンドを送信するのですが、接続に失敗します。
何故失敗するのが、原因が分かりません。
何を調査したらよいのか、
ご存知の方、ご教授を頂けますでしょうか。

(プログラム)
ファイル名:mail.cgi
一部抜粋
# ------------------------------------------------------- #
# SOCKETの作成
# ------------------------------------------------------- #

# PORT番号を取得します
$port = getservbyname('smtp','tcp');

# PORT、IPで構造体を作成する
$struct = sockaddr_in($port,inet_aton($server));

# ソケットの生成
socket(SH, PF_INET, SOCK_STREAM, 0)
|| die("ソケットの生成失敗 $!") ;

# 接続
connect(SH, $struct )
|| die("接続失敗 $!") ;

# ソケットのバッファリングは行わない
select(SH); $| = 1; select(STDOUT);

$respons = <SH> ;

unless($respons =~ /^220/) {
close(SH); die("接続失敗 $!") ;
}

# ------------------------------------------------------- #
# コマンドの送信
# ------------------------------------------------------- #

# -------- HELOコマンドの送信とレスポンスの確認 --------- #

# コマンドの作成、送信
$command = "HELO $server\n";
print SH $command ;

# レスポンスの受信、確認
$respons = <SH> ;
&decode(\$respons) ;

# レスポンスの確認
unless($respons =~ /^250/){
close(SH); die("HELOコマンド失敗 $!") ; ←ログをみる限りココに着ます。
}

(err_log)
[Wed Aug 27 12:25:33 2008] [error] [client XXX.XXX.XXX.XXX] HELOコマンド失敗 Illegal seek at /XXX/mail.cgi
line 149.,
プログラムの149行目は、die("HELOコマンド失敗 $!") の個所です。

A 回答 (4件)

$command = "HELO $server\r\n";


としても同じですか ?

行末が CRLF じゃないといけないという厳しいメールサーバかも
しれません。
    • good
    • 0
この回答へのお礼

ご連絡が遅くなり大変申し訳ございません。

t-okura様の言う通り\r\nで実施したら、
正常に動作しました。

ありがとうございました。

お礼日時:2008/09/08 18:46

正常にメール送信できているクライアントPCで Wireshark を動かし,流れているSMTPパケット群を抽出して,そのSMTPコマンド文字列をそのままPerlで送信すればいいんじゃないですか。


http://okwave.jp/qa4230418.html の私の過去の回答 ANo.1
    • good
    • 0

> サーバーの管理者に問い合わせはしましたが、


> サーバーのメールサービスは起動していますと
> 連絡はありました。

> $command = "HELO $server\n";

ここでのコマンドを HELOじゃなくて EHLO にすると何か変わりますか?
あと、POP before SMTP使わなきゃいけないとかはないですよね?

この回答への補足

>ここでのコマンドを HELOじゃなくて EHLO にすると何か変わりますか?

EHLOで実施しましたが、結果は同じでした。

試しに手動で実施したところ動作します。
プログラムから実施するとうまく動作しません。
>telnet XXX.XXX.XXX.XXX 25
Trying XXX.XXX.XXX.XXX...
Connected to XXX.XXX.XXX.XXX.
Escape character is '^]'.
220 XXX.XXX.XXX.XXX [ESMTP Server] service ready;.; 08/28/08 12:28:56
>HELO XXX.XXX.XXX.XXX
250 XXX.XXX.XXX.XXX

補足日時:2008/08/28 11:44
    • good
    • 0

# レスポンスの確認


unless($respons =~ /^250/){
close(SH); die("HELOコマンド失敗 $!") ; ←ログをみる限りココに着ます。
}

何で返ってきたコードの確認をしていないんですか?

この回答への補足

ログをみる限り、コードが表示されていませんが、
どのように確認すればよいのですか?

補足日時:2008/08/27 13:40
    • good
    • 0
この回答へのお礼

すみません。
コードの確認が取れました。
コードは、421 session timeoutです。

サーバーの管理者に問い合わせはしましたが、
サーバーのメールサービスは起動していますと
連絡はありました。

お礼日時:2008/08/27 14:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!