FC2ブログ

PHP POPで画像添付ファイル付きのメール受信

以前にIMAPを使ってメール受信する方法をブログに載せましたが、
画像添付に対応していなかったので、画像添付がある場合どうしたらいいのかを調べてみた。

するとほとんどがSTDIN(標準入力)に関する物ばかりヒットした。
これだと共用レンタルサーバーなどに設置できないのでPOPが良かったのだが、あまりヒットしないのとライブラリーがあったとしてもどこか抜けがあったりとしたので、あーもう作ろうって思った矢先に、良いコードを発見したので、それを少し改良したので載せておきます。
参照元はhttp://tatsuya.info/pukiwiki/(TATSUYAさん)です。
ありがとうございました。


/**********************************************************
*
* このプログラムはTATSUYAさんのホームページに載っております
* コードを元に作成しております。TATSUYAさんありがとうございました。
* http://tatsuya.info/pukiwiki/
*
*/

/*********************
* サーバー設定
*/
$path = "/home/hoge/www/"; //画像の保存先
$pop3user = "fugauser"; //pop3ユーザー
$pop3pass = "hogepw"; //パスワード
$pop3server = "pop.hoge.com"; //pop3サーバー

/*********************
* 動作設定
*/
$chare_print = "UTF-8"; //画面表示の文字コード
$mail_dell = "0"; //受信したメールをサーバーから削除するか 「0」しない、「1」する

// 接続開始
$sock = fsockopen($pop3server,110, $err, $errno, 10) or die("メールサーバーに接続できません");
$buf = fgets($sock, 512);

if(substr($buf, 0, 3) != '+OK') die($buf);

$buf = _sendcmd("USER $pop3user");
$buf = _sendcmd("PASS $pop3pass");
$data = _sendcmd("STAT");
sscanf($data, '+OK %d %d', $num, $size);

// 件数が 0 件の場合は disconnection
if($num == 0){
$buf = _sendcmd('QUIT');
fclose($sock);
echo 'メールの件数が0件です';
exit;
}
// メール取得
for($i=1;$i<=$num;$i++){
$line = _sendcmd("RETR $i");
while (!ereg("^\.\r\n",$line)) {
$line = fgets($sock,512);
$dat[$i].= $line;
}
//受信したメールの削除
if($mail_dell){
$data = _sendcmd("DELE $i");
}
}
$buf = _sendcmd("QUIT");
fclose($sock);

/******************:
* 受信メール処理
*/
for($j=1;$j<=$num;$j++){
list($head, $body) = mime_split($dat[$j]);


// 日付取得
eregi("Date:[ \t]*([^\r\n]+)", $head, $date);
$file = date("Ymd.His",strtotime($date[1]));

// サブジェクト取得
eregi("Subject:[ \t]*([^\r\n]+)", $head, $subject);
while (eregi("(.*)=\?iso-2022-jp\?B\?([^\?]+)\?=(.*)",$subject[1],$regs)) { // MIME Bデコード
$subject = $regs[1].base64_decode($regs[2]).$regs[3];

}

//添付ファイル付きのメールだったら
if (eregi("Content-type:.*multipart/",$head)) {
eregi('boundary="([^"]+)"', $head, $boureg);
$body = str_replace($boureg[1], urlencode($boureg[1]), $body);
$part = split("\r\n--".urlencode($boureg[1])."-?-?",$body);

print '【タイトル】'.mb_convert_encoding($subject, $chare_print, "JIS").'
';

foreach ($part as $multi){
list($m_head, $m_body) = mime_split($multi);

$m_body = ereg_replace("\r\n\.\r\n$", "", $m_body);
if (!eregi("Content-type: *([^;\n]+)", $m_head, $type)) continue;
list($main, $sub) = explode("/", $type[1]);

// 本文をデコード
if (strtolower($main) == "text") {
$tmp = split("\r\n",mb_convert_encoding($m_body, $chare_print,"JIS"));
print '【本文】'; print_r($tmp); print '
';

//本文をテキストに保存する
//$fp = fopen("{$path}/{$file}.txt", "w") or die( "書き込み出来ません" );
//fputs($fp,$tmp[0]."\n".date("Y/m/d H:i:s",strtotime($date[1])));
//fclose($fp);
}

// 添付データをデコードして保存
if (eregi("Content-Transfer-Encoding:.*base64", $m_head)) {
$tmp = base64_decode($m_body);
$fp = fopen("{$path}/{$file}.jpg", "wb") or die( "画像の書き込みが出来ません" );
fputs($fp, $tmp);
fclose($fp);

print '【画像】
';
}
}
//添付無しの場合
}else{

print '【タイトル】'.mb_convert_encoding($subject, $chare_print, "JIS");
print '
【本文】'.str_replace("\n","
",mb_convert_encoding($m_body, $chare_print, "JIS"));

}

}

//////////////////////////////
// コマンド送信
function _sendcmd($cmd) {
global $sock;
fputs($sock, $cmd."\r\n");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) == '+OK') {
return $buf;
} else {
die($buf);
}
return false;
}
// MIME分割
function mime_split($data) {
$part = split("\r\n\r\n", $data, 2);
$part[1] = ereg_replace("\r\n[\t ]+", " ", $part[1]);

return $part;
}
?>

スポンサーサイト



コメントの投稿

非公開コメント

プロフィール

おちよ様

Author:おちよ様
こんにちわ!
phpやperlやDrupalについて調べ事をしたときに更新します。
【私に関するキーワード】
神戸生まれ、横浜育ち、ドラゴンボール世代、PG、SE、クラウド、Drupal、CMS、Perl、PHP、Javascript、商品開発、子育て(4歳と1歳)、いつか必ず起業してやる!結局いい所は背が高いだけ。

それともし万が一奇跡的にお役にたてる事がありましたら拍手頂けるとすごく嬉しいです><

カテゴリ
最新記事
カレンダー
08 | 2020/09 | 10
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 - - -
月別アーカイブ
FC2カウンター
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
検索フォーム