2012-11-30 76 views
0

我有一個.forward.postix,它將傳入的電子郵件管道傳遞給一個shell帳戶,並因此分配給一個解析電子郵件的PHP腳本 - 太棒了。到目前爲止,基於我在網上看到的所有內容,我正在使用explode('From: ', $email);方法將所有內容拆分爲數據庫所需的變量。在php中解析電子郵件附件

輸入附件!使用相同的方法,我正在這樣做拉出一個JPG附件 - 但似乎並不是每個電子郵件客戶端都以相同的方式格式化原始數據源,並且這會造成一些麻煩!

$contentType1 = explode('Content-type: image/jpg;', $email); //start ContentType 
$contentType2 = explode("--Boundary_", $contentType1[1]); //end ContentType 

$jpg1 = explode("\n\n", $contentType2[0]); //double return starts base64 blob 
$jpg2 = explode("\n\n", $jpg1[1]); //double return marks end of base64 blob 

$image = base64_decode($jpg2[0]); //decode base64 blob into jpg raw 

這裏是我的問題: 並不是所有的郵件客戶端 - 例如Gmail例如 - 列表中的附件爲'Content-type: image/jpg'。 GMail提供'Content-Type: IMAGE/JPEG',有時將它作爲'Content-Type: image/jpeg'發送!哪些不符合我的爆炸...

我的問題:有人知道更好的方式找到base64 blob的邊界嗎?或者可能不區分大小寫的方式爆炸'Content-Type:',以便我可以嘗試反對image/jpgimage-jpeg以查看匹配結果?

+0

附加說明:我建議您使用正則表達式來匹配您的頭部語句,而不是爆炸。 – h2ooooooo

+0

您是否嘗試過使用PHP內建IMAP功能?我已經在過去成功實施了一個解決方案 –

回答

1

您可以嘗試使用preg_split()分割字符串。也許像這樣

$pattern = '#content-type: image/jpe?g#i'; 
$split_array = preg_split($pattern, $email); 
+0

請參閱我知道有一種方法可以寫出一種模式來解決我所有的問題 - 但這些模式對我來說毫無意義,我無法爲我的生活找到一個「字典」什麼是什麼。我在猜測'e?'使得e是可選的,最後'i'使它不區分大小寫?謝謝你,朋友! –

+0

@JoelHackney是的'?'表示可以有0或1或前面的模式組件。模式修飾符「i」使得匹配大小寫不敏感。 –

+0

@JoelHackney請注意我的修改答案。我剛剛注意到我搜索了'image.jpe?g'(如文件名),而不是'image/jpe?g'(內容類型) –