その他(分類に苦しんだ)改造事例集
actives のパーミッションを変更する
actives と membersのパーミッションが、元にもどってしまう
members-adminファイルを作成する時に、所有権を設定する
1通目の発言メールに対しては Subject: に通し番号を振り、返信メールに関しては Subject: はいじらない
1通目の発言メールに対して Subject: に通し番号を振り、返信メールはそのままの番号で
日別に生メールをSJIS+CRLFに変換しただけのものをアーカイブ
1ML複数投稿用アドレスで挙動を変える
WEBでメールが読めるのだから、WEB上から投稿できるようにしてほしい
包含関係MLを作る
●actives のパーミッションを変更する
【fml-help:00033】
actives のパーミッションを -rw-r----- に変更する
$UMASK を指定するか、
$START_HOOK = q#
umask(027);
#;
●actives と membersのパーミッションが、元にもどってしまう
【fml-support:09183】
$FML_EXIT_HOOK = q#
chmod 0666, $MEMBER_LIST, $ACTIVE_LIST;
#;
●members-adminファイルを作成する時に、所有権を設定する
【fml-support:08329】
# /var/spool/ml/etc/fml/site_force.ph に
$FML_EXIT_HOOK .= q#
if (-f $ADMIN_MEMBER_LIST) {
chmod 0644, $ADMIN_MEMBER_LIST;
}
#;
●1通目の発言メールに対しては Subject: に通し番号を振り、返信メールに関しては Subject: はいじらない
【fml-support:07785】
#spool とか HTML とかまとめ送りとか過去メール取り出しとかが
#ややこしくなるので、Subject にだけ使う番号を seq とは別に管理しています。
#
$SMTP_OPEN_HOOK = q`
undef $SUBJECT_FREE_FORM;
if ($Envelope{'h:subject:'} =~ /^\s*Re:/i) {
$Envelope{'h:Subject:'} = $Envelope{'h:subject:'};
} else {
$SEQ_SUBJ_FILE = "$DIR/seqsubj";
&Touch($SEQ_SUBJ_FILE) unless -f $SEQ_SUBJ_FILE;
$IDSUBJ = &GetFirstLineFromFile($SEQ_SUBJ_FILE);
$IDSUBJ++;
&Write2($IDSUBJ, $SEQ_SUBJ_FILE);
#&Log("IDSUBJ=[$IDSUBJ]");
$Envelope{'h:Subject:'} =~ s/^\s+//;
$Envelope{'h:Subject:'} = "[$BRACKET:$IDSUBJ] $Envelope{'h:Subject:'}";
}
`;
#
#seq の更新はいろいろエラーチェックが入っていますが、
#seqsubj は、万が一狂っても Subject 以外に影響がないので、
#見ての通り、何もエラー処理を書いていません。
●1通目の発言メールに対して Subject: に通し番号を振り、返信メールはそのままの番号で
【fml-help:01309】
#上の HOOK の改良版です。
# ・タグ番号の0パディング
# ・Subjectの先頭にある Re: の削除
# ・タグの後ろに Re: を入れる
#という処理を追加。
$SMTP_OPEN_HOOK = q#
undef $SUBJECT_FREE_FORM;
if ($Envelope{'h:subject:'} =~ /^\s*Re:/i) {
$Envelope{'h:subject:'} =~ s/^\s*Re://;
if ($Envelope{'h:subject:'} !~ /$END_BRACKET Re:/i) {
$Envelope{'h:subject:'} =~ s/$END_BRACKET/$END_BRACKET Re:/;
}
$Envelope{'h:Subject:'} = $Envelope{'h:subject:'};
} else {
$SEQ_SUBJ_FILE = "$DIR/seqsubj";
&Touch($SEQ_SUBJ_FILE) unless -f $SEQ_SUBJ_FILE;
$IDSUBJ = &GetFirstLineFromFile($SEQ_SUBJ_FILE);
$IDSUBJ++;
&Write2($IDSUBJ, $SEQ_SUBJ_FILE);
if ($SUBJECT_FORM_LONG_ID) {
$IDSUBJ = &LongId($IDSUBJ, $SUBJECT_FORM_LONG_ID);
}
local($pat);
local($subject) = $Envelope{'h:Subject:'};
$subject =~ s/^\s*//;
if ($BRACKET_SEPARATOR ne '') {
$pat = $BEGIN_BRACKET.$BRACKET.$BRACKET_SEPARATOR.$IDSUBJ.$END_BRACKET;
} else {
if ($BRACKET) {
$pat = $BEGIN_BRACKET.$BRACKET.$END_BRACKET;
} else {
$pat = $BEGIN_BRACKET.$IDSUBJ.$END_BRACKET;
}
}
$Envelope{'h:Subject:'} = "$pat $subject";
}
#;
●日別に生メールをSJIS+CRLFに変換しただけのものをアーカイブ
【fml-support:08941】
$DISTRIBUTE_CLOSE_HOOK = q#
my ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time))[0..6];
my $dir = "$DIR/mailbox";
my $mailbox =
$dir .'/'.sprintf("%04d%02d%02d", 1900 + $year, $mon + 1, $mday);
&Mkdir($dir);
if ( open($mailbox, ">> $mailbox") ) {
my $body = "\n". $Envelope{'Body'};
$body =~ s/\nFrom /\n>From /g;
$body = &JSTR($body, 'sjis');
print $mailbox "From $From_address \n";
print $mailbox $Envelope{'Hdr'};
print $mailbox $body ;
print $mailbox "\n";
close($mailbox);
}
else {
&Log("ERROR: cannot open $mailbox");
}
#;
●1ML複数投稿用アドレスで挙動を変える
【fml-support:08781】
# Elenaの方は、通常通り(default)の動作をする。
# Annaの方は、付けられてきたReply-To:を削除して、後は通常通りの動作をする。
#
$START_HOOK = q`
if ($Envelope{'h:to:'} =~ /Anna\@phys.titech.ac.jp/) {
&DEFINE_FIELD_FORCED('reply-to', $MAIL_LIST);
}
`;
#
#Elena と Anna の両方に To: や Cc: されたらどうしようか? とか
#そのへんによって、if や else を調節してください。
●WEBでメールが読めるのだから、WEB上から投稿できるようにしてほしい
【fml-support:08161】
Netscape を標準ブラウザとして使っている場合を想定して、
form を使って mailto: で送るようにしました。
この方法では、IE や w3m ではうまく動きません。
また、Netscape 6 は、mailto: を使うと Messenger が
起動するので、普通に ML に投稿できます。
で、Netscape 4.0x、4.7、4.73 (他は未確認)は、
Content-Type: application/x-www-form-urlencoded
で送ってくるので、これをデコードして配送にまわす
HOOK を書いてみました。
--- 投稿用 HTML (の一部) ---------------------------------------
<form method=POST action="mailto:MLアドレス">
<input type="submit" value="送信" tabindex=1>
<input type="reset" value="書き直し" tabindex=2><br>
<br>
To: アドレス<br>
Subject: <input type="text" name="subject" size=40 tabindex=3><br>
<textarea name="body" rows=30 cols=82 tabindex=4></textarea><br>
</form>
---------------------------------------------- ここまで --------
--- config.ph に追加するもの -----------------------------------
$START_HOOK = q`
if ($Envelope{'h:content-type:'} =~
m@application/x-www-form-urlencoded@i) {
local($f, $key, $data, %form, $subj, $ct);
$Envelope{'Body'} =~ s/\s//g;
foreach $f (split(/&/, $Envelope{'Body'})) {
($key, $data) = $f =~ /(\S+)=(\S+)/;
$key =~ tr/[A-Z]/[a-z]/;
$data =~ s/[!\s]//g;
$data =~ tr/+/ /;
$data =~ s/%([a-f0-9]{2})/pack('C', hex($1))/egi;
$form{$key} = &STR2JIS($data);
}
($subj = $Envelope{'h:subject:'}) =~ s/^\s+//;
($ct = $Envelope{'h:content-type:'}) =~ s/^\s+//;
&DEFINE_FIELD_FORCED('X-Mailto-Subject', $subj);
&DEFINE_FIELD_FORCED('X-Mailto-Content-Type', $ct);
$Envelope{'h:Subject:'} = $Envelope{'h:subject:'} = $form{'subject'};
$Envelope{'h:Content-Type:'} = $Envelope{'h:content-type:'} =
"text/plain; charset=iso-2022-jp";
$form{'body'} =~ s/\s+$//;
$Envelope{'Body'} = $form{'body'} . "\n";
# Subject: fix
&FixHeaderFields(*Envelope);
# Lines: fix
$Envelope{'h:Lines:'} = $Envelope{'Body'} =~ tr/\n/\n/;
}
`;
---------------------------------------------- ここまで --------
ここで、Subject を処理するために &FixHeaderFields を呼んでいるのが
ちょっと問題になりそうですが。
あと、$HTML_TITLE_HOOK 内に
($dir2 = $dir) =~ s#htdocs/##;
$HTML_FORMAT_TRAILER =
'[<a href="../../cgi-bin/reply.cgi?'
. "$dir2/$file.html"
. '">このメールに返信</a>]'
と書いてリプライ用の引用文を作る reply.cgi も動いていますが、
本文を切り出す処理がイマイチ(どこが本文かわからないので、
<pre> で囲まれたところを取り出している)です。
●包含関係MLを作る
【fml-support:09054】
#list1 ,list2 というメーリングリストがあり、list1 への投稿は
#list2 の登録者にも配信する方法です。
#
#以下、list 1 に設定してください。
$START_HOOK = q#
push( @MEMBER_LIST, "$DIR/../list2/members" );
push( @ACTIVE_LIST, "$DIR/../list2/members" );
#;