2014-05-28 4 views
0

В настоящее время я разрабатываю скрипт, используя imap, чтобы получать электронные письма и вставлять их в mysql. в основном система продажи билетов. Скрипт отлично работает и вставляет данные в MySQL, но у меня есть некоторые проблемы для обновления текущего билета. Я хотел бы взять номер билета из темы электронной почты и обновить этот билет. ниже, что я до сих пор. какие-либо предложения?Как получить номера из строки

Объект выглядит так: RE:Ticket#12345 - Testing Ticket creation. Мне нужно сделать, чтобы получить числа между # и -, сопоставить его с базой данных и обновить. В настоящее время он просто вставляет новые элементы в MySQL.

/* try to connect to the mailbox*/ 
    $inbox = imap_open($hostname,$username,$password) or die('Cannot connect: ' . imap_last_error()); 
}elseif($eml_service_control =="0"){ 
    echo 'Email to Tickets Service has been disabled by the system Administrator'; 
} 

/* If all goes well then let us grab the emails */ 
$emails = imap_search($inbox,'UNSEEN'); 

/* if emails are returned, cycle through each... */ 
if($emails) { 

    /* begin output var */ 
    $output = ''; 

    /* put the newest emails on top */ 
    rsort($emails); 

    foreach($emails as $email_number){ 
     $overview = imap_fetch_overview($inbox,$email_number,0); 
     $message = imap_fetchbody($inbox,$email_number,2); 
     $seen=$overview[0]->seen; 
     $date=$overview[0]->date; 
     $date2=$overview[0]->udate; 
     $from_email=imap_rfc822_parse_adrlist($overview[0] 
->from, 'localhost');$from_email=$from_email[0]; 
     $from_email=clean($from_email->mailbox."@".$from_email->host); 
     $subject=clean($overview[0]->subject); 
     $subject1=$overview[0]->subject; 
     $preg=preg_match("/Ticket#ID - ([0-9]+\s)/b", $subject1, $res); 
     $wo_id=extract_numbers($overview[0]->subject);print_r($res); 
     $wo_id=$wo_id[0]; 
     $wo_id=$res[1]; 
     if(!$wo_id){ $wo_id="";} 
     $message=strip_tags($message,"<br><div><p>"); 
     $message=clean("Received <b>$date</b><br/><hr/>$message"); 
     $q=mysql_query("SELECT * FROM `table_customer` WHERE 
CUSTOMER_EMAIL='$from_email'"); 
     if(mysql_num_rows($q)==1){ $customer_id=mysql_fetch_array($q); 
$customer_id=$customer_id['CUSTOMER_ID']; } else { $customer_id=""; } 
      print_r($overview); 
      $q=mysql_query("SELECT * FROM tickets WHERE TICKET_ID='$ticket_id'") or die(mysql_error()); 
      $n=mysql_num_rows($q); 
      $date2=date("H:i:s", $date2); 
      $priority="1"; 
      if($n==0){ 
       mysql_query("INSERT INTO `tickets` 
        (SCOPE, DESCRIPTION, PRIORITY_ID, CREATED_TIME, OPEN_DATE, STATUS, CUSTOMER_ID) 
        VALUES 
        ('$subject', '$message','$priority', '$date2', '$date', '0', '$customer_id')"); 
      } elseif($n==1) { 
       mysql_query("UPDATE tickets SET DESCRIPTION = CONCAT 
('Received <b>$date</b><br/><hr/>$message <hr/><hr/>', DESCRIPTION) WHERE 
TICKET_ID='$ticket_id'") or die(mysql_error()); 
      } 
      $status = imap_setflag_full($inbox, $email_number, "\\Seen \\Flagged", ST_UID); 
      imap_delete($inbox, $email_number); 
     } 
     echo $output; 
    } else { 
     echo "<!-- debug -->"; 
    } 

    /* close the connection */ 
    imap_close($inbox); 
+0

Как субъекты электронной почты получить сгенерированный? – Strawberry

+0

В будущем было бы лучше, если бы вы опубликовали только минимальный блок кода для тиражирования изолированной проблемы. Будущим читателям SO придется сканировать весь код, чтобы найти строку preg_match. У меня возникло соблазн решить вопрос прямо, но тогда ваш следующий вопрос (комментарий Джорджу) больше не имеет смысла. Что сделал этот модификатор '\ b'? – mickmackusa

ответ

1
preg_match("/Ticket#([0-9]+)/", $subject, $output); 
$output[1]; 

вернуть бы число из любой строки, содержащей Ticket#{{number}}.

+0

Отлично! это работает. Я просто заменяю preg_match ("/ Ticket # ([0-9] +) /", только. Думаю, я слишком много снимал. Спасибо – user3620142

+0

Я также хотел бы ограничить количество писем, которые нужно вставлять каждый раз, когда я запускаю скрипт любые предложения? – user3620142

+0

@ user3620142 '$ i = {{limit}};' над вашим оператором 'foreach'. Тогда первая строка внутри него' if ($ i-- === 0) break; '. ваш MYSQL встает за пределы foreach и делает их в конце, поэтому вы только вызываете базу данных один раз. –

1

Я хотел бы попробовать что-то вроде этого:

// Grab the ticket_id from the subject line ($str) 
preg_match('/Ticket#([0-9]+)\s+?/', $str, $matches); 
$ticket_id = $matches[1]; 

// Check if ticket id exists 
$result=mysql_query("select count(*) as total from tickets where ticket_id ='$ticket_id'"); 

$data=mysql_fetch_assoc($result); 

if ($data['total'] > 0) { 
    // Do mysql update 
} 
else { 
    // Do mysql insert 
} 
+0

Привет, ricky, Спасибо, это тоже работает, но решение Джорджа намного проще. Я также понимаю, что я делаю неправильно. , – user3620142

Смежные вопросы