電子書籍の厳選無料作品が豊富!

現在cgi.pmで記述されたcgiプログラムで、自社にメールが飛んでくる仕組みになっています。作成した業者と連絡が取れなくなってしまい、この場を借りて質問させていただきます。
そのメール本文内に、受信日時を表示させたいと思いますが、どのようにしたらよいでしょうか

## sendmailによる送信
open(MAIL,"|$mailprog -t") || &error(150,"$mail は送信に失敗しました");
print MAIL $mail_dat;
close(MAIL)

という行があり、
これらの行の前に

my($date) = tslib->getDate(); と挿入し、
(※tslib.cgiという別ファイル内に日時取得の行があります)

print MAIL $mail_dat;

の後に

print MAIL $date;

と入れてみましたがCGIはエラーにはならないものの、本文中に日時が表示されません。

なお、送信された内容はCSVにも残るようになっており、その部分の記述は以下のような感じです(dateに関係なさそうなところは省いています)

sub doCsv {

my($date) = tslib->getDate();

# データの追加書込み
open(OUT,">>$file") || &error("Open Error : $file");

#print F $dq . $in{'formmail'} . $dq . "," .
#$dq . $date . $dq . "," .
#$dq . $ENV{'HTTP_USER_AGENT'} . $dq . "\n";

print OUT "$od,$dq$date$dq\n";

close(OUT);

# ロック解除
if ($lockkey) { &unlock; }
}

もしお分かりになる方がいらっしゃればよろしくお願いいたします。(変更修正はあくまで自己責任で行います)

A 回答 (3件)

>my($date) = tslib->getDate();



本当にエラーになってませんか?
それと、
use tslib とかやってますか?
別ファイルにあるのをどのように使ってるのか
疑問なんですけど。

この回答への補足

上記表記でエラーはでていません

現在修正中のファイルは
index.cgi 内なのですがその中にあった記述は

require 'tslib.cgi';
my($cook) = tslib->setCookie(
my($date) = tslib->getDate(); →これはCSVに記述するところ

の3行でした

use tslib  という表記はありませんでしたが
require 'tslib.cgi'; がこれにあたるのでしょうか?

別ファイルのtslib.cgi内には

# 日時のフォーマット
my(@gMon ) = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
my(@gWeek ) = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
my(@gWeekJ) = ('日','月','火','水','木','金','土');

sub getDate() {
# 日時の取得
my($time) = time;
my($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($time);

return sprintf("%04d/%02d/%02d(%s) %02d:%02d",
$year+1900,$mon+1,$mday,$gWeekJ[$wday],$hour,$min);

という記述があります。

CSVファイルに書き込みできている日時はここから引っ張ってきているのかなと思うのですがどうでしょうか?

補足日時:2008/07/24 17:43
    • good
    • 0

あ、書き忘れてた。



変数 $mail_dat の中身はどうなっていますか。
もし、最後の行が . のみだった場合、SMTPプロトコルの仕様で、
そこが最終行という指定になりますので $mail_dat に代入している
ところで . の前に時刻を入れる処理をするようにしてみてください。

↓Sendmailについて

参考URL:http://argrath.ub32.org/perldocjp/5.6.1/perlfaq9 …

この回答への補足

mail_dat に関する記述は

--------------------
## $t_dat--$file_datをBase64でエンコードしたデータ
my($yourad,$mail,$subject,$honbun,$fname,$ctype,$f_dat) = @_;
my($bound,$mail_dat,$t_dat); 以下続く・・・
--------------------
if ($fname eq '') {

$mail_dat=<<"EOL";
X-Mailer: $ver
To: $mail$bcc
From: $yourad
Subject: $subject
Content-Type: text/plain; charset="iso-2022-jp"
Content-transfer-Encoding: 7bit

$honbun
EOL

} else {
--------------------
## sendmailによる送信
open(MAIL,"|$mailprog -t") || &error(150,"$mail は送信に失敗しました");
print MAIL $mail_dat;
print tslib->getDate();
close(MAIL);
--------------------

の3箇所ですがどうでしょうか??
質問ばかりで申し訳ございません・・・

補足日時:2008/07/24 17:52
    • good
    • 0

何も表示されない(空白も何らかのゴミなども)ということでしょうか。



まず、

print tslib->getDate();

などのようにしてちゃんと日時が返されているかどうかを確認して
ください。
また、正確に返されている場合は

print MAIL $mail_dat . $date;

と文字列連結してみたらどうでしょうか。

問題の部分はCGIモジュールではなく単にSendmailに依存しているよう
ですが提示されたスクリプトだけではこれ以上のアドバイスは難しいと
思います。

この回答への補足

> print tslib->getDate();

やってみましたが、表示されませんでしたので日時を引っ張れていないのだと思います。

index.cgiプログラムの下のほうに

# 現在日時を文字列化する
sub get_date_string {
my($sec, $min, $hour, $day, $mon, $year);
( $sec, $min, $hour, $day, $mon, $year ) = localtime(time);
$year += 1900;
$mon++;
# 必要なら0を付加する
if ($hour < 10) {
$hour = "0$hour";
}
if ($min < 10) {
$min = "0$min";
}
if ($sec < 10) {
$sec = "0$sec";
}
return "$year年$mon月$day日 $hour時$min分$sec秒";
}


sub format_nbsp {
my($str) = @_;

if ( length($str) <= 0 || $str eq " ") {
$str = "";
}

return $str;
}


という記述がありました。
もしかすると現在きちんと作動している、CSVへの日時書き込みはこっち(index.cgi内)で日付を取得しているのでしょうか?

補足日時:2008/07/24 18:04
    • good
    • 0

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