Estrai gli allegati durante il piping della posta a PHP
Domanda
So che con il mio hosting cPanel posso reindirizzare una casella di posta elettronica a uno script, ma quello che voglio fare è:
- Invia a hi@hi.com
- Pipe to mail.php
- mail.php legge l'oggetto e un allegato .txt
- Il contenuto dell'oggetto e l'allegato .txt sono archiviati nel database
C'è un modo per farlo con PHP diretto?
Soluzione
Probabilmente dovrai fare quanto segue:
-
Scrivi uno script PHP eseguibile nella CLI (aggiungendo una dichiarazione #! nella parte superiore dello script che punta al binario PHP, quindi imposta le sue autorizzazioni eseguibili).
-
Ottieni quello script per leggere l'e-mail non elaborata da php: // stdin (file_get_contents è il più semplice)
-
Ottieni quello script per decodificare la posta in parti, usando qualcosa come PEAR :: Mail :: Mime :: Decode o penso che ci sia un utile componente Zend Framework).
-
Leggi l'allegato e l'oggetto dal messaggio decodificato e memorizza normalmente
-
exit (0) alla fine per dire alla CLI che si trattava di un'uscita pulita - qualsiasi altro stato exit () potrebbe causare un'e-mail rimbalzata.
Altri suggerimenti
Esiste una libreria PHP, chiamata php-mime-mail -parser
che a sua volta dipende dalla libreria PECL mailparse . Una volta installati, il codice per ottenere ciò che desideri è abbastanza semplice:
<?php
require_once 'MimeMailParser.class.php';
$parser = new MimeMailParser();
$parser->setStream(STDIN);
$subject = $parser->getHeader('subject');
$attachment_content = false;
foreach ($parser->getAttachments() as $attachment) {
$extension = pathinfo($attachment->filename, PATHINFO_EXTENSION);
if ($extension == "txt") {
$attachment_content = $attachment->content;
break;
}
}
// adapt to what ever database you are using
$sth = $mysqli->prepare("INSERT INTO mails (subject, attachment) VALUES (:subject, :attachment)");
$sth->bindParam(':subject', $subject, PDO::PARAM_STR);
$sth->bindParam(':attachment', $attachment_content, PDO::PARAM_STR);
$sth->execute();
Puoi reindirizzare la posta nello script, come si legge da STDIN
. Puoi anche leggere da un file modificando setStream
in setPath
. Consulta la la documentazione della biblioteca .