CGIを経由したメール送信
URL url=new URL("http://150.42.41.129/cgi-bin/tool/sendmail.cgi");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
uc.setUseCaches(false);
URLクラスのインスタンスを、サーバーの CGI を指定して生成します。これから、url.openConnection();
でuc を作成し、setDoOutput() で、出力モードを設定します。これで、
PrintWriter pw = new PrintWriter(uc.getOutputStream());
で、PrintWriterクラスの pw を生成すると、pwから CGI にURLエンコードしたパラメータが送出されます。この文字列は、html
のFORM タグで、入力した情報を送信する場合と同じです。String data="from="+textFieldFrom.getText()+"&to="+textFieldTo.getText() +"&title="+textFieldsbj.getText()+"&msg="+textFieldmsg.getText();form= の from が送信者アドレスを示すキーで、CGI側でも、この名前を利用して情報を取り出します。したがって、パラメータを送る順番には意味がありません。 & はパラメータを接続(分離する)する 記号になります。スペースなどの特殊記号、漢字などは別の文字に変換され送ります。
BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String line="";
String answer= "";
while((line = br.readLine()) != null){
answer += line + "\n";
//System.out.println(answer);
}
で受け取ることができます。CGIの送信文字は、ページを記述するhtml 文書になりますが、ここでは、単に文字列として受け取ることになります。 my $SENDMAIL = "/usr/lib/sendmail";
$subject = mimeencode( jcode'jis($FORM{'title'}) );
$message=$FORM{'msg'};
$message = jcode'jis($message);
$from = $FORM{'from'};
$to = $FORM{'to'};
$from =~ s/@/\@/;
open MAIL,"|$SENDMAIL -t -f $from" || &error("メール送信失敗・・・");
print MAIL "Subject: $subject\n";
print MAIL "To: $to\n";
print MAIL "\n";
print MAIL "$message\n";
close MAIL;
}
実際のメール送信は、open MAIL 以後で行います。openはファイル(javaの場合ストリームの概念に対応します)形式で、指定したアプリケーション (この場合、/usr/lib/sendmail)
に、 print MAIL でデータを流し込むことができます。 void buttonSend_actionPerformed(ActionEvent e) {
try{
URL url=new URL("http://150.42.41.129/cgi-bin/tool/sendmail.cgi");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
uc.setUseCaches(false);
System.out.println("connected?");
PrintWriter pw = new PrintWriter(uc.getOutputStream());
String data="from="+textFieldFrom.getText()+"&to="+textFieldTo.getText()
+"&title="+textFieldsbj.getText()+"&msg="+textFieldmsg.getText();
String postdata=data;
System.out.println("send:"+postdata);
pw.print(postdata);
pw.flush();
pw.close();
BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String line="";
String answer= "";
while((line = br.readLine()) != null){
answer += line + "\n";
//System.out.println(answer);
}
System.out.println(answer);
br.close();
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
#!/usr/bin/perl
# first sample
use strict;
require "./mimew.pl";
require "./jcode.pl";
use CGI_Lite;
my $SENDMAIL = "/usr/lib/sendmail";
my $PLATFORM = 'Unix';
# $ENV{'REQUEST_METHOD'}='GET';
# $ENV{'QUERY_STRING'}='from=web@chukyo-u.ac.jp&to=yt7m-itu@asahi-net.or.jp&msg=hello&title=test';
#main
my ($from,$to,$message,$subject,%FORM);
&decode();
&send_mail();
&showPage("送信完了しました<br> . $from . $to.<BR>");
#送信完了を知らせるページを作成する
sub decode {
my ($buffer,@pairs,$pair);
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
my ($key,$value);
($key,$value) = split(/=/, $pair);
$FORM{$key} = $value;
}
}
#------------#
# メール送信 #
#------------#
sub send_mail{
$subject = mimeencode( jcode'jis($FORM{'title'}) );
$message=$FORM{'msg'};
$message = jcode'jis($message);
$from = $FORM{'from'};
$to = $FORM{'to'};
#open MAIL,"|$SENDMAIL -t -f mito\@ccad.sccs.chukyo-u.ac.jp" || &error("メール送信失敗・・・");
#$from = "mito\@sccs.chukyo-u.ac.jp";
$from =~ s/@/\@/;
open MAIL,"|$SENDMAIL -t -f $from" || &error("メール送信失敗・・・");
#print MAIL "From: mito\@ccad.sccs.chukyo-u.ac.jp\n";
#print MAIL "From: $from\n";
print MAIL "Subject: $subject\n";
print MAIL "To: $to\n";
print MAIL "\n";
print MAIL "$message\n";
close MAIL;
}
sub showPage{
print qq(Content-type: text/html;charset=Shift_JIS\n\n);
print qq(<HTML><HEAD><TITLE>message</TITLE><BODY>);
print @_[0];
print qq( 戻るボタン);
print qq(</BODY></HTML>);
}
sub error{
print qq(Content-type: text/html;charset=Shift_JIS\n\n);
print qq(<HTML><HEAD><TITLE>message</TITLE><BODY>);
print @_[0];
print qq( 送信できません);
print qq(</BODY></HTML>);
exit(0);
}