Коллеги!
Есть хороший скрипт - парсит почту, записывает ее в MySQL, вложения сохраняет на сервере.
phpclasses.org/package/3324-PHP-Retrieve-e-mail-messages-into-a-MySQL-database.html
Но у меня проблема - никак не могу исправить код.
Он сохраняет файлы так: IDfilemane (напр.: 25myimage.jpg )
А мне нужно: filemame_I D (напр.: myimage_25.jpg )
или
filemame_ID_date_time (напр.: myimage_25_2015-01-25-12-00.jpg )
Пожалуйста, помогите!!!
Вот скрипт:
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. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521.
<?
/** EMAIL TO DB Author:Ernest Wojciuk */
class EMAIL_TO_DB {
var $IMAP_host; #pop3 server
var $IMAP_port; #pop3 server port
var $IMAP_login;
var $IMAP_pass;
var $link;
var $error = array();
var $status;
var $max_headers = 10; #How much headers to retrive 'max'=all headers
var $filestore;
var $file_path = '/var/www/files/email/'; #Where to write file attachments
var $partsarray = array();
var $msgid =1;
var $newid;
var $logid;
var $this_file_name = 'example_1.php'; #If mode "html"
var $mode = 'html'; #If script run from cron = "cron" or "html"
var $spam_folder = 1; #Folder where moving spam (ID from DB)
var $file = array(); #File in multimart message
function connect($host, $port, $login, $pass){
$this->IMAP_host = $host;
$this->IMAP_login = $login;
$this->link = imap_open("{". $host . $port."}INBOX", $login, $pass);
if($this->link) {
$this->status = 'Connected';
} else {
$this->error[] = imap_last_error();
$this->status = 'Not connected';
}
}
function set_path(){
$path = $this->file_path;
return $path;
}
function set_filestore(){
$dir = $this->dir_name();
$path = $this->set_path();
$this->filestore = $path.$dir;
}
/** Get mailbox info*/
function mailboxmsginfo(){
//$mailbox = imap_mailboxmsginfo($this->link); #It's wery slow
$mailbox = imap_check($this->link);
if ($mailbox) {
$mbox["Date"] = $mailbox->Date;
$mbox["Driver"] = $mailbox->Driver;
$mbox["Mailbox"] = $mailbox->Mailbox;
$mbox["Messages"]= $this->num_message();
$mbox["Recent"] = $this->num_recent();
$mbox["Unread"] = $mailbox->Unread;
$mbox["Deleted"] = $mailbox->Deleted;
$mbox["Size"] = $mailbox->Size;
} else {
$this->error[] = imap_last_error();
}
return $mbox;
}
/** Number of Total Emails */
function num_message(){
return imap_num_msg($this->link);
}
/** Number of Recent Emails */
function num_recent(){
return imap_num_recent($this->link);
}
/** Type and subtype message */
function msg_type_subtype($_type){
if($_type > 0){
switch($_type){
case '0': $type = "text"; break;
case '1': $type = "multipart"; break;
case '2': $type = "message"; break;
case '3': $type = "application"; break;
case '4': $type = "audio"; break;
case '5': $type = "image"; break;
case '6': $type = "video"; break;
case '7': $type = "other"; break;
}
}
return $type;
}
/** Flag message */
function email_flag(){
switch ($char) {
case 'S':
if (strtolower($flag) == '\\seen') {
$msg->is_seen = true;
}
break;
case 'A':
if (strtolower($flag) == '\\answered') {
$msg->is_answered = true;
}
break;
case 'D':
if (strtolower($flag) == '\\deleted') {
$msg->is_deleted = true;
}
break;
case 'F':
if (strtolower($flag) == '\\flagged') {
$msg->is_flagged = true;
}
break;
case 'M':
if (strtolower($flag) == '$mdnsent') {
$msg->is_mdnsent = true;
}
break;
default:
break;
}
}
/** Parse e-mail structure */
function parsepart($p,$msgid,$i){
$part=imap_fetchbody($this->link,$msgid,$i);
#Multipart
if ($p->type!=0){
#if base64
if ($p->encoding==3)$part=base64_decode($part);
#if quoted printable
if ($p->encoding==4)$part=quoted_printable_decode($part);
#If binary or 8bit -we no need to decode
#body type (to do)
switch($p->type) {
case '5': # image
$this->partsarray[$i][image] = array('filename'=>imag1,'string'=>$part, 'part_no'=>$i);
break;
}
#Get attachment
$filename='';
if (count($p->dparameters)>0){
foreach ($p->dparameters as $dparam){
if ((strtoupper($dparam->attribute)=='NAME') ||(strtoupper($dparam->attribute)=='FILENAME')) $filename=$dparam->value;
}
}
#If no filename
if ($filename==''){
if (count($p->parameters)>0){
foreach ($p->parameters as $param){
if ((strtoupper($param->attribute)=='NAME') ||(strtoupper($param->attribute)=='FILENAME')) $filename=$param->value;
}
}
}
if ($filename!='' ){
$this->partsarray[$i][attachment] = array('filename'=>$filename,'string'=>$part, 'encoding'=>$p->encoding, 'part_no'=>$i,'type'=>$p->type,'subtype'=>$p->subtype);
}
#end if type!=0
}
#Text email
else if($p->type==0){
#decode text
#if QUOTED-PRINTABLE
if ($p->encoding==4) $part=quoted_printable_decode($part);
#if base_64
if ($p->encoding==3) $part=base64_decode($part);
#if plain text
if (strtoupper($p->subtype)=='PLAIN')1;
#if HTML
else if (strtoupper($p->subtype)=='HTML')1;
$this->partsarray[$i][text] = array('type'=>$p->subtype,'string'=>$part);
}
#if subparts
if (count($p->parts)>0){
foreach ($p->parts as $pno=>$parr){
$this->parsepart($parr,$this->msgid,($i.'.'.($pno+1)));
}
}
return;
}
/** All email headers */
function email_headers(){
#$headers=imap_headers($this->link);
if($this->max_headers == 'max'){
$headers = imap_fetch_overview($this->link, "1:".$this->num_message(), 0);
} else {
$headers = imap_fetch_overview($this->link, "1:$this->max_headers", 0);
}
if($this->max_headers == 'max') {
$num_headers = count($headers);
} else {
$count = count($headers);
if($this->max_headers >= $count){
$num_headers = $count;
} else {
$num_headers = $this->max_headers;
}
}
$size=sizeof($headers);
for($i=1; $i<=$size; $i++){
$val=$headers[$i];
//while (list($key, $val) = each($headers)){
$subject_s = (empty($val->subject)) ? '[No subject]' : $val->subject;
$lp = $lp +1;
imap_setflag_full($this->link,imap_uid($this->link,$i),'\\SEEN',SE_UID);
$header=imap_headerinfo($this->link, $i, 80,80);
if($val->seen == "0" && $val->recent == "0") {echo '<b>'.$val->msgno . '-' . $subject_s . '-' . $val->from .'-'. $val->date."</b><br><hr>" ;}
else {echo $val->msgno . '-' . $subject_s . '-' . $val->from .'-'. $val->date."<br><hr>" ;}
}
}
/** Get email */
function email_get(){
$email = array();
$this->set_filestore();
$header=imap_headerinfo($this->link, $this->msgid, 80,80);
$from = $header->from;
$udate= $header->udate;
$to = $header->to;
$size = $header->Size;
if ($header->Unseen == "U" || $header->Recent == "N") {
#Check is it multipart messsage
$s = imap_fetchstructure($this->link,$this->msgid);
if (count($s->parts)>0){
foreach ($s->parts as $partno=>$partarr){
#parse parts of email
$this->parsepart($partarr,$this->msgid,$partno+1);
}
} else { #for not multipart messages
#get body of message
$text=imap_body($this->link,$this->msgid);
#decode if quoted-printable
if ($s->encoding==4) $text=quoted_printable_decode($text);
if (strtoupper($s->subtype)=='PLAIN') $text=$text;
if (strtoupper($s->subtype)=='HTML') $text=$text;
$this->partsarray['not multipart'][text]=array('type'=>$s->subtype,'string'=>$text);
}
if(is_array($from)){
foreach ($from as $id => $object) {
$fromname = $object->personal;
$fromaddress = $object->mailbox . "@" . $object->host;
}
}
if(is_array($to)){
foreach ($from as $id => $object) {
$toaddress = $object->mailbox . "@" . $object->host;
}
}
$email['CHARSET'] = $charset;
$email['SUBJECT'] = $this->mimie_text_decode($header->Subject);
$email['FROM_NAME'] = $this->mimie_text_decode($fromname);
$email['FROM_EMAIL'] = $fromaddress;
$email['TO_EMAIL'] = $toaddress;
$email['DATE'] = date("Y-m-d H:i:s",strtotime($header->date));
$email['SIZE'] = $size;
#SECTION - FLAGS
$email['FLAG_RECENT'] = $header->Recent;
$email['FLAG_UNSEEN'] = $header->Unseen;
$email['FLAG_ANSWERED']= $header->Answered;
$email['FLAG_DELETED'] = $header->Deleted;
$email['FLAG_DRAFT'] = $header->Draft;
$email['FLAG_FLAGGED'] = $header->Flagged;
}
return $email;
}
function mimie_text_decode($string){
$string = htmlspecialchars(chop($string));
$elements = imap_mime_header_decode($string);
if(is_array($elements)){
for ($i=0; $i<count($elements); $i++) {
$charset = $elements[$i]->charset;
$txt .= $elements[$i]->text;
}
} else {
$txt = $string;
}
if($txt == ''){
$txt = 'No_name';
}
if($charset == 'us-ascii'){
//$txt = $this->charset_decode_us_ascii ($txt);
}
return $txt;
}
/** Save messages on local disc */
function save_files($filename, $part){
$fp=fopen($this->filestore.$filename,"w+");
fwrite($fp,$part);
fclose($fp);
chown($this->filestore.$filename, 'apache');
}
/** Set flags */
function email_setflag(){
imap_setflag_full($this->link, "2,5","\\Seen \\Flagged");
}
/** Mark a message for deletion */
function email_delete(){
imap_delete($this->link, $this->msgid);
}
/** Delete marked messages */
function email_expunge(){
imap_expunge($this->link);
}
/** Close IMAP connection */
function close(){
imap_close($this->link);
}
function listmailbox(){
$list = imap_list($this->link, "{".$this->IMAP_host."}", "*");
if (is_array($list)) {
return $list;
} else {
$this->error = "imap_list failed: " . imap_last_error() . "\n";
}
return array();
}
/*** SPAM DETECTION
******************************/
function spam_detect(){
$email = array();
$id = $this->newid; #ID email in DB
$execute = mysql_query("SELECT ID, IDEmail, EmailFrom, EmailFromP, EmailTo, Subject, Message, Message_html FROM emailtodb_email WHERE ID='".$id."'");
$row = mysql_fetch_array($execute);
$ID = $row['ID'];
$email['Email'] = $row['EmailFrom'];
$email['Subject'] = $row['Subject'];
$email['Text'] = $row['Message'];
$email['Text_HTML'] = $row['Message_html'];
if($this->check_blacklist($email['Email'])){
$this->update_folder($id, $this->spam_folder);
}
if($this->check_words($email['Subject'])){
$this->update_folder($id, $this->spam_folder);
}
if($this->check_words($email['Text'])){
$this->update_folder($id, $this->spam_folder);
}
if($this->check_words($email['Text_HTML'])){
$this->update_folder($id, $this->spam_folder);
}
}
function check_blacklist($email){
#spam - emails
$execute = mysql_query("SELECT Email FROM emailtodb_list WHERE Email='".addslashes($email)."' AND Type='B'");
$row = mysql_fetch_array($execute);
$e_mail = $row['Email'];
if($e_mail == $email){
return 1;
} else {
return 0;
}
}
function check_words($string){
#spam - words
$string = strtolower($string);
$execute = mysql_query("SELECT Word FROM emailtodb_words ");
while($row = mysql_fetch_array($execute)){
$word = strtolower($row['Word']);
if (eregi($word, $string)) {
return 1;
}
}
}
/*** DB FUNCTIONS
*****************************/
/** Add email to DB */
function db_add_message($email){
$execute = mysql_query("INSERT INTO emailtodb_email (IDEmail, EmailFrom, EmailFromP, EmailTo, DateE, DateDb, Subject, MsgSize) VALUES
('".$message_id."',
'".$email['FROM_EMAIL']."',
'".addslashes(strip_tags($email['FROM_NAME']))."',
'".addslashes(strip_tags($email['TO_EMAIL']))."',
'".$email['DATE']."',
'".date("Y-m-d H:i:s")."',
'".addslashes($email['SUBJECT'])."',
'".$email["SIZE"]."')");
$execute = mysql_query("select LAST_INSERT_ID() as UID");
$row = mysql_fetch_array($execute);
$this->newid = $row["UID"];
}
/** Add attachments to DB */
function db_add_attach($file_orig, $filename){
$execute = mysql_query("INSERT INTO emailtodb_attach (IDEmail, FileNameOrg, Filename) VALUES
('".$this->newid."',
'".addslashes($file_orig)."',
'".addslashes($filename)."')");
}
/** Add email to DB */
function db_update_message($msg, $type= 'PLAIN'){
if($type == 'PLAIN') $execute = mysql_query("UPDATE emailtodb_email SET Message='".addslashes($msg)."' WHERE ID= '".$this->newid."'");
if($type == 'HTML') $execute = mysql_query("UPDATE emailtodb_email SET Message_html='".addslashes($msg)."' WHERE ID= '".$this->newid."'");
}
/** Insert progress log */
function add_db_log($email, $info){
$execute = mysql_query("INSERT INTO emailtodb_log (IDemail, Email, Info, FSize, Date_start, Status) VALUES
('".$this->newid."',
'".$email['FROM_EMAIL']."',
'".addslashes(strip_tags($info))."',
'".$email["SIZE"]."',
'".date("Y-m-d H:i:s")."',
'2')");
$execute = mysql_query("select LAST_INSERT_ID() as UID");
$row = mysql_fetch_array($execute);
$this->logid = $row['UID'];
return $this->logid;
}
/** Set folder */
function update_folder($id, $folder){
$execute = mysql_query("UPDATE emailtodb_email SET Type = '".addslashes($folder)."' WHERE ID = '".$id."'");
}
/** Update progress log */
function update_db_log($info, $id){
$execute = mysql_query("UPDATE emailtodb_log SET Status = '1', Info='".addslashes(strip_tags($info))."', Date_finish = '".date("Y-m-d H:i:s")."' WHERE IDlog = '".$id."'");
}
/** Read log from DB */
function db_read_log(){
$email = array();
$execute = mysql_query("SELECT IDlog, IDemail, Email, Info, FSize, Date_start, Date_finish, Status FROM emailtodb_log ORDER BY Date_finish DESC LIMIT 100");
while($row = mysql_fetch_array($execute)){
$ID = $row['IDlog'];
$email[$ID]['IDemail'] = $row['IDemail'];
$email[$ID]['Email'] = $row['Email'];
$email[$ID]['Info'] = $row['Info'];
$email[$ID]['Size'] = $row['FSize'];
$email[$ID]['Date_start'] = $row['Date_start'];
$email[$ID]['Date_finish'] = $row['Date_finish'];
}
return $email;
}
/** Read emails from DB */
function db_read_emails(){
if (!isset($db)) $db = new DB_WL;
$email = array();
$execute = mysql_query("SELECT ID, IDEmail, EmailFrom, EmailFromP, EmailTo, DateE, DateDb, Subject, Message, Message_html, MsgSize FROM emailtodb_email ORDER BY ID DESC LIMIT 25");
while($row = mysql_fetch_array($execute)){
$ID = $row['ID'];
$email[$ID]['Email'] = $row['EmailFrom'];
$email[$ID]['EmailName'] = $row['EmailFrom'];
$email[$ID]['Subject'] = $row['Subject'];
$email[$ID]['Date'] = $row['DateE'];
$email[$ID]['Size'] = $row['MsgSize'];
}
return $email;
}
function dir_name() {
$year = date('Y');
$month = date('m');
$dir_n = $year . "_" . $month;
echo $this->set_path();
if (is_dir($this->set_path() . $dir_n)) {
return $dir_n . '/';
} else {
mkdir($this->set_path() . $dir_n, 0777);
return $dir_n . '/';
}
}
function do_action(){
if($this->num_message() >= 1) {
if($this->msgid <= 0) {
$this->msgid = 1;
} else {
$this->msgid = $_GET[msgid] + 1;
}
#Get first message
$email = $this->email_get();
#Get store dir
$dir = $this->dir_name();
#Insert message to db
$ismsgdb = $this->db_add_message($email);
$id_log = $this->add_db_log($email, 'Copy e-mail - start ');
foreach($this->partsarray as $part){
if($part[text][type] == 'HTML'){
#$message_HTML = $part[text][string];
$this->db_update_message($part[text][string], $type= 'HTML');
}elseif($part[text][type] == 'PLAIN'){
$message_PLAIN = $part[text][string];
$this->db_update_message($part[text][string], $type= 'PLAIN');
}elseif($part[attachment]){
#Save files(attachments) on local disc
// $message_ATTACH[] = $part[attachment];
foreach(array($part[attachment]) as $attach){
$attach[filename] = $this->mimie_text_decode($attach[filename]);
$attach[filename] = preg_replace('/[^a-z0-9_\-\.]/i', '_', $attach[filename]);
$this->add_db_log($email, 'Start coping file:"'.strip_tags($attach[filename]).'"');
$this->save_files($this->newid.$attach[filename], $attach[string]);
$filename = $dir.$this->newid.$attach[filename];
$this->db_add_attach($attach[filename], $filename);
$this->update_db_log('<b>'.$filename.'</b>Finish coping: "'.strip_tags($attach[filename]).'"', $this->logid);
}
//
}elseif($part[image]){
#Save files(attachments) on local disc
$message_IMAGE[] = $part[image];
foreach($message_IMAGE as $image){
$image[filename] = $this->mimie_text_decode($image[filename]);
$image[filename] = preg_replace('/[^a-z0-9_\-\.]/i', '_', $image[filename]);
$this->add_db_log($email, 'Start coping file: "'.strip_tags($image[filename]).'"');
$this->save_files($this->newid.$image[filename], $image[string]);
$filename = $dir.$this->newid.$image[filename];
$this->db_add_attach($image[filename], $filename);
$this->update_db_log('<b>'.$filename.'</b>Finish coping:"'.strip_tags($image[filename]).'"', $this->logid);
}
}
}
$this->spam_detect();
$this->email_setflag();
$this->email_delete();
$this->email_expunge();
$this->update_db_log('Finish coping', $id_log);
if($email <> ''){
unset($this->partsarray);
# echo "<meta http-equiv=\"refresh\" content=\"2; url=email.monitor.mail.php?msgid=".$this->msgid."\">";
if($this->mode == 'html') {
echo "<meta http-equiv=\"refresh\" content=\"2; url=".$this->this_file_name."?msgid=0\">";
echo "E-mail extract";
}
}
} else {
# No messages
if($this->mode == 'html') {
echo "<meta http-equiv=\"refresh\" content=\"10; url=".$this->this_file_name."?msgid=0\">";
echo "E-mail extract";
}
}
}
}#end class
?>
Модератор:
Sweet Julia , не забываем использовать для оформления кода тег SRC, а для больших фрагментов так же и спойлер. Это улучшает читаемость как кода, так и страницы форума.
Сообщение отредактировано.
--
vkle
|