我现在发现现在所有的信件的主题都使用base64编码.
我使用outlook发送了两封信,一个主题是纯英文(test),一个包含汉字(test一二).
在我的邮箱中察看邮件原文,发现包含中文的已经被编码了.
我想问如何使用maildrop过滤规则来过滤所有包含test的邮件呢?
或者说maildrop能否将编码的主题进行解码呢?
如何进行操作.
各位人兄你们是如何解决的?
gadfly 回复于:2003-05-07 20:41:32maildrop本身不能解码,需要利用外挂的工具来解码,然后再过滤。
addy 回复于:2003-05-08 11:09:29能否提供一个.告诉我使用什么进行解码?
谢谢了!
gadfly 回复于:2003-05-08 12:43:28好像确实没有专门对mail解码的工具
我介绍你几个工具,你自己研究看看:
mmencode工具,metamail软件包
mewencode, mew-common软件包
addy 回复于:2003-05-08 23:39:09我有一个设想,就是我将编码的邮件主题分解出来,然后传给外部程序,程序进行解码然后再传入maildrop的变量中.我只要对已经解码的邮件主题进行过滤就可以了.
我写了一个解码程序maildecode
[code:1:0197fc4045]
#!/usr/bin/perl
# Convert Base64 Or Quoted-printable TO Text
my $a = $ARGV[0] || '';
if ($a=~/^Subject/) {
$a = $ARGV[1] || '';
};
if ($a=~/^=\?[\w-]+\?B\?(.*)\?=$/) {
use MIME::Base64;
$a = decode_base64($1);
};
if ($a=~/^=\?[\w-]+\?Q\?(.*)\?=$/) {
use MIME::QuotedPrint;
$a = decode_qp($1);
};
# USE FOR Test
open(OUTFILE, ">/tmp/list.log");
print OUTFILE $a;
close(OUTFILE);
print $a;
exit(0);
[/code:1:0197fc4045]
然后更改.mailfilter 文件
[code:1:0197fc4045]
SHELL="/bin/sh"
if (/^Subject:.*/)
{
SUBJECT=$MATCH
}
if ($SUBJECT ne "")
{
NSUB='/usr/local/bin/maildecode $SUBJECT '
log "$NSUB"
if ($NSUB=~/^Subject:.*[ ]test$/)
{
to "/home/vpopmail/domains/domain_name/a1/Maildir/.1052105760/"
}
}
[/code:1:0197fc4045]
但是我发现maildrop没有执行我这个外部程序,NSUB的内容就是
'/usr/local/bin/maildecode $SUBJECT '字符串, maildecode 没有执行.
我想问为什么,那里错了? 如何更改. 此方法是否可行?
gadfly 回复于:2003-05-09 10:48:04有两个地方有问题:
首先perl脚本,subject的标题内容不是开始的
所以改成:
[code:1:fd9754dabc]
if ($a=~/=\?[\w-]+\?B\?(.*)\?=$/) {
....
if ($a=~/=\?[\w-]+\?Q\?(.*)\?=$/) {
....
[/code:1:fd9754dabc]
其次,maildrop filter中,外部文件的执行用反撇,所以,那句话改成
NSUB=`/usr/local/bin/maildecode $SUBJECT `
addy 回复于:2003-05-09 11:08:01谢谢已经成功解决了
maildecode 程序
[code:1:f486c6bb70]
#!/usr/bin/perl
# Convert Base64 Or Quoted-printable TO Text
my $a = $ARGV[0] || '';
if ($a=~/^Subject/) {
$a = $ARGV[1] || '';
};
if ($a=~/=\?[\w-]+\?B\?(.*)\?=$/) {
use MIME::Base64;
$a = decode_base64($1);
};
if ($a=~/=\?[\w-]+\?Q\?(.*)\?=$/) {
use MIME::QuotedPrint;
$a = decode_qp($1);
};
#open(OUTFILE, ">/tmp/list.log");
#print OUTFILE $a;
#close(OUTFILE);
print $a;
exit(0);
[/code:1:f486c6bb70]
在.mailfilter中加入
[code:1:f486c6bb70]
if (/^Subject:.*/)
{
SUBJECT=$MATCH
}
if ($SUBJECT ne "")
{
NSUB=`/usr/local/bin/maildecode $SUBJECT `
}
[/code:1:f486c6bb70]
以后所有的主题过滤只要对$NSUB进行过滤即可
在此感谢gadfly兄的帮助,非常感谢!!!
HonestQiao 回复于:2004-01-31 00:02:51咱现在需要这个,在这方面真的经验太少,还希望多多指点一下子,该怎么应用$NSUB呢?
全英文标题邮件,过滤test,规则如下:
包含test标题的信件全部垃圾箱
[code:1:270f2bf4ac]if(/^Subject:.*test*/ || /^Subject:.*TEST*/)
{
to "/mail/sms.org/test/Maildir/.Trash/."
}
to "/mail/sms.org/test/Maildir/."[/code:1:270f2bf4ac]
如今中文的标题包含test
[code:1:270f2bf4ac]if (/^Subject:.*/)
{
SUBJECT=$MATCH
}
if ($SUBJECT ne "")
{
NSUB=`/usr/local/bin/maildecode $SUBJECT `
}
if($NSUB=~/^.*test*/ || $NSUB=~/^.*TEST*/)
{
to "/mail/sms.org/test/Maildir/.Trash/."
}
to "/mail/sms.org/test/Maildir/."[/code:1:270f2bf4ac]
可是没有任何效果哦.
我想可能是我这里:
[code:1:270f2bf4ac]if($NSUB=~/^.*test*/ || $NSUB=~/^.*TEST*/)[/code:1:270f2bf4ac]
错误了,我在这方面的经验少,希望大伙给个正确的写法
myblessu 回复于:2004-12-13 09:39:42我正需要这知识,哪位兄弟在讲讲.
abel 回复于:2004-12-13 19:35:03這個問題完全沒考慮 charset 問題,只考慮了 MIME 或 QP 還原可能稍
嫌不足 , 所謂若 local encoding 與你的 patten 相符固然沒問題,
若人家以 UTF8 傳來,還是檔不到 ,EX:
=?UTF-8?B?5q2j5Zyo5a+E6YC....
NSUB=`/usr/local/bin/maildecode $SUBJECT `
這個 SUBJECT 若有 ' " 等,有時也會有問題
若不懂我的意思,再想想 `ls -la "a ` 可以跑嗎 ?