2012-04-02 1 views
10

Ich entwickle eine Website, in der Benutzer Tickets senden und jede Art von Dateien an eine bestimmte Mail-ID anhängen können. Ich muss den Post Betreff, Inhalt und Anhang der Datenbank hinzufügen. Ich mache das mit Cron. Außer den Anhängen funktioniert alles perfekt. Ich habe einen Beitrag gesehen, der Download-Links erstellt. Da ich Cron verwende, kann ich es nicht manuell tun.Anleitung zum Herunterladen von E-Mails Anhang zu einem bestimmten Ordner mit IMAP und PHP

 $hostname = '{xxxx.net:143/novalidate-cert}INBOX'; 
     $username = '[email protected]'; 
     $password = 'zzzz'; 
     /* try to connect */ 
     $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to : ' . imap_last_error()); 
     $emails = imap_search($inbox,'ALL'); 

       if($emails) { 
      $output = ''; 
      rsort($emails); 
      foreach($emails as $email_number) { 
      $structure = imap_fetchstructure($inbox, $email_number); 
      $name = $structure->parts[1]->dparameters[0]->value; // name of the file 
      $type = $structure->parts[1]->type; //type of the file 
}} 

Ich bin in der Lage Art und Namen der Dateien zu erhalten, aber nicht wissen, wie weiter verfahren sind

irgendein mir bitte helfen. Danke ...

Antwort

6

Um Anhänge als Dateien zu speichern, müssen Sie die Struktur der Nachricht analysieren und alle Teile, die Anhänge sind, selbst entfernen (Inhaltsdisposition).

$savedir = __DIR__ . '/imap-dump/'; 

$inbox = new IMAPMailbox($hostname, $username, $password); 
$emails = $inbox->search('ALL'); 
if ($emails) { 
    rsort($emails); 
    foreach ($emails as $email) { 
     foreach ($email->getAttachments() as $attachment) { 
      $savepath = $savedir . $attachment->getFilename(); 
      file_put_contents($savepath, $attachment); 
     } 
    } 
} 

Der Code dieser Klassen ist mehr oder weniger das Einwickeln der imap_...: Sie sollten, dass in Klassen ihrer eigenen wickeln, so dass Sie einen einfachen Zugang haben, und Sie können Fehler leichter im Laufe der Zeit, E-Mail-Analyse kann zerbrechlich sein Griff Funktionen, aber für die Anhangsklassen, macht es auch das Parsen der Strukturen. You find the code on github. Ich hoffe, das ist hilfreich.

+0

vielen Dank ... & + 1. Jetzt funktioniert es – Juice

+0

Hallo @LimiJerin, Würden Sie so freundlich sein, hier die Arbeitscodes zu posten? es scheint nicht von meinem Ende zu funktionieren, es wird kein Anhang heruntergeladen –

5

Obwohl die Verwendung von PHP + Cron und eines Standard-Mail-Servers funktionieren könnte, ist der Arbeitsaufwand für die Bearbeitung aller Randfälle, Fehlerberichte usw. möglicherweise nicht die Zeit wert. Obwohl ich es nicht verwendet habe, scheint Postmark Inbound wie ein unglaublicher (bezahlter) Dienst zu sein, der die meisten Kopfschmerzen der Verarbeitung von E-Mails über die PHP imap API beseitigt.

Wenn Sie versuchen möchten, alles über PHP zu behandeln, möchten Sie vielleicht this resource überprüfen.

+0

Unterschätzen Sie nie die Last zu integrieren und Fehlerbericht remove-Dienste. Vor allem die Randfälle. – hakre

+0

Stimmt - beide Seiten müssen unbedingt gewogen werden. Wenn E-Mail-Verarbeitung nicht im Mittelpunkt Ihres Projekts steht, ist es vielleicht am besten, Ihre eigenen zu schreiben. Wenn Sie jedoch die Verarbeitung von eingehenden E-Mails vereinfachen möchten, ist diese Logik möglicherweise eine gute Wahl. – iloveitaly

0

Im Fall, wenn Sie Anhänge als zip

$zip = new ZipArchive(); 
$tmp_file = tempnam('.', ''); 
$zip->open($tmp_file, ZipArchive::CREATE); 

$mailbox = $connection->getMailbox('INBOX'); 
foreach ($mailbox->getMessage() as $message) { 
    $attachments = $message->getAttachments(); 
    foreach ($attachments as $attachment) { 
     $zip->addFromString($attachment->getFilename(), $attachment->getDecodedContent()); 
    } 
} 

$zip->close(); 

# send the file to the browser as a download 
header('Content-disposition: attachment; filename=download.zip'); 
header('Content-type: application/zip'); 
readfile($tmp_file); 

This code uses library hosted on GitHub zum Download bereit. Ich hoffe, das ist hilfreich.