以下為以前的研究記錄,只是偷偷搬過來

星期四 十二月 28, 2006 5:34 pm
    文章主題: 郵件清單之功能
1. 使用者可自訂收件之寄件者清單
procmail

2. 管理者可定義全體使用者之寄件清單

procmail

3. 可過濾阻斷由內部帳號寄發的垃圾郵件

限制收件者太多

4. 防止 Relay: 防止非郵件帳號寄發的信件

smtp認證

5. 可備份特定之寄件者或收件者之往來信件
alway-bcc

6. 可以設定多個虛擬郵件伺服器於同一系統中

ubuntu 6.06.1 server + postfix + vhcs + mysql

星期四 十二月 28, 2006 5:45 pm    文章主題:

# chmod o+w /var/log/procmail.log 或者 chown vmail /var/log/procmail.log
LOGFILE=/var/log/procmail.log
LOGABSTRACT=all
VERBOSE=on

PATH=$PATH
SHELL=/bin/sh
#LANG=zh_TW.Big5
#LC_ALL=zh_TW.Big5

#USERHOME=$HOME
#USER=`echo ${USERHOME##*/}`
SUBJ=`formail -zxSubject:`
SUBJ=`formail -zxSubject: | sed -e "s/['|"|$]//g"`
CHAR=`echo ${SUBJ#?*?}`
CHAR=`echo ${CHAR%?*?}`
CHAR=`echo ${CHAR%?Q?*}`
# 將 mail是什麼編碼放到暫存檔
CHARTMP=`echo ${CHAR} > /var/log/procmail_whatcode`
#SUBJ=`formail -zxSubject: | sed 's/=?.*?[bB]?(.*)=?=/1/'`
# Need to Compile mmencode
#SUBJ=`formail -zxSubject: | sed 's/=?.*?[bB]?(.*)=?=/1/'| mmencode -u `
#SUBJ=`echo $SUBJ | mmencode -u`
SUBJ=`perl /etc/procmail_parser  $SUBJ`
# 將 mail主旨已轉碼過的放到暫存檔
SUBJTMP=`echo $SUBJ > /var/log/procmail_subj`
#DECODE=`/etc/procmail_iconv.sh`
#SUBJ=`echo $SUBJ | iconv -f big-5  -t utf-8`
#SUBJ=`echo $SUBJ | iconv -f $CHAR  -t utf-8`
# 透過此 script判斷該由什麼編碼轉成 UTF-8
SUBJ=`sh /etc/procmail_iconv.sh`
FROM=`formail -zxFrom:`
FROM=`echo ${FROM##*<}`
FROM=`echo ${FROM%%>}`
TO=`formail -zxTo:|tr ',' ' '| sed 's/(.*) (.*)/2/'`
TO=`echo ${TO##*<}`
TO=`echo ${TO%%>}`
USER=`echo ${TO%%@*}`
HOME=/home/$USER
# 此設定檔可放到/etc/procmailrc底下全部有效, 或者使用者 $HOME/.procmailrc個別受限

FGREP=/bin/grep
#DEFAULTBOX=/var/mail/$USER
BLACKLISTBOX=$HOME/blacklistbox
BLACKHOLE=/dev/null
TIME=`date +%F'.'%T'.'%N`
# chmod 777 /var/mail/quarantine
QUARANTINE=/var/mail/quarantine/
FILE=$TIME-$USER.eml
#TMP=`formail > $QUARANTINE$FILE`
DATE=`date +%F' '%T`

# MySQL
#DBHOST=lab100
#DBNAME=procmail_test
#DBUSER=procmail
#DBPASS=procmail123456

DBHOST=localhost
#DBNAME=procmaildb
#DBUSER=procmailuser
#DBPASS=procmailpassword
DBNAME=vmails
DBUSER=mysqluser
DBPASS=mysqlpassword

#DEFAULTBOX=`echo "select maildir from mailbox where username = '$TO'"| mysql -u postfix -ppostfix postfix | sed '/maildir/d'`
#DEFAULTBOX=`echo ${DEFAULTBOX%/*}`
# maildir
#DEFAULTBOX=`echo /var/mail/$DEFAULTBOX`
# mailbox
#DEFAULTBOX=`echo /var/mail/$DEFAULTBOX$USER`
#DEFAULTBOX=`echo /var/mail/virtual/vhcs.d2.ssorc.tw/cross2/`
# vhcs
# 因為 vhcs2的資料庫,並沒有信箱的資訊,只好用 vhcs2寫入的文字檔來過濾
DEFAULTBOX=`grep $TO /etc/postfix/vhcs2/mailboxes | awk '{print $2}'`
DEFAULTBOX=`echo /var/mail/virtual/$DEFAULTBOX`

# 如果.whistlist是空白的,信件會放到 blacklistbox裡
# MySQL
WHITELIST =`echo "select sender from whitelist where recipient='$TO'" | mysql -u root vmails | sed '/sender/d'> /var/log/whitelist.txt`
#WHITELIST =`echo "select sender from whitelist where recipient='$TO'" | mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME | sed '/sender/d'> /var/log/whitelist.txt`
# PGSQL
#WHITELIST =`echo "select sender from whitelist where recipient='$TO'" | psql -U $DBUSER $DBNAME | sed -e '/sender/d' -e '/^-/d' -e '/^(/d' | awk '{print $1}' > /var/log/whitelist.txt`

:0E
* ? (echo "$FROM" | $FGREP -i -f /var/log/whitelist.txt)
  ${DEFAULTBOX}
  #`formail >> ${DEFAULTBOX}`
  #${DEFAULTBOX}

# 只有沒列在 whitelist裡的信會被寫到 /var/mail/quarantine/xxx.eml (每一封信存一檔案), 並記錄到資料庫
:0E
*!? (echo "$FROM" | $FGREP -i -f /var/log/whitelist.txt)
   ${BLACKHOLE} `echo "insert into blacklistboxlist(timestamp,recipient,sender,subject,file) values ('$DATE','$TO','$FROM','$SUBJ','$FILE');" | mysql -u root $DBNAME`
`formail > $QUARANTINE$FILE`
  #`echo "insert into blacklistbox(timestamp,recipient,sender,subject,file) values ('$DATE','$TO','$FROM','$SUBJ','$FILE');" | mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME` `formail > $QUARANTINE$FILE` /dev/null
#  ${BLACKLISTBOX}
#  $HOME/blacklistbox

#   ${BLACKHOLE} `echo "insert into blacklistboxlist(timestamp,recipient,sender,subject,file) values ('$DATE','$TO','$FROM','$SUBJ','$FILE');" | psql -U $DBUSER $DBNAME` `formail > $QUARANTINE$FILE`

#–
#– 資料庫: `vmails`
#–

#– ——————————————————–

#–
#– 資料表格式: `blacklistboxlist`
#–

#CREATE TABLE `blacklistboxlist` (
#  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
#  `recipient` varchar(255) collate utf8_bin NOT NULL default '',
#  `sender` varchar(255) collate utf8_bin NOT NULL default '',
#  `subject` text collate utf8_bin NOT NULL,
#  `file` text collate utf8_bin NOT NULL
#) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

#– ——————————————————–

#–
#– 資料表格式: `whitelist`
#–

#CREATE TABLE `whitelist` (
#  `recipient` varchar(255) collate utf8_bin NOT NULL default '',
#  `sender` varchar(255) collate utf8_bin NOT NULL default ''
#) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

# 過濾寄件者
#
# 資料庫欄位sender內容
# ssorc.tw           能收 user@mail.ssorc.twuser2@mail.ssorc.twuser3@mail2.ssorc.tw寄來的信
# user@mail.ssorc.tw 只能收 user@mail.ssorc.tw寄來的信
# (空白)                能收全部寄件者寄來的信
#

星期一 一月 15, 2007 3:16 pm    文章主題:
procmailrc:

select sender from whitelist where recipient='$TO'
->
select sender from whitelist where recipient='@username' or recipient='@domain'

recipient        sender                     id      notes
xports.tw    alex@ssorc.tw    5      AAASS

此domain全部user皆能收到此sender寄來的信

星期一 一月 15, 2007 3:42 pm    文章主題:

procmailrc:

select sender from whitelist where recipient='$TO'
->
select sender from whitelist where recipient='@username' or recipient='@domain'

recipient        sender                     id      notes
xports.tw    alex@ssorc.tw    5      AAASS

此domain全部user皆能收到此sender寄來的信

解決方式
select sender from whitelist where recipient='$USER' OR recipient='$DOMAIN' OR recipient='$TO'

星期一 一月 15, 2007 3:51 pm    文章主題:
procmailrc

# first, touch /var/log/procmail.log
#              /var/log/procmail_subj
#              /var/log/procmail_whatcode
#              /var/log/whitelist.txt
# and, chown vmail /var/log/procmail.* /var/log/whitelist.txt
LOGFILE=/var/log/procmail.log
LOGABSTRACT=all
VERBOSE=on

PATH=$PATH
SHELL=/bin/sh
#LANG=zh_TW.Big5
#LC_ALL=zh_TW.Big5

#USERHOME=$HOME
#USER=`echo ${USERHOME##*/}`
SUBJ=`formail -zxSubject:`
SUBJ=`formail -zxSubject: | sed -e "s/['|"|$]//g"`
CHAR=`echo ${SUBJ#?*?}`
CHAR=`echo ${CHAR%?*?}`
CHAR=`echo ${CHAR%?Q?*}`
# 將 mail是什麼編碼放到暫存檔
CHARTMP=`echo ${CHAR} > /var/log/procmail_whatcode`
#SUBJ=`formail -zxSubject: | sed 's/=?.*?[bB]?(.*)=?=/1/'`
# Need to Compile mmencode
#SUBJ=`formail -zxSubject: | sed 's/=?.*?[bB]?(.*)=?=/1/'| mmencode -u `
#SUBJ=`echo $SUBJ | mmencode -u`
SUBJ=`perl /etc/procmail_parser  $SUBJ`
# 將 mail主旨已轉碼過的放到暫存檔
SUBJTMP=`echo $SUBJ > /var/log/procmail_subj`
#DECODE=`/etc/procmail_iconv.sh`
#SUBJ=`echo $SUBJ | iconv -f big-5  -t utf-8`
#SUBJ=`echo $SUBJ | iconv -f $CHAR  -t utf-8`
# 透過此 script判斷該由什麼編碼轉成 UTF-8
SUBJ=`sh /etc/procmail_iconv.sh`
FROM=`formail -zxFrom:`
FROM=`echo ${FROM##*<}`
FROM=`echo ${FROM%%>}`
TO=`formail -zxTo:|tr ',' ' '| sed 's/(.*) (.*)/2/'`
TO=`echo ${TO##*<}`
TO=`echo ${TO%%>}`
USER=`echo ${TO%%@*}`
DOMAIN=`echo ${TO##*@}`
HOME=/home/$USER
# 此設定檔可放到/etc/procmailrc底下全部有效, 或者使用者 $HOME/.procmailrc個別受限

FGREP=/bin/grep
#DEFAULTBOX=/var/mail/$USER
BLACKLISTBOX=$HOME/blacklistbox
BLACKHOLE=/dev/null
TIME=`date +%F'.'%T'.'%N`
# chmod 777 /var/mail/quarantine
QUARANTINE=/var/mail/quarantine/
FILE=$TIME-$USER.eml
#TMP=`formail > $QUARANTINE$FILE`
DATE=`date +%F' '%T`

# MySQL
#DBHOST=lab100
#DBNAME=procmail_test
#DBUSER=procmail
#DBPASS=procmail123456

DBHOST=localhost
#DBNAME=procmaildb
#DBUSER=procmailuser
#DBPASS=procmailpassword
DBNAME=vmails
DBUSER=mysqluser
DBPASS=mysqlpassword

#DEFAULTBOX=`echo "select maildir from mailbox where username = '$TO'"| mysql -u postfix -ppostfix postfix | sed '/maildir/d'`
#DEFAULTBOX=`echo ${DEFAULTBOX%/*}`
# maildir
#DEFAULTBOX=`echo /var/mail/$DEFAULTBOX`
# mailbox
#DEFAULTBOX=`echo /var/mail/$DEFAULTBOX$USER`
#DEFAULTBOX=`echo /var/mail/virtual/vhcs.d2.ssorc.tw/cross2/`
# vhcs
# 因為 vhcs2的資料庫,並沒有信箱的資訊,只好用 vhcs2寫入的文字檔來過濾
DEFAULTBOX=`grep $TO /etc/postfix/vhcs2/mailboxes | awk '{print $2}'`
DEFAULTBOX=`echo /var/mail/virtual/$DEFAULTBOX`

# 如果.whistlist是空白的,信件會放到 blacklistbox裡,這個變否定的了。
# MySQL
#WHITELIST =`echo "select sender from whitelist where recipient='$TO'" | mysql -u root vmails | sed '/sender/d'> /var/log/whitelist.txt`
WHITELIST =`echo "select sender from whitelist where recipient='$USER' OR recipient='$DOMAIN' OR recipient='$TO'" | mysql -u root vmails | sed '/sender/d'> /var/log/whitelist.txt`
#WHITELIST =`echo "select sender from whitelist where recipient='$TO'" | mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME | sed '/sender/d'> /var/log/whitelist.txt`
# PGSQL
#WHITELIST =`echo "select sender from whitelist where recipient='$TO'" | psql -U $DBUSER $DBNAME | sed -e '/sender/d' -e '/^-/d' -e '/^(/d' | awk '{print $1}' > /var/log/whitelist.txt`

:0E
* ? (echo "$FROM" | $FGREP -i -f /var/log/whitelist.txt)
  ${DEFAULTBOX}
  #`formail >> ${DEFAULTBOX}`
  #${DEFAULTBOX}

# 只有沒列在 whitelist裡的信會被寫到 /var/mail/quarantine/xxx.eml (每一封信存一檔案), 並記錄到資料庫
:0E
*!? (echo "$FROM" | $FGREP -i -f /var/log/whitelist.txt)
   ${BLACKHOLE} `echo "insert into blacklistboxlist(timestamp,recipient,sender,subject,file) values ('$DATE','$TO','$FROM','$SUBJ','$FILE');" | mysql -u root $DBNAME` `formail > $QUARANTINE$FILE`
  #`echo "insert into blacklistbox(timestamp,recipient,sender,subject,file) values ('$DATE','$TO','$FROM','$SUBJ','$FILE');" | mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME` `formail > $QUARANTINE$FILE` /dev/null
#  ${BLACKLISTBOX}
#  $HOME/blacklistbox

#   ${BLACKHOLE} `echo "insert into blacklistboxlist(timestamp,recipient,sender,subject,file) values ('$DATE','$TO','$FROM','$SUBJ','$FILE');" | psql -U $DBUSER $DBNAME` `formail > $QUARANTINE$FILE`

#–
#– 資料庫: `vmails`
#–

#– ——————————————————–

#–
#– 資料表格式: `blacklistboxlist`
#–

#CREATE TABLE `blacklistboxlist` (
#  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
#  `recipient` varchar(255) collate utf8_bin NOT NULL default '',
#  `sender` varchar(255) collate utf8_bin NOT NULL default '',
#  `subject` text collate utf8_bin NOT NULL,
#  `file` text collate utf8_bin NOT NULL
#) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

#– ——————————————————–

#–
#– 資料表格式: `whitelist`
#–

#CREATE TABLE `whitelist` (
#  `recipient` varchar(255) collate utf8_bin NOT NULL default '',
#  `sender` varchar(255) collate utf8_bin NOT NULL default ''
#) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

# 過濾寄件者
#
# 資料庫欄位sender內容
# ssorc.tw      能收 user@mail.ssorc.twuser2@mail.ssorctwuser3@mail2.ssorc.tw寄來的信
# user@mail.ssorc.tw   只能收 user@mail.ssorc.tw寄來的信
# (空白)      能收全部寄件者寄來的信
#

procmail_parser

#!/usr/bin/perl
    $sub=$ARGV[0];
    if ($sub=~ /=?S+?l(S)?/) {
      if ($1 =~ /[Qq]/) {
        $sub=decode_qp($sub);
      }
      elsif ($1 =~ /[Bb]/) {
        $sub=decode_base64($sub);
      }
    }
    elsif ($sub=~ /=[a-fA-F0-9][a-fA-F0-9]/) {
      $sub=decode_qp($sub);
    }
    $subject.=$sub;
print $subject;   
sub decode_qp {
        my($string) = @_;
        @buffer=split(/?/,$string);
        $string = $buffer[3] if ($buffer[3] ne "");
        $string =~ s/=([da-fA-F]{2})/pack("C", hex($1))/ge;
        $string =~ /?=(.*)/;
        $string =~ tr/_/ /;
        $buffer[4]=~s/^=//;
        $buffer[0]=~s/=$//;
        $string="$buffer[0]$string$buffer[4]";
        return($string);
}

sub decode_base64 {
        my($string) = @_;
        my($string2);
        @buffer=split(/?/,$string);
        $string = $buffer[3] if ($buffer[3] ne "");
        $string =~ s/=+$//;
        $string =~ tr|A-Za-z0-9+/| -_|;
        while($string =~ /(.{1,60})/gs) {
                my($string3) = chr(32+length($1)*3/4);
                $string2 .= unpack("u",$string3 . $1 );
        }
        $buffer[4]=~s/^=//;
        $buffer[0]=~s/=$//;
        $string2="$buffer[0]$string2$buffer[4]";
        return($string2);
}

procmail_iconv.sh

#!/bin/bash

CHAR=`cat /var/log/procmail_whatcode`
SUBJ=`cat /var/log/procmail_subj`
ERROR=`echo $SUBJ  | iconv -f $CHAR -t utf-8`
if [ `echo $?` = 0 ]; then
   echo $SUBJ | iconv -f $CHAR -t utf-8
else
   echo $SUBJ
fi

星期二 一月 16, 2007 3:57 pm    文章主題:
將 procmail架構放於192.168.1.200主機上,已 ok

星期四 一月 18, 2007 11:18 am    文章主題:
備份郵件
always_bcc設定
讓郵件 cc給 bcc帳號,並透過 procmail寫到資料庫。

問題來了,/etc/procmailrc與/home/bcc/.procmailrc同時存在的話,不會跑/home/bcc/.procmailrc的設定!!!

解決方式,修改 master.cf,讓 virual的部份特別存取定義的rc檔
procmail  unix  –       n       n       –       –       pipe flags=FR user=vmail argv=/usr/bin/procmail /etc/procmailrc_virtual

接著 cc給 local帳號 bcc的郵件就存取 /home/bcc/.procmailrc檔

備份帳號 bcc
備份目錄 /var/mail/always_bcc

/home/bcc/.procmailrc

# useradd bcc
# touch /var/log/procmail_bcc.log /var/log/procmail_bcc_subj /var/log/procmail_bcc_whatcode
# chown bcc /var/log/procmail_bcc.log /var/log/procmail_bcc_subj /var/log/procmail_bcc_whatcode
# mkdir /var/mail/always_bcc && chown bcc /var/mail/always_bcc
LOGFILE=/var/log/procmail_bcc.log
LOGABSTRACT=all
VERBOSE=on

PATH=$PATH
SHELL=/bin/sh

SUBJ=`formail -zxSubject:`
SUBJ=`formail -zxSubject: | sed -e "s/['|"|$]//g"`
CHAR=`echo ${SUBJ#?*?}`
CHAR=`echo ${CHAR%?*?}`
CHAR=`echo ${CHAR%?Q?*}`
# 將 mail是什麼編碼放到暫存檔
CHARTMP=`echo ${CHAR} > /var/log/procmail_bcc_whatcode`
# Need to Compile mmencode
SUBJ=`perl /etc/procmail_parser  $SUBJ`
# 將 mail主旨已轉碼過的放到暫存檔
SUBJTMP=`echo $SUBJ > /var/log/procmail_bcc_subj`
# 透過此 script判斷該由什麼編碼轉成 UTF-8
SUBJ=`sh /etc/procmail_bcc_iconv.sh`
FROM=`formail -zxFrom:`
FROM=`echo ${FROM##*<}`
FROM=`echo ${FROM%%>}`
TO=`formail -zxTo:|tr ',' ' '| sed 's/(.*) (.*)/2/'`
TO=`echo ${TO##*<}`
TO=`echo ${TO%%>}`
USER=`echo ${TO%%@*}`
DOMAIN=`echo ${TO##*@}`
HOME=/home/$USER

TIME=`date +%F'.'%T'.'%N`
FILE=$TIME-$USER.eml
DATE=`date +%F' '%T`

QUARANTINE=`echo /var/mail/always_bcc/`
DEFAULTBOX=`echo /var/mail/always_bcc/`

# MySQL
DBHOST=localhost
DBNAME=vmails
DBTABLE=always_bcc
DBUSER=root
DBPASS=alex1217

:0E
*
  /dev/null `echo "insert into $DBTABLE(timestamp,recipient,sender,subject,file) values ('$DATE','$TO','$FROM','$SUBJ','$FILE');" | mysql -u $DBUSER -p$DBPASS $DBNAME` `formail > $QUARANTINE$FILE`

星期四 一月 18, 2007 1:23 pm    文章主題:
設定 postfix的 always_bcc給 bcc帳號,並寫到資料庫,OK

於 192.168.1.200主機上
該複製的設定檔
/etc/procmail_bcc_iconv.sh
/etc/procmail_iconv.sh
/etc/procmail_parser
/etc/procmailrc_virtual
/home/bcc/.procmailrc

該修改的設定檔
main.cf
virtual_transport = procmail
always_bcc=bcc


master.cf
procmail  unix  –       n       n       –       –       pipe flags=FR user=vmail argv=/usr/bin/procmail /etc/procmailrc_virtual

該建立的
touch /var/log/procmail.log /var/log/procmail_subj /var/log/procmail_whatcode /var/log/whitelist.txt
chown vmail /var/log/procmail* /var/log/whitelist.txt
mkdir /var/mail/quarantine && chown vmail /var/mail/quarantine

useradd bcc
touch /var/log/procmail_bcc.log /var/log/procmail_bcc_subj /var/log/procmail_bcc_whatcode
chown bcc /var/log/procmail_bcc.log /var/log/procmail_bcc_subj /var/log/procmail_bcc_whatcode
mkdir /var/mail/always_bcc && chown bcc /var/mail/always_bcc

Related posts 相關文章

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。