Uso de Procmail para llamar a un script de PHP
Pregunta
Estoy intentando hacer un reenvío de correo electrónico personalizado. #1 Estoy en un servidor compartido, que está usando Qmail, y opcionalmente PROCMAIL.
Lo que estoy tratando de lograr es un reenvío de correo electrónico personalizado de una dirección, basado en un horario. Por ejemplo, tengo un horario de empleados que trabajan cada día de la semana, y tengo un script PHP que selecciona la dirección de correo electrónico de un empleado aleatorio que funciona hoy.
Así que estoy tratando de llamar a ese script en Procmail y generar el resultado (que es una sola dirección de correo electrónico) en la línea de reenvío:
Ejemplo:
#Something
LOGFILE=/usr/home/myname/procmail-log
VERBOSE=yes
EXITCODE=99
MAILDIR=/usr/boxes/myname
DEFAULT=/usr/boxes/myname/mybox
SHELL=/bin/sh
MYVAR=$(php -q /usr/home/myname/testemail/emailtester.php)
:0
! $MYVAR
Esto no está funcionando. En absoluto. También lo he intentado:
MYVAR=`php /usr/home/myname/testemail/emailtester.php`
así como simplemente meterlo en la línea de reinicio:
:0
! |php /usr/home/myname/testemail/emailtester.php
Estoy completamente fuera de mi elemento aquí ... Traté de ni siquiera usar Procmail, y simplemente tuve todo el correo electrónico a un script PHP, desde Qmail. Necesito que los encabezados permanezcan intactos, como un delantero normal, y eso resultó ser difícil con PHP, y un poco más allá de mi alcance. (Logré crear un bucle de correo electrónico infinito), así que prefiero no intentarlo nuevamente.
Podría intentar escribir esto en Perl, que nunca he usado, pero necesito que el horario sea administrable desde una interfaz web, o al menos de manera fácil de usar.
Cualquier ayuda o sugerencia sería apreciada en este punto, gracias
EDITAR:
Bueno, ya que no puedo poner el código en un comentario, solo editaré aquí.
Ahora obteniendo esto en mi registro:
Folder: /usr/local/bin/php /usr/home/idnani/testemail/emailtester.ph 1679
"rocmail: Executing "/usr/local/bin/php,/usr/home/idnani/testemail/emailtester.php
Could not open input file: /usr/home/idnani/testemail/emailtester.php
Cuando uso con: 0fw obtengo:
"rocmail: Executing "/usr/local/bin/php,/usr/home/idnani/testemail/emailtester.php
Could not open input file: /usr/home/idnani/testemail/emailtester.php
procmail: [69907] Thu Jun 16 14:04:17 2011
procmail: Program failure (1) of "/usr/local/bin/php"
procmail: Rescue of unfiltered data succeeded
EDITAR: ¡Averigido!
Encontró la forma correcta después de mucha prueba y error.
¡Ni siquiera uses la tubería en todo, y necesitas el! Símbolo delantero:
Regla final:
:0
! `/usr/local/bin/php -f $HOME/emailtest/emailtester.php`
Tan simple ... Estoy un poco enojado, me tomó horas resolver esto, ¡gracias a todos por ayudarme a señalarme en la dirección correcta!
Solución 3
Encontró la forma correcta después de mucha prueba y error.
¡Ni siquiera uses la tubería en todo, y necesitas el! Símbolo delantero:
Todo lo que hace esta regla es pedirle al script PHP un solo correo electrónico y luego reenviar ese correo electrónico. Regla final:
:0
! `/usr/local/bin/php -f $HOME/emailtest/emailtester.php`
Tan simple ... Estoy un poco enojado, me tomó horas resolver esto, ¡gracias a todos por ayudarme a señalarme en la dirección correcta!
La respuesta de Michael parece que debería funcionar, ¿y tal vez lo hace en una circunstancia diferente? No pude hacerlo, por eso estoy respondiendo esto yo mismo ...
Nueva edición:
Nota: aún puede recuperar todo el correo electrónico en PHP a través de Stdin
Nota: puede poner/usr/local/bin/php en su script en sí mismo en la primera línea:
#!/usr/local/bin/php
Otros consejos
Estabas tan cerca ... necesitas tu siembras sin que la !
delantero:
:0
|/usr/bin/php /usr/home/myname/testemail/emailtester.php
EDITAR Pongo el camino completo a PHP, en caso de que Procmail $PATH
está incompleto. Cámbielo a cualquiera que sea su ruta PHP real.
Para evitar bucles de correo electrónico, he hecho cosas como esta:
PATH=/usr/local/bin:/bin:/usr/bin
MAILDIR=$HOME/Mail
DEFAULT=$HOME/Mail/inbox
LOGFILE=$HOME/procmail.`date +%Y-%m`.log
SHELL=/usr/bin/ksh
MY_XLOOP='X-Loop: emailtester.php'
:0
* ! ^$MY_XLOOP
{
# add a header
# 'f' = filter: continue processing results of program
# 'w' = wait for program to return
# 'h' = pass message headers to program
:0fwh
| formail -A "$MY_XLOOP"
# then forward the message
# 'c' = send a copy to recipient and continue processing
:0c
| php /usr/home/myname/testemail/emailtester.php
}
# if we get here, then the message has an X-Loop header.
# let it fall into $DEFAULT