Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

peste

[Resolvido] Class Bounce Handler - HELP

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por peste
  • Voto 2

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.