Постфикс / Dovecot
Я хочу создать свой простой обычай автоответчик для Postfix, например на Python. Мне не нужна сторонняя готовая к использованию.
Я хочу, чтобы у него были некоторые пользовательские условия, такие как «автоответчик только тогда, когда« from == A »или / и« to == B »или / и« сегодня не было автоответа на это электронное письмо »и т. Д.
Я обнаружил, что мне нужно использовать content_filter или spawn в master.cf. Не milter, потому что milter срабатывает, потому что сообщение было помещено в очередь, тогда как мне нужно будет автоматически отвечать на сообщения, которые уже прошли. Наверное.
Другие варианты получше?
Как это реализовать?
Я не думаю, что есть простой (т.е. тривиальный) способ сделать это, и, скорее всего, есть несколько решений.
Я реализовал это для своей почтовой системы (в которой размещено изрядное количество ящиков и доменов) и подключился к пользовательской письменной CMS (BLISS3) следующим образом:
Добавлен в /etc/postfix/master.cf
autoresponder
unix - n n - - pipe flags=Rq
user=mailuser argv=/etc/postfix/scripts/autoresponder.php ${sender} ${recipient}
Это выполнит мой скрипт autoresponder.php, анализируя отправителя и получателя. Если хотите, вы можете написать соответствующий автоответчик на Python.
Затем я добавил следующее в / etc / postfix / transport
.autoresponder autoresponder:
Эта команда запускала автоответчик как подходящий транспорт, когда я пересылал копию электронного письма на специальный электронный адрес «user@domain.name.autoresponder». Если вы хотите сделать это в небольшом масштабе, вы, вероятно, можете просто заменить «.autoresponder» своим адресом электронной почты, если вам не нужно хранить копию входящего электронного письма.
Все, что осталось, - это сам скрипт автоответчика.
Мой PHP-скрипт выглядит следующим образом:
#! /usr/bin/php
<?php
#########################################################################################
# Davids Autoresponder for BLISS3. This has been designed to query a database to pull
# the message contents from.
#########################################################################################
# How frequently to resend messages, ie only send 1 message per person every period.
# The idea of this is to prevent mail loops.
$period='1 day';
$dbconnection="postgres://username:password@127.0.0.1/mail";
# We take the input, and strip off the ".autoresponder" part, revealing our actual address.
$from=substr($argv[2],0,-14);
$to=$argv[1];
#########################################################################################
include "/usr/share/php/adodb/adodb.inc.php";
$ADODB_FETCH_MODE=ADODB_FETCH_ASSOC;
$conn=ADONewConnection($dbconnection);
$theargs=$argv[0]." ".$argv[1]." ".$argv[2]."\n";
syslog (LOG_WARNING,"Called autoresponder - $theargs");
# Check if the email is in our database of recently sent messages. If not, add it.
# If it is, do not resend. Also do not send emails if from = to
$sent=$conn->GetAll("select count(uid) from autoresponded where mailfrom='$from' and mailto='$to' and date > current_timestamp - interval '$period'");
if ( $sent[0]['count'] < 1 and $from != $to )
{
$q=$conn->Execute("insert into autoresponded (date,mailfrom,mailto) values (current_timestamp,'$from','$to')");
$messages=$conn->GetAll("select ar_subject, ar_body from virtual where mailfrom='".$from."'");
# No point in sending if we don't have a message to send.
if ($messages[0]['ar_subject'] != '' or $messages[0]['ar_body'] != '')
{
$headers='From: '.$from."\r\n";
$subject=pg_unescape_bytea($messages[0]['ar_subject']);
$message=pg_unescape_bytea($messages[0]['ar_body']);
mail ($to, $subject, $message,$headers);
}
}
# Automatically clean up after ourself.
$cleanup=$conn->Execute("delete from autoresponded where date < current_timestamp - interval '$period'");
Как видите, я использую простую базу данных, чтобы отслеживать, когда в последний раз было отправлено электронное письмо на указанный адрес, который я проверяю, чтобы убедиться, что я не отправляю более одного ответа на отправителя в день, чтобы предотвратить зацикливание почты и другие неприятности. Фактическое электронное письмо ответчика создается простой почтовой командой (6-я последняя строка)
Если вы хотите сделать что-то очень похожее, схема для моей таблицы с автоответчиками:
Table "public.autoresponded"
Column | Type | Collation | Nullable | Default
----------+-----------------------------+-----------+----------+--------------------------------------------
uid | integer | | not null | nextval('autoresponded_uid_seq'::regclass)
date | timestamp without time zone | | | now()
mailfrom | character varying | | |
mailto | character varying | | |
Строки, относящиеся к ar_header и ar_body, извлекают соответствующий заголовок и тело автоответчика из базы данных. Вы можете создавать / изменять свои собственные таблицы для этого или жестко их кодировать.
Надеюсь, это даст вам прочную отправную точку для того, чтобы делать то, что вы хотите.