Dear all, I'm having problem setup Goldfish autoresponder for Postfix. I'm following "Virtual users and domains ..." from Falko. then I want to add Goldfish1.1 autoresponder. But the autoresponder won't sendback any email to the sender. I'm using Fedora 10. Anybody can help.......?? Here's my maillog Here's my Goldfish log
In case needed to see my autoresponder.php Code: #!/usr/bin/php -q <? /* goldfish - the PHP auto responder for postfix Copyright (C) 2007-2008 by Remo Fritzsche This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. (c) 2007-2009 Remo Fritzsche (Main application programmer) (c) 2009 Karl Herrick (Bugfix) (c) 2007-2008 Manuel Aller (Additional programming) Version 1.0-STABLE */ ini_set('display_errors', true); error_reporting( E_ALL ); ###################################### # Check PHP version # ###################################### if ( version_compare( PHP_VERSION, "5.0.0" ) == - 1 ) { echo "Error, you are currently not running PHP 5 or later. Exiting.\n"; exit; } ###################################### # Configuration # ###################################### /* General */ $conf['cycle'] = 5 * 60; /* Logging */ $conf['log_file_path'] = "/var/log/goldfish"; $conf['write_log'] = true; /* Database information */ $conf['mysql_host'] = "localhost"; $conf['mysql_user'] = "mail_admin"; $conf['mysql_password'] = "mypassword"; $conf['mysql_database'] = "mail"; /* Database Queries */ # This query has to return the path (`path`) of the corresponding # maildir-Mailbox with email-address %m $conf['q_mailbox_path'] = "SELECT CONCAT('/home/vmail/', SUBSTRING_INDEX(email,'@',-1), '/', SUBSTRING_INDEX(email,'@',1), '/') as `path` FROM users WHERE `email` = '%m'"; # This query has to return the following fields from the autoresponder table: `from`, `to`, `email`, `message` where `enabled` = 2 $conf['q_forwardings'] = "SELECT * FROM `autoresponder` WHERE `enabled` = 1"; # This query has to disable every autoresponder entry which ended in the past $conf['q_disable_forwarding'] = "UPDATE `autoresponder` SET `enabled` = 0 WHERE `to` < CURDATE();"; # This query has to activate every autoresponder entry which starts today $conf['q_enable_forwarding'] = "UPDATE `autoresponder` SET `enabled` = 1 WHERE `from` = CURDATE();"; # This query has to return the message of an autoresponder entry identified by email %m $conf['q_messages'] = "SELECT `message` FROM `autoresponder` WHERE `email` = '%m'"; # This query has to return the subject of the autoresponder entry identified by email %m $conf['q_subject'] = "SELECT `subject` FROM `autoresponder` WHERE `email` = '%m'"; ###################################### # Logger class # ###################################### class Logger { var $logfile; var $str; function addLine($str) { $str = date("Y-m-d h:i:s")." ".$str; $this->str .= "\n$str"; echo $str."\n"; } function writeLog(&$conf) { if (! $conf['write_log'] ) return; if (is_writable($conf['log_file_path'])) { $this->addLine("--------- End execution ------------"); if (!$handle = fopen($conf['log_file_path'], 'a')) { echo "Cannot open file ({$conf['log_file_path']})"; exit; } if (fwrite($handle, $this->str) === FALSE) { echo "Cannot write to file)"; exit; } else { echo "Wrote log successfully."; } fclose($handle); } else { echo "Error: The log file is not writeable.\n"; echo "The log has not been written.\n"; } } } ###################################### # Create log object # ###################################### $log = new Logger(); ###################################### # function endup() # ###################################### function endup(&$log, &$conf) { $log->writeLog($conf); exit; } ###################################### # Database connection # ###################################### $link = @mysql_connect($conf['mysql_host'], $conf['mysql_user'], $conf['mysql_password']); if (!$link) { $log->addLine("Could not connect to database. Abborting."); endup($log, $conf); } else { $log->addLine("Connection to database established successfully"); if (!mysql_select_db($conf['mysql_database'])) { $log->addLine("Could not select database ".$conf['mysql_database']); endup($log, $conf); } else { $log->addLine("Database selected successfully"); } } ###################################### # Update database entries # ###################################### $result = mysql_query($conf['q_disable_forwarding']); if (!$result) { $log->addLine("Error in query ".$conf['q_disable_forwarding']."\n".mysql_error()); } else { $log->addLine("Successfully updated database (disabled entries)"); } mysql_query($conf['q_enable_forwarding']); if (!$result) { $log->addLine("Error in query ".$conf['q_enable_forwarding']."\n".mysql_error()); } else { $log->addLine("Successfully updated database (enabled entries)"); } ###################################### # Catching dirs of autoresponders mailboxes # ###################################### // Corresponding email addresses $result = mysql_query($conf['q_forwardings']); if (!$result) { $log->addLine("Error in query ".$conf['q_forwardings']."\n".mysql_error()); exit; } $num = mysql_num_rows($result); for ($i = 0; $i < $num; $i++) { $emails[] = mysql_result($result, $i, "email"); $name[] = mysql_result($result, $i, "descname"); } // Fetching directories for ($i = 0; $i < $num; $i++) { $result = mysql_query(str_replace("%m", $emails[$i], $conf['q_mailbox_path'])); if (!$result) { $log->addLine("Error in query ".$conf['q_mailbox_path']."\n".mysql_error()); exit; } else { $log->addLine("Successfully fetched maildir directories"); } $paths[] = mysql_result($result, 0, 'path') . 'new/'; } ###################################### # Reading new mails # ###################################### if ($num > 0) { $i = 0; foreach ($paths as $path) { foreach(scandir($path) as $entry) { if ($entry != '.' && $entry != '..') { if (time() - filemtime($path . $entry) - $conf['cycle'] <= 0) { $mails[] = $path . $entry; ################################### # Send response # ################################### // Reading mail address $mail = file($path.$entry); foreach ($mail as $line) { $line = trim($line); if (substr($line, 0, 12) == 'Return-Path:') { $returnpath = substr($line, strpos($line, '<') + 1, strpos($line, '>') - strpos($line, '<')-1)."\n"; } if (substr($line, 0, 5) == 'From:' && strstr($line,"@")) { $address = substr($line, strpos($line, '<') + 1, strpos($line, '>') - strpos($line, '<')-1)."\n"; break; } elseif(substr($line,0,5) == 'From:' && !strstr($line,"@") && !empty ($returnpath)) { $address = $returnpath; break; } } // Check: Is this mail allready answered if (empty($address)) { $log->addLine("Error, could not parse mail $path"); } else { // Get data of current mail $email = $emails[$i]; // Get subject $result = mysql_query(str_replace("%m", $emails[$i], $conf['q_subject'])); if (!$result) { $log->addLine("Error in query ".$conf['q_subject']."\n".mysql_error()); exit; } else { $log->addLine("Successfully fetched subject of {$emails[$i]}"); } $subject = mysql_result($result, 0, 'subject'); // Get Message $result = mysql_query(str_replace("%m", $emails[$i], $conf['q_messages'])); if (!$result) { $log->addLine("Error in query ".$conf['q_messages']."\n".mysql_error()); exit; } else { $log->addLine("Successfully fetched message of {$emails[$i]}"); } $message = mysql_result($result, 0, 'message'); $headers = "From: ".$name[$i]."<".$emails[$i].">"; // Check if mail is allready an answer: if (strstr($mail, $message)) { $log->addLine("Mail from {$emails[$i]} allready answered"); break; } // strip the line break from $address for checks // fix by Karl Herrick, thank's a lot if ( substr($address,0,strlen($address)-1) == $email ) { $log->addLine("Email address from autoresponder table is the same as the intended recipient! Not sending the mail!"); break; } mail($address, $subject, $message, $headers); } } } } $i++; } } $log->writeLog($conf); echo "End execution."; ?>
I've made a progress. I tried using older version of Goldfish 002-p1. And the autoresponder seems to start working, but still got error. When I'm sending from "[email protected]", the Autoresponder sends back to "[email protected]" ( missing one character 'm' ). I'm not good in php , is there anything I should change in autoresponder.php?? maillog Code: Feb 8 17:05:01 mail sendmail[32747]: p18A51nP032747: from=vmail, size=118, class=0, nrcpts=1, msgid=<[email protected]>, relay=vmail@localhost Feb 8 17:05:01 mail postfix/smtpd[32726]: connect from localhost.localdomain[127.0.0.1] Feb 8 17:05:01 mail sendmail[32747]: STARTTLS=client, relay=[127.0.0.1], version=TLSv1/SSLv3, verify=FAIL, cipher=DHE-RSA-AES256-SHA, bits=256/256 Feb 8 17:05:01 mail postfix/smtpd[32726]: EC27714504: client=localhost.localdomain[127.0.0.1], [email protected] Feb 8 17:05:02 mail postfix/cleanup[32733]: EC27714504: message-id=<[email protected]> Feb 8 17:05:02 mail sendmail[32747]: p18A51nP032747: to=rom: [email protected], ctladdr=vmail (5000/5000), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30118, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as EC27714504) Feb 8 17:05:02 mail postfix/qmgr[5666]: EC27714504: from=<[email protected]>, size=556, nrcpt=1 (queue active) Feb 8 17:05:02 mail postfix/smtpd[32726]: disconnect from localhost.localdomain[127.0.0.1] Feb 8 17:05:02 mail sendmail[32746]: p18A51jV032746: from=vmail, size=1040, class=0, nrcpts=1, msgid=<[email protected]>, relay=vmail@localhost Feb 8 17:05:02 mail postfix/smtpd[32726]: connect from localhost.localdomain[127.0.0.1] Feb 8 17:05:02 mail postfix/smtp[32754]: EC27714504: to=<[email protected]>, relay=none, delay=0.16, delays=0.07/0.08/0/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=simasrb.co type=AAAA: Host not found) Feb 8 17:05:02 mail postfix/cleanup[32733]: 31E9E14507: message-id=<[email protected]> Feb 8 17:05:02 mail postfix/bounce[32755]: EC27714504: sender non-delivery notification: 31E9E14507 Feb 8 17:05:02 mail postfix/qmgr[5666]: 31E9E14507: from=<>, size=2478, nrcpt=1 (queue active) Feb 8 17:05:02 mail postfix/qmgr[5666]: EC27714504: removed Feb 8 17:05:02 mail postfix/local[32757]: 31E9E14507: to=<[email protected]>, relay=local, delay=0.06, delays=0.01/0.03/0/0.02, dsn=2.0.0, status=sent (delivered to mailbox) Feb 8 17:05:02 mail postfix/qmgr[5666]: 31E9E14507: removed Feb 8 17:05:02 mail sendmail[32746]: STARTTLS=client, relay=[127.0.0.1], version=TLSv1/SSLv3, verify=FAIL, cipher=DHE-RSA-AES256-SHA, bits=256/256 Feb 8 17:05:02 mail postfix/smtpd[32726]: 598AB14504: client=localhost.localdomain[127.0.0.1], [email protected] Feb 8 17:05:02 mail postfix/cleanup[32733]: 598AB14504: message-id=<[email protected]> Feb 8 17:05:02 mail sendmail[32746]: p18A51jV032746: to=vmail, ctladdr=vmail (5000/5000), delay=00:00:01, xdelay=00:00:00, mailer=relay, pri=31040, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 598AB14504) Feb 8 17:05:02 mail postfix/qmgr[5666]: 598AB14504: from=<[email protected]>, size=1545, nrcpt=1 (queue active) Feb 8 17:05:02 mail postfix/local[32757]: 598AB14504: to=<[email protected]>, relay=local, delay=0.07, delays=0.06/0/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox) autoresponder.php Code: #!/usr/bin/php -q <? /* goldfish - the PHP auto responder for postfix Copyright (C) 2007-2008 by Remo Fritzsche This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. (c) 2007-2008 Remo Fritzsche (Main application programmer) (c) 2007-2008 Manuel Aller (Additional programming) Version 002, patch level 1 */ ini_set('display_errors', true); error_reporting( E_ALL ); ###################################### # Check PHP version # ###################################### if ( version_compare( PHP_VERSION, "5.0.0" ) == - 1 ) { echo "Error, you are currently not running PHP 5 or later. Exiting.\n"; exit; } ###################################### # Configuration # ###################################### /* General */ $conf['cycle'] = 5 * 60; /* Logging */ $conf['log_file_path'] = "/var/log/goldfish"; $conf['write_log'] = true; /* Database information */ $conf['mysql_host'] = "localhost"; $conf['mysql_user'] = "mail_admin"; $conf['mysql_password'] = "mypassword"; $conf['mysql_database'] = "mail"; /* Database Queries */ # This query has to return the path (`path`) of the corresponding # maildir-Mailbox with email-address %m $conf['q_mailbox_path'] = "SELECT CONCAT('/home/vmail/', SUBSTRING_INDEX(email,'@',-1), '/', SUBSTRING_INDEX(email,'@',1), '/') as `path` FROM users WHERE `email` = '%m'"; # This query has to return the following fields from the autoresponder table: `from`, `to`, `email`, `message` where `enabled` = 2 $conf['q_forwardings'] = "SELECT * FROM `autoresponder` WHERE `enabled` = 1"; # This query has to disable every autoresponder entry which ended in the past $conf['q_disable_forwarding'] = "UPDATE `autoresponder` SET `enabled` = 0 WHERE `to` < CURDATE();"; # This query has to activate every autoresponder entry which starts today $conf['q_enable_forwarding'] = "UPDATE `autoresponder` SET `enabled` = 1 WHERE `from` = CURDATE();"; # This query has to return the message of an autoresponder entry identified by email %m $conf['q_messages'] = "SELECT `message` FROM `autoresponder` WHERE `email` = '%m'"; # This query has to return the subject of the autoresponder entry identified by email %m $conf['q_subject'] = "SELECT `subject` FROM `autoresponder` WHERE `email` = '%m'"; ###################################### # Logger class # ###################################### class Logger { var $logfile; var $str; function addLine($str) { $str = date("Y-m-d h:i:s")." ".$str; $this->str .= "\n$str"; echo $str."\n"; } function writeLog(&$conf) { if (! $conf['write_log'] ) return; if (is_writable($conf['log_file_path'])) { $this->addLine("--------- End execution ------------"); if (!$handle = fopen($conf['log_file_path'], 'a')) { echo "Cannot open file ({$conf['log_file_path']})"; exit; } if (fwrite($handle, $this->str) === FALSE) { echo "Cannot write to file)"; exit; } else { echo "Wrote log successfully."; } fclose($handle); } else { echo "Error: The log file is not writeable.\n"; echo "The log has not been written.\n"; } } } ###################################### # Create log object # ###################################### $log = new Logger(); ###################################### # function endup() # ###################################### function endup(&$log, &$conf) { $log->writeLog($conf); exit; } ###################################### # Database connection # ###################################### $link = @mysql_connect($conf['mysql_host'], $conf['mysql_user'], $conf['mysql_password']); if (!$link) { $log->addLine("Could not connect to database. Abborting."); endup($log, $conf); } else { $log->addLine("Connection to database established successfully"); if (!mysql_select_db($conf['mysql_database'])) { $log->addLine("Could not select database ".$conf['mysql_database']); endup($log, $conf); } else { $log->addLine("Database selected successfully"); } } ###################################### # Update database entries # ###################################### $result = mysql_query($conf['q_disable_forwarding']); if (!$result) { $log->addLine("Error in query ".$conf['q_disable_forwarding']."\n".mysql_error()); } else { $log->addLine("Successfully updated database (disabled entries)"); } mysql_query($conf['q_enable_forwarding']); if (!$result) { $log->addLine("Error in query ".$conf['q_enable_forwarding']."\n".mysql_error()); } else { $log->addLine("Successfully updated database (enabled entries)"); } ###################################### # Catching dirs of autoresponders mailboxes # ###################################### // Corresponding email addresses $result = mysql_query($conf['q_forwardings']); if (!$result) { $log->addLine("Error in query ".$conf['q_forwardings']."\n".mysql_error()); exit; } $num = mysql_num_rows($result); for ($i = 0; $i < $num; $i++) { $emails[] = mysql_result($result, $i, "email"); $name[] = mysql_result($result, $i, "descname"); } // Fetching directories for ($i = 0; $i < $num; $i++) { $result = mysql_query(str_replace("%m", $emails[$i], $conf['q_mailbox_path'])); if (!$result) { $log->addLine("Error in query ".$conf['q_mailbox_path']."\n".mysql_error()); exit; } else { $log->addLine("Successfully fetched maildir directories"); } $paths[] = mysql_result($result, 0, 'path') . 'new/'; } ###################################### # Reading new mails # ###################################### if ($num > 0) { $i = 0; foreach ($paths as $path) { foreach(scandir($path) as $entry) { if ($entry != '.' && $entry != '..') { if (time() - filemtime($path . $entry) - $conf['cycle'] <= 0) { $mails[] = $path . $entry; ################################### # Send response # ################################### // Reading mail address $mail = file($path.$entry); foreach ($mail as $line) { $line = trim($line); if (substr($line, 0, 5) == 'From:') { $address = substr($line, strpos($line, '<') + 1, strpos($line, '>') - strpos($line, '<')-1)."\n"; break; } } // Check: Is this mail allready answered if (empty($address)) { $log->addLine("Error, could not parse mail $path"); } else { // Get data of current mail $email = $emails[$i]; // Get subject $result = mysql_query(str_replace("%m", $emails[$i], $conf['q_subject'])); if (!$result) { $log->addLine("Error in query ".$conf['q_subject']."\n".mysql_error()); exit; } else { $log->addLine("Successfully fetched subject of {$emails[$i]}"); } $subject = mysql_result($result, 0, 'subject'); // Get Message $result = mysql_query(str_replace("%m", $emails[$i], $conf['q_messages'])); if (!$result) { $log->addLine("Error in query ".$conf['q_messages']."\n".mysql_error()); exit; } else { $log->addLine("Successfully fetched message of {$emails[$i]}"); } $message = mysql_result($result, 0, 'message'); $headers = "From: ".$name[$i]."<".$emails[$i].">"; // Check if mail is allready an answer: if (strstr($mail, $message)) { $log->addLine("Mail from {$emails[$i]} allready answered"); break; } mail($address, $subject, $message, $headers); } } } } $i++; } } $log->writeLog($conf); echo "End execution."; ?>