Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

peste

[Resolvido] Class Bounce Handler - HELP

Recommended Posts

peste

Boas Pessoal :D 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


Ta demais o bar da praia maninho, sempre a PROGRAMAR em hard techo hehehehe

Share this post


Link to post
Share on other sites
peste

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 by peste
  • Vote 2

Ta demais o bar da praia maninho, sempre a PROGRAMAR em hard techo hehehehe

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.