カスタム検索
このエントリーをはてなブックマークに追加
tomo.gif (1144 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)To previous pageTo home pageMailing to me

Perlの小技

Modified: 1 December 2007
Created:
18 December 2005


モジュールの小技

CPANの環境設定をする方法 (1 December 2007)
CPANのエラーで悩む (1 December 2007)

モジュールがインストールされているかどうかを確認する方法 (14 May 2005)
モジュールを入手してインストールする方法 (20 May 2005)
モジュールのインストールを自動で行う方法 (11 June 2005)
モジュールのドキュメントを見る方法 (11 June 2005)
モジュールのソースを見る方法 (11 June 2005)

CGIプログラムの小技

Jcodeのインストールと使い方18 December 2005

動作確認のCGI (19 June 2005)
メールを送信する方法 (19 June 2005)

CGIの必須構造 (20 May 2005)
漢字が文字化けしないようにする (20 May 2005)
"cgi-bin"以外のディレクトリで実行させる方法

動作しているCGIが実行できない (28 September 2008)
Windowsで作ったCGIがLinuxで実行できない (1 June 2005)

モジュールの小技

メールを送信する記述方法 (20 May 2005)


 モジュールの小技

モジュールがインストールされているかどうかを確認する方法

以下のコマンドを実行すると確認できます。

# find `perl -e 'print "@INC"'` -name '*.pm' -print

上記ではたくさん出てきますので、実際には、以下のように、"grep"コマンドで目的のものだけにするといいです。

# find `perl -e 'print "@INC"'` -name '*.pm' -print | grep SMTP
/usr/lib/perl5/5.8.0/Net/SMTP.pm
/usr/lib/perl5/vendor_perl/5.8.0/Mail/SpamAssassin/SMTP/SmartHost.pm
/usr/lib/perl5/vendor_perl/5.8.0/Mail/SpamAssassin/SMTP/SmartHost.pm
./Net/SMTP.pm
./blib/lib/Net/SMTP.pm
#


モジュールを入手してインストールする方法

CPANの本家のページから入手します。
http://www.cpan.org/

CPAN modules, distributions, and authors (search.cpan.org)」を開くと検索窓が現れますので、モジュール名("Net::SMTP")を入力して検索するとリストが出てきます。

目的のモジュールをクリックするとそのモジュールの説明文のページが開き、ダウンロードのリンクも見えますので、クリックしてダウンロードします。

ダウンロードするファイルは、"libnet-1.19.tar.gz" のように、tar.gz になっています。

以下の手順で、解凍してインストールします。

# tar zxvf libnet-1.19.tar.gz
# perl Makefile.PL
# make
# make install


モジュールのインストールを自動で行う方法

以下のコマンドで、専用のシェルを起動します。

# perl -MCPAN -e shell

cpan shell -- CPAN exploration and modules installation (v1.61)
ReadLine support available (try 'install Bundle::CPAN')

cpan> 

そして、インストールしたいモジュール名を入力して実行します。

cpan> install Crypt::DSA

依存関係を含めたモジュールのダウンロードから、Makeインストールまですべてを自動でやってくれます。


モジュールのドキュメントを見る方法

以下のコマンドで、ドキュメントを表示できます。

# perldoc Crypt::DSA 


モジュールのソースを見る方法

以下のコマンドで、ソースを表示できます。

# perldoc -m Crypt::DSA 

 CGIプログラムの小技

CGIの必須構造

PerlのCGIでは、以下の1行を先頭にいれなければなりません。

#!/usr/bin/perl

"/usr/bin/perl"は、perlのパスです。

以下のコマンドで確認できます。

# whereis perl
perl: /usr/bin/perl /usr/share/man/man1/perl.1.gz
#

PerlのCGIでは、結果はブラウザに送ります。その際に、どういうテキストなのかを送っておかなければなりません。

"html"ファイルを送る場合、2行目に、"Content-type: text/html"が必要です。

#!/usr/bin/perl
print "Content-type: text/html\n\n";

"html"ファイルでない場合は、"Content-type: text/plain"を記述します。

#!/usr/bin/perl
print "Content-type: text/plain\n\n";


漢字が文字化けしないようにする

Linuxの日本語の内部コードは、EUCですし、最近はUTF-8だったりしますが、Windowsは、ShiftJISというのを使っていますので、フツーに出力すると文字化けします。

出力するタグに、以下の2行を追加します。これらは、"<head>"、"</head>"のタグ間に出力する必要があります。

<head>

<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<meta http-equiv="Content-Language" content="ja">

</head>


Windowsで作ったCGIがLinuxで実行できない

WindowsでつくったCGIのファイルは、改行コードが、<CR><LF>になっています。

LinuxのCGIのファイルの改行コードは、<LF>だけです。

したがって、Windowsで作ったCGIをそのまま転送すると、Linux上では実行エラーになります。

転送時に変換してくれるFTPソフトを使うか、転送後以下のコマンドで変換が必要です。

# perl -pe 's/\r\n/\n/' winfile > unixfile

"winfile": 変換元のWindowsで作ったファイル名

"unixfile": 変換後のファイル名

以下のサイトを参考にさせていただきました。
http://www.rsch.tuis.ac.jp/~mizutani/online/with-pc/textline.html


 モジュールの小技

メールを送信する記述方法

メール送信に必要なモジュールを準備し、宣言します。

use Net::SMTP;

サブジェクトのエンコードのために、Base64のモジュールを準備します。

use MIME::Base64::Perl;

本文を、JISコードに変換するために、Jcodeのモジュールを準備します。ただし、多くの場合、このモジュールは組み込まれていますので、特別に用意する必要はないと思います。

use Jcode;

モジュールのインストール方法は、「モジュールをインストールする方法」をご覧ください。

日本語のサブジェクトは、サブジェクトの文字コードをJISコード(ISO-2022-JP)に変換し、さらに、Base64というコードに変換し、先頭に、"=?ISO-2022-JP?B?"を付加し、最後に"?="を付加します。その処理を、"EncodeSubject"という関数(いろんなところで配布されていますので、作らなくても探せばいいと思います)を作って、以下のように使います。

$subject = "サブジェクトにする文字列";
$encoded_subject = &EncodeSubject($subject);
 

本文は、以下のように、JISコードに変換します。

$text = "メールの本文";
&Jcode::convert(\$text, 'jis');

やっと送信できるようになりました。以下のように記述すれば送信できます。

use Net::SMTP;
use MIME::Base64::Perl;
use Jcode;

$subject = "サブジェクトにする文字列";
$encoded_subject = &EncodeSubject($subject);

$text = "メールの本文";
&Jcode::convert(\$text, 'jis');

$mail_from = "sender\@tomo.ac"; 
$mail_to = "reciver\@tomo.ac"; 

$smtp = Net::SMTP->new('mailserver-name_or_IPaddress'); 
$smtp->mail($mail_from); 
$smtp->to($mail_to); 
$smtp->data(); 
$smtp->datasend("To: $mail_to\n"); 
$smtp->datasend("Subject: $encoded_subject\n"); 
$smtp->datasend("Content-Type: text/plain; charset=\"ISO-2022-JP\"\n");
$smtp->datasend("Content-Transfer-Encoding: 7bit\n");
$smtp->datasend("\n");
$smtp->datasend($text); 
$smtp->dataend(); 
$smtp->quit;
 

To previous pageTo home pageMailing to meJump to Top of pageline.gif (927 ツバツイツト)line.gif (927 ツバツイツト)tomo.gif (1144 ツバツイツト)
カスタム検索



このエントリーをはてなブックマークに追加