このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

Mac Perl でメールを送る。

発言者:usui , seiichi
( Date Wednesday, December 04, 1996 05:45:28 )


メールを送るスクリプトを書いてみました。
サンプルを改造しただけなので、正式な書き方を理解していません。
いけないことがありましたら指摘して下さい。

↓
#!/usr/local/bin/perl

require 'jcode.pl';
use Net::SMTP;

my $to          = 'Perl@i-3.miy.yamanashi.ac.jp';
my ($to, $host) = split(/@/, $to, 2);
my $smtp        = Net::SMTP->new($host);
my $sender      = 'usui';
my $from        = 'usui';
my $em          = 'usui@rasa.miy.yamanashi.ac,jp';
my $subject     = "test mail";
my @header      = ("From: $from <$em>\n",
                   "Reply-To: $em\n",
                   "To: $to\n",
                   "Subject: $subject\n",
                   "\n");
my @message     = ('メール自動送信のテストです。',"\n",
                   'レポートをお願いします。',"\n");

$smtp->mail("$from");
$smtp->to($to);
$smtp->data();
$smtp->datasend(@header);
$smtp->datasend(@message);
$smtp->dataend();
$smtp->quit;

print "\n",'メールを送りました',"\n";

↑

→  usui,seiichi

yosimoto さんからのコメント
( Wednesday, December 04, 1996 08:06:17 )

>いけないことがありましたら指摘して下さい。

いけないわけではありませんが、サブルーティンの中じゃないので、変数の前
にmyは必要ないのではないでしょうか。

それから、折角jcode.plを読み込んでいるのですから、日本語の部分はJISに
変換してから送るようにしましょうね。

よしもと

usui , seiichi さんからのコメント
( Thursday, December 05, 1996 02:57:38 )

>それから、折角jcode.plを読み込んでいるのですから、日本語の部分はJISに
>変換してから送るようにしましょうね。

忘れていました。実験していたら、文字化けするときと、文字化けしない時が
あったのですが、これで解決しそうです。

よしもと先生、コメント有り難うございました。

大分県 安東 さんからのコメント
( Friday, January 17, 1997 11:43:15 )

私にもPerlを教えて下さい。早速、MacPerl 4.1.8 FATを入手し、日本語化
パッチをあてました。

で、上記のサンプルをRUNしてみたのですが、動きません。

で、環境が悪いと思うのですが、どの辺をみればいいのでしょうか ?

アドバイスお願いします。

こにし さんからのコメント
( Friday, January 17, 1997 12:49:32 )

上のスクリプトは、perl5 が必要です。


usui , seiichi さんからのコメント
( Friday, January 17, 1997 14:02:09 )

"MacSMTP.pl"を使ったスクリプトならMacPerl4でも動くかな?
使ったことがないからわかりませんが。

usui , seiichi さんからのコメント
( Friday, January 17, 1997 14:10:39 )

よしもと先生のページにある・・・・URLかわったのかな?
スクリプトを参考にするのがよいと思います。
CGI kitの中にメールを送るCGIがあります。

#よしもと先生よろしくお願いします。

こにし さんからのコメント
( Friday, January 17, 1997 14:12:27 )

>"MacSMTP.pl"を使ったスクリプトならMacPerl4でも動くかな?
>使ったことがないからわかりませんが。

それなら、動くはずです。

大分県 安東 さんからのコメント
( Friday, January 17, 1997 14:15:55 )

アドバイスありがとうござます。

>>Perl5...

早速、入手します。

Perl5だと日本語の取扱いもOKなのですか ?
あと、ネットワークコネクションのリソースなどはどうでしょう ?
(そのまま、RUNすればいいのかな)

今後とも宜しくお願いします。

こにし さんからのコメント
( Friday, January 17, 1997 14:38:17 )

漢字コードはEUCであれば、問題なく扱えます。
jcode.plでEUCにして、操作した後に、JISに変換して出力すればよいです。

ただ、perlをインストールしたフォルダのlib:Netにsmtp.pmが必要ですが、
デフォルトで入っていたように記憶してます。
#なかったら、CPANかなぁ。

おまけ。
ぼくが、使っていたメール送信formとスクリプトです。
ここに載せるために少し修正したので、その動作確認してません。
#完全無保証。
-------------------------------------------guestMail.html
ご意見お聞かせください
<FORM METHOD="POST" ACTION="guestMail.cgi">
お名前:<INPUT type="TEXT" name="NA" size=40><p>
メールアドレス:<BR>
<INPUT type="TEXT" name="MA" size=60><P>
ホームページ:<BR>
<INPUT type="TEXT" name="HP" size=60><P>
<hr><P>
メッセージ:<br>
<TEXTAREA name="ME" ROWS=6 COLS=60></TEXTAREA><p>
<INPUT type="SUBMIT" value="Send">
<INPUT type="RESET" value="Reset">
</FORM>

--------------------------------------------guestMail.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "\n";
print "<BODY BGCOLOR=\"#FFFFFF\">\n";

require 'jcode.pl';

$mymail = "メールアドレス";
$myserver = "このCGIを動かすサーバ";
$smtpserver = "SMTPサーバ";

if ($ENV{'REQUEST_METHOD'} eq "POST") {
  read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
} else {
  $str = $ENV{'QUERY_SRTING'};
}

#print "$str<br>\n";

@part = split('&', $str);
foreach $i (@part) {
  ($variable, $value) = split('=', $i);
  $value =~ tr/+/ /;
  $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("c",hex($1))/ge;
  &jcode'convert(*value, 'euc');
  $value =~ s/</</g;
  $value =~ s/>/>/g;
  $value =~ s/\015\012/\012/g;
  $value =~ s/\015/\012/g;
  $cgi{$variable} = $value;
}


$name = $cgi{'NA'};
$email = $cgi{'MA'};
$url = $cgi{'HP'};
$memo = $cgi{'ME'};

$body  =  "YourName:\n$name\n\nYourE-mail:\n$email\n\nURL:\n$url\n\nMessage:\n$memo\n";

#------

if ($name eq "" || $memo eq "") {
    print <<EOF;
    <title>Error</title>
    sorry. please input your name and messages.
EOF
  exit (1);
}else{
  
  &jcode'convert(*body, 'jis');
    print <<EOF;
    <title>Thanx</title>  
      thanx for your messages.<br>
      sent messages like this.<hr>
    <pre>$body</pre><hr>
EOF
  
  use Net::SMTP;
  $smtp = Net::SMTP->new('$smtpserver',
                          Hello => '$myserver'
                           );
    $smtp->mail($mymail);
  $smtp->to('$mymail');
  $smtp->data();
  $smtp->datasend("To: $mymail\n");
  $smtp->datasend("Subject: Message From GUEST.\n");
  $smtp->datasend("\n");
  $smtp->datasend("$body\n");
  $smtp->dataend();
  $smtp->quit;
    
}


大分県 安東 さんからのコメント
( Friday, January 17, 1997 14:57:58 )

>>...EUCにして、操作した後...

スクリプト内に日本語を記述したい場合はどうですか ?

あと、UNIX版との互換性はどうですか ?

#perl5は混んでいるからまた来週だなあ...

usui , seiichi さんからのコメント
( Friday, January 17, 1997 15:43:55 )

>あと、UNIX版との互換性はどうですか ?

MacPerl Homepageに書いてあったようなきがします。
#英語は読みません。ごめんなさい。

MacPerl5は
最新版でないのなら、インターネットマガジンのおまけCDロム
か、日本のミラーサイトにもあります。


→  MacPerl Homepage

usui , seiichi さんからのコメント
( Friday, January 17, 1997 15:46:44 )

jcode.pl以外はCPANにあります。


→  CPAN

こにし さんからのコメント
( Friday, January 17, 1997 17:03:59 )

スクリプト中にもEUCであればかけます。

UNIXとの互換性ですが、マックで実現できない
プロセスまわり、ファイルロックなどはできません。
UNIX用で出まわっているCGIなどでは動かないものもあります。


usui , seiichi さんからのコメント
( Friday, January 17, 1997 17:14:31 )

sjisで書くときは、'漢字'もしくは"かんじー\"("ー"でエラーがでるとしたら)
とすれば書けます。

こにしさんの言うとおりに、Jeditなどで編集してeucでセーブをすれば、
日本語でエラーは出ないと思います。(でないはずです。)

大分県 安東 さんからのコメント
( Friday, January 17, 1997 18:06:10 )

>>、Jeditなどで編集してeucでセーブ...

なるほど気がつきませんでした。

>>code.pl以外はCPANに...

日本のサイトにもあったのですね。早速、入手しました。

>>lib:Netにsmtp.pmが必要...

デフォルトではないようです。CPANも探してみたのですが、探せません
でした...とほほ...

#appl_bigなどってどういうものなんですか ?

usui,seiichi さんからのコメント
( Friday, January 17, 1997 18:19:42 )

次のところにあります。このなかに、入っているはずです。

→  libnet-1.01.sit.hqz

奥脇 さんからのコメント
( Saturday, January 18, 1997 10:35:36 )

こにしさんのスクリプトを早速試さしていただいたのですが、
MacPerl 5.1.1r2 + libnet-1.03  + QuidQuoPro1.0 
という環境では、SMTP.pm まわりでエラーが出てしまい、
うまく実行出来ませんでした。

このような環境で、うまく行った方がいらっしゃったら、
教えてくださいませ。


→  libnet-1.03

よしもと さんからのコメント
( Saturday, January 18, 1997 11:29:15 )

ちょっと出遅れてしまった (^^;

ところで、奥脇さんはPowerMacをお使いですか?
もし、そうでしたら良いのですが、68マシンを使っているのでしたら
MacPerl 5.1.1r2だと駄目かもしれません。
その場合は、一つ前のバージョンのMacPerlとbigと名前のついた
big版を落としてきてください。
それからアプリケーションをオリジナルからbig版に変えて実行してください。

もし、PowerMacを使っているのでしたら、チョト分からないのですが、
エラーメッセージなどを教えていただけると、少しは解決の糸口が分かるか
もしれません。

(よ)

奥脇 さんからのコメント
( Saturday, January 18, 1997 12:55:52 )

使用しているのは、PM7500/100 です。

まず、MacPerl 5.1.1r2 の lib そのままだと、

# syntax error, near ")"
#  (Might be a runaway multi-line () string starting on line 298)
File 'Main:Utility:Scripte:MacPerl511:lib:Socket.pm'; Line 309
# BEGIN failed--compilation aborted.
File 'Main:Utility:Scripte:MacPerl511:lib:Net:SMTP.pm'; Line 197
# BEGIN failed--compilation aborted.
File 'Main:Server:WebCenter:kb:guestMail.cgi'; Line 59
# Unbalanced scopes: 1 more ENTERs than LEAVEs
# Unbalanced saves: 120 more saves than restores

というエラーが出ます。
そこで、Socket.pm を最新の物(970115)に入れ替えたところ、
コンパイルはとおるのですが、

# Net::SMTP: Unexpected EOF on command channel
File 'Main:Utility:Scripte:MacPerl511:lib:Net:SMTP.pm'; Line 510

となり、暴走してしまいます。

#5.1.0 への変更のあと、バグが残っているのかなぁ?

→  Fixed_Library

こにし さんからのコメント
( Sunday, January 19, 1997 10:59:45 )

をや、奥脇さん、そのせつはどうも。

ぼくの環境でテストしてみました。

Quadra650 + System 7.5.5 + JLK 1.2 + OT 1.1.2
MacPerl 5.1.0r2(←よしもとさんのおっしゃるようにbig版です)
MacHTTP

の上で、しっかり動いてます。



最近は、自分のホームページをUNIXの上に移動させてしまったので、
この方法は使ってません。
Mailコマンドを直接呼ぶ方法のほうが、楽なんで……。

こにし さんからのコメント
( Sunday, January 19, 1997 11:09:19 )

そういえヴぁ、
Perl5のばあい、メールアドレスは
  konishi\@hauN.jp
といったように@の前に\が必要です。

Go Kobayashi さんからのコメント
( Sunday, January 19, 1997 12:09:12 )

あー、大変な勘違いをしてました!

今、Mail送信のプログラムでは無いのですが、MacPerlとUNIX Perl両方
で動く会議室CGIを作ってるところです。

>こにしさんの言うとおりに、Jeditなどで編集してeucでセーブをすれば、
>日本語でエラーは出ないと思います。(でないはずです。)

私、MacPerl上では、日本語はSJISでないと駄目なのかと思っていました。
まいった。
その為、むきになってコード変換(SJISへ)しまくっていました。(今ま
では、たまたまうまく行っていたのだなぁ。)

助かりました。(T_T)

早速作り直さねば...。
やっと公開しようとした矢先でした...。

usui , seiichi (赤面) さんからのコメント
( Sunday, January 19, 1997 13:53:49 )

>私、MacPerl上では、日本語はSJISでないと駄目なのかと思っていました。

まえ、僕が自分でそう主張しました(赤面)
経験を積んで見ると、当時質問されてたことと答えたことが、かみ合ってない
ことに気づいたのですが・・・。

僕のつかっているネットすケープはEUCの認識が甘いので、
できればSJISがいいです。
もしくは、ページすべてに、
<META HTTP-EQUIV="Expires" CONTENT="Thu, 21 Dec 1995 12:12:12 GMT" charset=EUC>
#これでいいと思うけれど
を入れてくれると嬉しいです。

公開されるのを楽しみにしています。

Go Kobayashi さんからのコメント
( Sunday, January 19, 1997 16:42:43 )

> 公開されるのを楽しみにしています。

ありがとうございます。がんばります。

ところで、
> <META HTTP-EQUIV="Expires" CONTENT="Thu, 21 Dec 1995 12:12:12 GMT" charset=EUC>

と、書くとネットスケープが、EUCと認識してくれるのですね。
でも、もうちょっと詳しく知りたいので、何を見たらこの書き方(?)の詳細が
分かるか教えて頂けますか?

またひとつ謎が増えてしまった。(^_^)
webは奥深いのであった。


usui , seiichi さんからのコメント
( Sunday, January 19, 1997 16:55:22 )

すみません、どこで見たのか覚えていません。

> <META HTTP-EQUIV="Expires" CONTENT="Thu, 21 Dec 1995 12:12:12 GMT" charset=EUC>

これは、僕のCGIで試したところeucを認識してくれたので、使っています。
CONTENTの部分はいらないかも知れません。

METAタグの使い方ご存じの方、いませんか?

田中求之 さんからのコメント
( Sunday, January 19, 1997 17:08:10 )

Perl の話にはついていけないのですが (^_^;;

>METAタグの使い方ご存じの方、いませんか?

META タグは、基本的には HTTP ヘッダーをページに埋め込んでおくのに使われます。
HTTP-EQUIV の部分でヘッダー名を、CONTENT でヘッダーの内容を記述します。

HTTP-EQUIV="Expires" CONTENT="Thu, 21 Dec 1995 12:12:12 GMT" 

の場合は、Expires ヘッダー(ページのデータの有効期限を示すヘッダー)で
95年12月21日、つまりずっと過去を指定したことになり、結果として、
期限切れのデータであるという情報がブラウザに送られます。これによって
ブラウザ側では、ページのデータをキャッシュしなくなるわけです。

META タグそのものの解説は、私も読んだことがないのですが、HTTP プロトコル
に関するドキュメントを読めば、HTTP ヘッダーの種類やその利用方法はわかる
ようになっています。(以下のページを参照。今なら HTML 3.2 に関するアナウンス
などもあります)

→  W3C - The World Wide Web Consortium

usui , seiichi さんからのコメント
( Sunday, January 19, 1997 17:17:44 )

探してみました。

→  METAタグ小技

こにし さんからのコメント
( Sunday, January 19, 1997 17:23:18 )

えっと、たなかさんの答えの後にアレですが、
漢字コードの問題であれば
<meta http-equiv="Content-Type" content="text/html; charset=ISO-2022-JP">
<meta http-equiv="Content-Type" content="text/html; charset=EUC">
<meta http-equiv="Content-Type" content="text/html; charset=SJIS">
でよいでしょう。

# って,EUCとか、SJISで、よかったかどうか……。

個人的にはiso-2022-jp(いわゆるJIS)で書くのが最も誤認識の少ない方法だとは思いますが。

こにし さんからのコメント
( Sunday, January 19, 1997 17:30:43 )

あ、x-euc-jp,x-sjisみたいですね。
ぐはっ。

usui , seiichi さんからのコメント
( Sunday, January 19, 1997 17:49:13 )

フォローがありましたが、僕が見たところはここのようです。
http://www.etl.go.jp/People/yamana/www4mac/02a.html#SEC-2.9

 charset=ISO-2022-JP
だけ覚えていて、とりあえず、今使っているタグにeucと書き換えて
試してみたところ、見事認識してくれたので、そのまま使っていました。

Go Kobayashi さんからのコメント
( Monday, January 20, 1997 08:19:10 )

ありがとうございます。
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-euc-jp">
で試してみます。
<HEAD>〜</HEAD>の中に書けば良いのですよね。

後、災転じて福と成す。
SJISへの変換の部分をとっぱらったら、動作が速くなりました。
会議室CGI完成間近。(^_^)
でも、年末にも完成間近と言っていた気がする...。
出来上がりましたら、また、報告させて頂きます。

元永二朗 さんからのコメント
( Monday, January 20, 1997 14:12:05 )

お知らせしていなかった気もするので、お知らせします(^^;。

MacPerlで、会議室と言うか掲示板に毛が生えたようなものを作りました。
Mac以外にも、WinNTでも一応動作しています。

AppleScriptの腕もまだまだ未熟ですが、Perlはさらに自信無しです。
スクリプト中で、きっと何か変なことをしているに違いなく、恥ずかしい
かぎりですが、何かのお役に立てれば・・・と思います。

→  WebBoard(仮名)

奥脇 さんからのコメント
( Monday, January 20, 1997 23:33:24 )

MacPerl 5.1.2r2 がリリースされたようです。

CGI glue がバンドルされたのと、
Socket.pm の bug fix がされたそうなので、
Mail 回りがこれでうまく動いてくれたら良いなと、期待してます。

→  MacPerl 5.1.2r2

奥脇 さんからのコメント
( Tuesday, January 21, 1997 09:05:41 )

MacPerl 5.1.2r2 に入れ替えたところ、
Socket.pm でのエラーは発生しなくなりました。

ただし、timelocal 回りのバグは、治ってないみたいです。

よしもと さんからのコメント
( Wednesday, January 22, 1997 08:36:21 )

MacPerl 5.1.3 がリリースされました。

>5.1.3r2 21Jan97
>- Another attempt at runtime applications [Scott Weaver].

となっていますから、5.1.2r2からは大きな変更はないようですね。
早くbig版でないかなぁ。

smart さんからのコメント
( Wednesday, January 22, 1997 11:03:31 )

昼間は混んでいて、落とせません。
5.1.3では、以下のバグは直っていますか。

【不具合の例】
#!perl

### Include libs #######################
###

require 'timelocal.pl';

### Get Current Date ###################
###

($day, $mon, $year) = (gmtime(time))[3, 4, 5];

print $year," ",$mon,"\n";



$time=timelocal(0,0,0,1,$mon,$year);
($MON,$YEAR,$WDAY)=(localtime($time))[4,5,6];
print $MON," ",$YEAR," ",$WDAY," ","\n";

ショージ さんからのコメント
( Thursday, January 23, 1997 11:03:13 )

smartさん、こんにちわ。

Calendar.acgiを使用していただいている様でありがとうございます。
このバグを回避するために
require ":Time:Local.pm";を最初の方にいれていただいて
$time=timelocal(0,0,0,1,$mon,$year); を
$time = &Time::Local'timelocal(0,0,0,1,$mon,$year);
とすれば動くはずだと思いますけど、試験したらごみが出ちゃいますねぇ。

う〜〜〜む。時間があれば直すんですけど、MacWorldまではちょっと
無理ですねぇ。すみません。

MacWorld EXPOではディアイティのブースで何回かセミナーみたいな事をし
ていますので、その時に声をかけて下さればうれしいです>皆さん。

かわのしょうじ
shoji@dit.co.jp



を




smart さんからのコメント
( Thursday, January 23, 1997 12:28:38 )

ショージさんへ

忙しい中、回答ありがとうございます。timelocalの件は、Macperlのバージョンを
上げたら発生して、がっかりしております。カレンダは重宝しております。

ついでに、READMEで書かれていた閏年の件ですが、更に400で割り切れたら
閏年になります。例えば、2000年は閏年です。どこかで、1行ぐらいの簡潔な物を
見た様に思っておりますが、未だ見つかりません。
一つ質問もします。年号の制限(2040年まで)は、どこからくる制限ですか。

田中求之 さんからのコメント
( Thursday, January 23, 1997 13:15:59 )

Perl のことは分かりませんが、

>年号の制限(2040年まで)は、どこからくる制限ですか。

MacOS での制限ですよね? これは、MacOS の時間関係の API の古いものが
時間を 1904 1/1 を起点とした秒ではかるようになっており、さらにそのデータ
が 32bit 符号無し整数として定義されていることによるものです。つまり、2040年
で 32bit を使いきってしまうということですね。

新しい API (Toolbox) では 64bit の整数を使うようになっていますので、
こちらを使ったものでは 2040 年以降も大丈夫です。たとえば AppleScript
の日付データ( date object )は、内部的には、この 64bit のデータを
使ったものになっています。

もっとも、2040 年まで、今の MacOS をそのまま使っている(使えている)とは
誰も思わないだろうけど… (^_^;;

INAI さんからのコメント
( Thursday, January 23, 1997 17:43:21 )

TimeLocalのことですが、
use 'Time::Local';
とした場合には、この文の実行時にprint文が2つあってそれがごみを出すようです。
ただし、計算は正しく行われます(閏年のことは未確認)

一方、
require 'timelocal.pl'
の方は、1997年とか最近の年号では-1を返してきます。(要するに年号が大きすぎる
と思っているらしいです)2つを見比べてみると、

sub timegmとsub timelocalの中が少し違います。
下の方(timelocal.pl)では
return -1 if $cheat<0;
上の方では
return -1 if $cheat<0.1;
になっています。timelocal.plの方の0を0.1に直すと取り敢えず正常に動いています。

Go Kobayashi さんからのコメント
( Thursday, January 23, 1997 23:44:22 )

TimeLocalの話題の間に失礼します。(^^)

色々とお世話になりました。
先日書きました会議室CGIがやっと出来ました。
名前を TANTO Communication Board と言います。

それと、GOsKitと言うCGI用ミドルウェアを作りました。
GOsKitは、使うのはプロバイダのサーバ(UNIX)だけど、作る
のは自分のMacと言う現状で、出来るだけ楽して開発と動作
テストをしたいと言う気持ちから出来たものです。

行く行くは、GOsKitを中心にしたCGIツールキットに育てて行
きたいと思っています。
本当は、仕事柄プログラミングよりは、作った物を使う方が
主なので、「造る簡単、使う沢山」が私のテーマなのです。

まだ、αバージョンですが、どんなものが出来ているのか覗い
てみてやって下さい。
このミーティング同様、スクリプティングの楽しさを広げる事
に一役買えたとしたら幸いです。

ありがとうございました。
また、今後もよろしくお願い致します。


→  Libraly__KARAKURI__