peste Posted February 21, 2013 at 05:01 PM Report #496500 Posted February 21, 2013 at 05:01 PM Boas Pessoal 😄 tudo bem? É o seguinte, onde estou a estagiar, tenho que fazer um programa para criação de newsletter, essa parte ja ta criada. E envia para os emails(poucos, mas quando for para o servidor já é para muitos. Mas agora tenho que criar um Bounce, para quando os emails forem recusados, ou nao chegam a ser entregues por a caixa estar cheia, ou por o e-mail ser falso, fazer alterações na BD. Consigo que eles cheguem ao email do Bounce criado na empresa, mas agora nao consigo implementar na pagina php. Consigo que ele abra a conta do email e veja os emails, e quantos são. Mas falta agora conseguir que ele identifique quais os bounces dos emails. Alguem pode dar uma ajuda. o que eu tenho para agora é isto. <?php //echo phpinfo(); $mail_box ='{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX'; //imap example $mail_username = "xpto@gmail.com" ; $mail_password = "xpto" ; $mail_folder="INBOX"; $body=""; echo "<h1>".$mail_username."</h1>\n\n" ; //conexao ao mail $mbox = imap_open($mail_box, $mail_username, $mail_password) or die("Error opening mailbox: ".imap_last_error()); //array retorna todos os headers do emails $mailboxheaders = imap_headers($mbox); //quantos mail tem na caixa de email escolhida $num = imap_num_msg($mbox); //$body=imap_body($mbox); if ($mailboxheaders == false) { echo "<p>".$mail_folder." is empty.</p>\n\n"; } else { echo $num; echo "<h2>".$mail_folder."</h2>\n" ; echo "<ol>\n" ; $msgno = 0; foreach ($mailboxheaders as $val) { $msgno++; $n=$msgno; echo " <li>".$val ."</li>\n"; $st = imap_fetchstructure($mbox, $n); if (!empty($st->parts)) { for ($i = 0, $j = count($st->parts); $i < $j; $i++) { $part = $st->parts[$i]; if ($part->subtype == 'PLAIN') { $body = imap_fetchbody($mbox, $n, $i+1); } } } else { $body = imap_body($mbox, $n); } require_once("bounce_driver.class.php"); $bouncehandler = new Bouncehandler(); $multiArray = $bouncehandler->get_the_facts($body); print_r($multiArray); } echo "</ol>\n\n" ; } imap_close($mbox); ?> Obrigado
Solution peste Posted February 22, 2013 at 06:00 PM Author Solution Report #496668 Posted February 22, 2013 at 06:00 PM (edited) Boas tardes, consegui resolver o problema. Passo a explicar, Ao enviar uma newsletteres para varios subscritores pode acontecer ter algum email que ja nao seja usado, ou outra coisa qualquer. Então vais querer eliminar esse mail da lista, e com ajuda dos bounces que recebes se o mail for recusado, consegues eliminar o mail. Descobri a class neste site http://www.phpclasses.org/package/2691-PHP-Parse-bounced-e-mail-message-reports.html Mas depois fui buscar a class melhorada para ligação ao email http://cheesefather.com/?p=163 E ao correr dava-me imenso erros, principalmente no split, então substitui o split por explode, e de seguida ja me mostra os valores que eu precisava, que era o email, o codigo de retorno do email (esta nesta lista o codigo http://www.activecampaign.com/support/tt/kb/article/email-marketing/version-50/common-questions/what-do-bounce-codes-mean). entretanto aparecia mais erros, mas como ja tinha o que era preciso desactivei na pagina o error_reporting(0); Depois foi so introduzir uma linhas de codigo para poder fazer uma limpeza na lista de subscritores. Fica aqui o codigo para quem possa vir a precisar <?php //echo phpinfo(); error_reporting(0); include("connect.php"); $mail_box ='{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX'; //imap example $mail_username = xpto@gmail.com" ; $mail_password = "xpto" ; # connect to mailbox $conn = imap_open ($mail_box, $mail_username, $mail_password) or die(imap_last_error()); $num_msgs = imap_num_msg($conn); # start bounce class require_once('bounce_driver.class.php'); $bouncehandler = new Bouncehandler(); # get the failures $email_addresses = array(); $delete_addresses = array(); for ($n=1;$n<=$num_msgs;$n++) { $bounce = imap_fetchheader($conn, $n).imap_body($conn, $n); //entire message // echo"ola $bounce"; $multiArray = $bouncehandler->get_the_facts($bounce); echo "<pre>"; // print_r($multiArray); if($multiArray[0]['recipient']!='') $arraymeu[]=array($multiArray[0]['recipient'],$multiArray[0]['status'],$multiArray[0]['action']); if (!empty($multiArray[0]['action']) && !empty($multiArray[0]['status']) && !empty($multiArray[0]['recipient']) ) { $mail=$multiArray[0]['recipient']; //se for soft bounce if (($multiArray[0]['status']=='5.2.0')||($multiArray[0]['status']=='5.2.1') ||($multiArray[0]['status']=='5.2.2') ||( $multiArray[0]['status']=='5.3.1') ||($multiArray[0]['status']=='5.4.5') ||($multiArray[0]['status']=='5.5.3')) { //vai buscar o valor de count $sqlcount="SELECT @count:=count FROM users_e_mails WHERE e_mail='$mail'"; $update="UPDATE users_e_mails SET count=@count+1 WHERE e_mail='$mail'"; mysql_query($sqlcount); mysql_query($update); $check=mysql_query("SELECT count FROM users_e_mails WHERE e_mail='$mail'"); $row=mysql_fetch_array($check); $num=$row[0]; //verifica se ja contabilizou 3 soft bounces if ($num>=3){ $update= "UPDATE users_e_mails SET status=0 WHERE e_mail='$mail'"; mysql_query($update); } } //se for hard bounce(restante codigos) else{ $update="UPDATE users_e_mails SET status=0 WHERE e_mail='$mail'"; mysql_query($update); } //if delivery failed } //if passed parsing as bounce } //for loop print_r($arraymeu); //print_r($email_addresses); /*# process the failures foreach ($email_addresses as $key => $value) { //trim($key) is email address, $value is number of failures if ($value>=$delete) { /* do whatever you need to do here, e.g. unsubscribe email address # mark for deletion foreach ($delete_addresses[$key] as $delnum) imap_delete($conn, $delnum); } //if failed more than $delete times } //foreach*/ # delete messages imap_expunge($conn); # close imap_close($conn); ?> Bom fim de semana Edited February 22, 2013 at 06:01 PM by peste 2 Report
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now