web-dev-qa-db-fra.com

Exécuter un script à la réception de l'e-mail

J'exécute un serveur de messagerie postfix/dovecot pour une utilisation personnelle. Il n'y a qu'une poignée de boîtes aux lettres réelles, essentiellement juste [email protected] et [email protected].

J'utilise fréquemment le fichier virtual pour créer des boîtes aux lettres virtuelles transmises à [email protected]. J'ai un certain nombre de ceux-ci pour des comptes jetables tels que des achats ponctuels dans des magasins en ligne, des jeux en ligne, je souhaite essayer sans vous soucier du spam en cours, etc. Pour le faire, je suis SSH et exécutez les commandes suivantes:

Sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected]      [email protected]
Sudo postmap virtual
Sudo service postfix restart

Je fais cela avec suffisamment de fréquence que j'aimerais automatiser le processus dans une certaine mesure. J'ai envisagé simplement d'écrire un script shell qui a pris la boîte aux lettres virtuelle et la vraie boîte aux lettres en tant qu'arguments et a rendu les changements lui-même, mais j'espère que quelque chose de pair encore plus.

J'aimerais pouvoir envoyer un email de [email protected] Pour une autre boîte aux lettres sur le serveur avec le nom de la boîte aux lettres virtuelle en tant que corps du message. Le problème serait l'appel Sudo appels, mais je peux créer un nouvel utilisateur dont la responsabilité exclusive est de gérer cela qui devrait gérer cela.

La plupart de la question est la suivante: comment créerais-je un événement qui serait déclenché par un email? Y a-t-il un service quelque part qui fait cela? Puis-je configurer Postfix ou Dovecot pour écouter cet e-mail et exécuter des commandes sur cet événement?

8
Adam Smith

La procédure correcte pour exécuter un script (j'utilise un script shell) à la réception d'un message de messagerie est la suivante. Il implique la modification du fichier de configuration postfix, Master.cf (qui, dans mon debian, se trouve dans / etc/postfix) en ajoutant la ligne suivante:

 my_Shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/Shell/script ${sender} ${size} ${recipient}

qui indique postfix Pour exécuter le script (vous devez le rendre exécutable) lorsque certains événements se produisent.

Pour spécifier quand exécuter le script, vous le faites comme suit: Supposons que vous souhaitiez qu'il soit exécuté lorsque nom d'[email protected] reçoit un message. Placez la ligne suivante

 [email protected] FILTER my_Shell_script:dummy

à l'intérieur du fichier / etc/postfix/adresse.txt; Vous devrez créer une base de données appropriée pour postfix pour utiliser ce fichier, que vous accomplissez au moyen de

  postmap /etc/postfix/address.txt

qui produit comme sortie un fichier appelé / etc/postfix/adresse.db. Retournez maintenant au fichier / etc/postfix/main.cf fichier et ajoutez la ligne suivante:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

Maintenant redémarrez postfix,

  postfix reload

et vous devriez être prêt à partir.

8
MariusMatutiae

Je vois deux solutions évidentes.

Si vous utilisez PROCMAIL comme MDA sur votre serveur ou êtes prêt à convertir pour l'utiliser, vous pouvez exécuter n'importe quel script arbitraire sur n'importe quel e-mail arbitraire. à travers Procmail's | (pipe) action de recette. J'espère ne pas être démarré en tant que root, mais il devrait être facile de créer un script qui effectue la magie requise et qui peut être invoquée sans mot de passe en tant que racine par un utilisateur pertinent. La sortie du script pourrait même être renvoyée dans la même chose Email et le courrier électronique ultérieurement livré en faisant la recette une action de filtre.

Une alternative (qui devrait exiger moins pratique sur l'entretien) est à créer une boîte aux lettres et à configurer Postfix de $recipient_delimiter être quelque chose qui n'est pas normalement utilisé à cette fin; par exemple, . ou -. Notez que recipient_delimeter est un paramètre de serveur à l'échelle. Disons que vous configurez la boîte aux lettres [email protected] Et mettre $recipient_delimeter = .. Cela permettra ensuite dummy.<anything>@example.com qui livrera à la boîte aux lettres locale correspondant à [email protected]. Pour désactiver l'un d'entre eux, ajoutez dummy.<whatever>@example.com à une table de destinataires appropriée avec une action de rejet. L'inconvénient est que ce sera une boîte aux lettres pratiquée pour le préfixe, vous souhaitez donc rendre le préfixe difficile à trébucher par accident ou par des attaques de dictionnaire. La hausse est que dans le cas normal (l'expéditeur respecte vos souhaits et ne revoit pas votre adresse e-mail) Cette approche nécessite une maintenance zéro, et vous pouvez toujours modifier votre préfixe plus tard et énumérer explicitement ces combinaisons que vous souhaitez continuer à recevoir de la messagerie. .

4
a CVn