require_once "func.php";//подключаем функции
require_once "connect.php";//подключаем настройки к MySQL
wr("\n=============================\n");
//некоторые строки уже прокомменитированы в коде (см. reader.php),
//поэтому оставим их без комментариев
set_time_limit(0);
$lock = "loader.lock";
$aborted = file_exists($lock) ? filemtime($lock) : false;
$fp = fopen($lock,'w');
register_shutdown_function(function() use ($fp, $lock) {
wr("shutdown");
flock($fp, LOCK_UN);//снимаем блокировку с файла
fclose($fp);//закрываем файл
unlink( __DIR__ . DIRECTORY_SEPARATOR . $lock);//удаляем файл
});
if(!flock($fp,LOCK_EX|LOCK_NB)){
wr("busy\n");//пишем в лог, что занято
}else{
if($aborted){
wr("Aborted\n");
}
//составим список только тех почтовых ящиков,
//сообщения которых еще не скачаны
$sql = "SELECT b.*
FROM mailboxes b
JOIN(
SELECT mailbox_id FROM messages GROUP BY mailbox_id
)m ON m.mailbox_id = b.id";
$res = mysql_query($sql);
$mailboxes = array();
while($row = mysql_fetch_array($res)){
array_push($mailboxes,$row);
}
//перебор почтовых ящиков
foreach($mailboxes as $mailbox){
$mailbox_id = $mailbox['id'];
$host = $mailbox['host'];//адрес почтового сервера
$port = $mailbox['port'];//порт почтового сервера
$user = $mailbox['email'];//имя пользователя (почтовый ящик)
$password = $mailbox['password'];//пароль к почтовому ящику
$ssl = $mailbox['is_ssl'] ? "/ssl" : "";
//строка подключения
$conn = "{{$host}:{$port}{$ssl}}";
wr("Read $user, conn = $conn");
//открываем IMAP-поток
$mail = imap_open($conn,$user,$password);
if(!$mail){
//пишем в лог сообщение о неудачной попытке подключения
wr("Error opening IMAP. " . imap_last_error());
continue;//переходим к следующему ящику
}
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
//получаем список сообщений, которые необходимо скачать с почтового ящика
$sql = "SELECT *
FROM messages
WHERE mailbox_id = $mailbox_id AND is_ready = false";
$res = mysql_query($sql);
while($message = mysql_fetch_array($res)){
$message_id = $message['id'];//ID письма в базе данных
$message_uid = $message['uid'];//уникальный номер письма
$headerRaw = getHeaderRaw($mail,$message_uid);//технический заголовок письма
$header = getHeader($mail,$message_uid);//заголовок письма
$subject = getDecodedHeader($header->subject);//тема письма
$headerDate = strToMysqlDate($header->date);//дата письма
$body_text = getTextBody($mail,$message_uid);//содержимое письма в виде простого текста
$body_html = getHtmlBody($mail,$message_uid);//содержимое письма в формате html
//получение адресов из заголовка письма
$address_map = array();
$address_types = array('to','from','reply_to','sender','cc','bcc');
foreach($address_types as $address_type){
getAddress($header,$address_type,$address_map);
}
foreach($address_map as $key => $arr){
foreach($arr as $obj){
$type = $key;
$address = "$obj->mailbox@$obj->host";//склеиваем email
$sql = "INSERT INTO addresses(message_id,type,email)
VALUES($message_id,
'" . mysql_real_escape_string($type) . "',
'" . mysql_real_escape_string($address) . "')";
mysql_query($sql) or wr(mysql_error());
}
}
//считываем вложения и получаем кол-во вложений,
//которое записываем в базу данных
$attachCount = loadAttaches($mail,$message_uid,$message_id);
$sql = "UPDATE messages
SET subject = '" . mysql_real_escape_string($subject) . "',
body_text = '" . mysql_real_escape_string($body_text) . "',
body_html = '" . mysql_real_escape_string($body_html) . "',
header = '" . mysql_real_escape_string($headerRaw) . "',
message_date = '" . mysql_real_escape_string($headerDate) . "',
attachment_count = $attachCount,
modify_date = now(),
is_ready = true
WHERE id = $message_id";
mysql_query($sql) or wr(mysql_error());
mysql_query("COMMIT");
}
}
}
?> |