2012-04-02 8 views
10

私はチケットをメールで送信し、特定のメールIDに任意の種類のファイルを添付できるサイトを開発しています。メールの件名、内容、添付ファイルをデータベースに追加する必要があります。私はcronを使ってこれをやっています。添付ファイルを除いて、すべてのものが完璧に動作します。私はダウンロードリンクを作成するポストを見ました。私はcronを使用しているので、手動ではできません。IMAPと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 
}} 

は、私は、ファイルの種類と名前を取得することができていますが、私を助けてください、さらに

いずれかを続行する方法がわかりません。ありがとうございました...

答えて

6

添付ファイルをファイルとして保存するには、メッセージの構造を解析して、添付ファイルであるすべての部分を取り出します(コンテンツの配置)。あなたは簡単にアクセスがあり、時間をかけてより簡単にエラーを処理できるように、電子メールの解析が壊れやすいことができ、自分自身のクラスにそれをラップする必要があります

$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); 
     } 
    } 
} 

これらのクラスのコードは、多かれ少なかれimap_...をラップしていますしかし、添付ファイルクラスでは構造体の解析も行っています。 You find the code on github。これが参考になることを願っています。場合

+0

ありがとうございました...&+ 1.Now workingその – Juice

+0

こんにちは@LimiJerin、ここに作業コードを掲載するのはとても親切ですか?私の最後からは動作しないようだが、添付ファイルはダウンロードされていない –

5

PHP + Cronを使用していて、標準のメールサーバーが機能するかもしれませんが、すべてのエッジケースやエラー報告などを処理するために必要な作業量は時間がかかりません。私はそれを使用していませんが、Postmark InboundはPHP imap apiを介して電子メールを処理する頭痛の大部分を除去する信じられないほどの(有料)サービスのようです。

PHPですべてを処理する場合は、this resourceをチェックしてください。

+0

レポートの削除サービスの統合とエラーに対する負担を過小評価しないでください。特にエッジケース。 – hakre

+0

True - 両側の重量を正確に測定する必要があります。電子メール処理がプロジェクトの中核でない場合は、独自に作成するのが最適かもしれませんが、インバウンド電子メール処理のアウトソーシングを簡素化することを検討している場合は、そのロジックが適している可能性があります。 – iloveitaly

0

あなたはジップ

$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として添付ファイルをダウンロードしたい場合。これが参考になることを願っています。

関連する問題