精華區 > 酷!學園 精華區

MySPAM, 我的廣告信管理程式

<< < (32/33) > >>

ony:
@ Gateway架構還真難搞啊~
  目前困難是,已經有將save.php改成re_send.php,以利轉給第二台收信主機,但‥目前MAIL會在Gateway那台無限迴圈,所以我只好引入phpmailer來幫忙看能不能用第二台的SMTP來寄信,看會不會就可以將信寄走不會鬼打牆~

但‥phpmailer的程式碼是要加在哪裡才會生效啊~有沒有也是Gateway架構的大大,拜託請給小弟一點意見~感恩~

twu2:
gateway 為什麼把 save.php 改成 re_send.php? 這是要做什麼?
跑到 save.php 不就是被認定是 spam 而要存到資料庫了嗎?

原則上... myspam 是要依靠 maildrop 或 procmail 的程式來運作, 而這類的程式是最後儲存信件會去跑的程式, 所以要在實際儲存信件的那台機器上跑.
會變成 gateway 的方式, 通常是實際 mail 存放的機器不是 unix link 的系統, 也許是不行跑 maildrop/procmail....

所以, 你必須先不考慮 myspam... 先考慮如何在你的 gateway 上頭跑 maildrop/procmail 而可以把信往實際上的機器去送吧.

我想到的作法是:
1. 把 save.php 存成一個 send_to_mailserver.php 的檔案, 然後把內容改成這樣子:

--- 代碼: ---<?php

if (!defined(&#39;IN_MYSPAM&#39;)) {
    global $spam_url;
    header(&#39;Location: &#39;.$spam_url);
    exit;
}

function writelog($str)
{
    global $test_mode, $debug;

    if ($test_mode) {
        echo $str."\n";
        $fp = fopen(&#39;/tmp/debug.log&#39;, &#39;at&#39;);
        if ($fp) {
            fputs($fp, $str."\n");
            fclose($fp);
        }
    }
    else
        syslog($debug ? LOG_DEBUG : LOG_INFO, $str);
    return;
}

function SendToMailServer()
{
    global $debug, $test_mode, $test_user;

    if (!isset($_SERVER[&#39;LOGNAME&#39;])) {
        if (!$test_mode) {
            writelog(&#39;no LOGNAME!&#39;);
            return 1;
        }
        $user = $tesr_user;
    }
    else {
        if ($test_mode)
            $user = $test_user;
        else
            $user = $_SERVER[&#39;LOGNAME&#39;];
    }

    if ($debug) writelog("try to send mail for $user");

    $fname = &#39;php://stdin&#39;;
    $fp = fopen($fname, &#39;rb&#39;);
    if ($fp == 0) {
        writelog("Can&#39;t open $fname");
        return 1;
    }

    $content = &#39;&#39;;
    while (feof($fp) == 0) {
        $buf = fgets($fp, 4096);
        $content .= $buf;
    }
    fclose($fp);

    if (send_mail($user, $content)) {
        writelog("send mail for $user");
        return 0;
    }
    writelog("failed to send mail for $user");
    return 1;
}

?>

--- 程式碼結尾 ---

這樣子這個 send_to_mailserver.php 就會去做寄信的動作. 而 myspam 中的 smtp 伺服器是可以指定的, 只要把它指到你實際上的 email server (如果不是, 就會 loop 了), 只要執行到這兒就應該可以把信寄到實際的伺服器上頭了.

2. 然後再改 index.php, 在


--- 代碼: ---if ($argc == 2 && $argv[1] == 'save_spam') {
    require_once('save.php');
    $rc = SaveSPAM();
    closelog();
    $ret = ($rc == 0) ? 0 : EX_TEMPFAIL;
    exit($ret);
}

--- 程式碼結尾 ---
的後頭再加上

--- 代碼: ---if ($argc == 2 && $argv[1] == 'send_mail') {
    require_once('send_to_mailserver.php');
    $rc = SendToMailServer();
    closelog();
    $ret = ($rc == 0) ? 0 : EX_TEMPFAIL;
    exit($ret);
}

--- 程式碼結尾 ---

這樣子, 只要去執行 send_mail 參數時, 就會直接去寄信.

3. 這時, 只要改一下 procmailrc 的設定, 原本可能是

--- 代碼: ---#LOGFILE=/var/log/procmail.log
MAILDIR=/var/mail
:0
* ^X-Spam-Status: Yes
{
    :0
    * ! ^X-MySPAM: YES
    |/usr/bin/php -Cq /var/www/html/myspam/web/index.php save_spam
}

--- 程式碼結尾 ---

改成

--- 代碼: ---MAILDIR=/var/mail
:0
* ^X-Spam-Status: Yes
{
    :0
    * ! ^X-MySPAM: YES
    |/usr/bin/php -Cq /var/www/html/myspam/web/index.php save_spam
}
:0
* > 0
|/usr/bin/php -Cq /var/www/html/myspam/web/index.php send_mail

--- 程式碼結尾 ---
這樣子應該就可以把所有原本要存的信寄到實際的伺服器了.

PS. 沒實際試過, 不保證上頭的 code 是正常可以執行的.

ony:
@ twu2 大,看到您的回覆,比冬天泡溫泉還甘溫啊~
   您判斷的沒錯,我公司因為主機較老舊,效能及安全的關係,作成 2台LINUX。一台Gateway,另一台才是對內的存放信箱及寄信的~
   而廣告信、病毒都是Gateway在判斷,自然MySPAM也要放這~
   而為什麼後來我求救說要裝PHPMailer上去,就是因為不知smtp要去哪指定,所以只好‥但是~還是搞不定~
   您的方法看來才是最精簡的,而且‥行了!!!!!!

   不過procmailrc裏我還要改一下,目前在MySPAM裏設好自訂規則白名單的信會不見~我再來搞一下,感恩啊~在這向您扣拜~
   

Squawell:
小弟有幾個問題想跟大家請教一下:
小弟安裝的是iredmail這個整合性的MAIL系統.....目前的狀況是MYSPAM的網頁顯示OK..測試是否有寫入資料庫也正常(/usr/bin/php -Cq index.php test_save_spam)..所以小弟寄了一個測試信去某帳號.但是登入該帳號卻沒發現任何信件.但是在WEBMAIL上面卻有收到標是有SPAM字樣的信件.不知道是哪邊設定有誤?想請大家幫忙謝謝.
以下是小弟有做修改的地方:

1./etc/postfix/main.cf

--- 代碼: ---mailbox_command = /usr/bin/procmail

--- 程式碼結尾 ---
2./etc/procmailrc

--- 代碼: ---:0
* ^X-Spam-Status: Yes
{
:0:
* ! ^X-MySPAM: YES
|/usr/bin/php -Cq /var/www/html/myspam/index.php save_spam
}
:0b
* ^X-MySPAM: YES
$DEFAULT

--- 程式碼結尾 ---
在IREDMAIL上面有多一個設定如下:

--- 代碼: ---# Set Maildir path.
MAILBOX="$HOME/$DOMAIN/$USER/"
DEFAULT="$MAILBOX"
JUNK="${MAILBOX}/.Junk/"

--- 程式碼結尾 ---

twu2:
把 procmail 的 log 打開來, 看看有沒有真的跑到 myspam 那個 php 吧.

導覽

[0] 文章列表

[#] 下頁

[*] 上頁

前往完整版本