formigoni 0 Denunciar post Postado Março 11, 2008 Olá, bom dia... ... como fazer a seguinte verificação depois de envio de e-mail com a função mail para poder gravar em meu banco de dados essas informações? E-mails enviados com sucesso - <número> E-mail com falha no envio - <número> E mais uma coisa, já abusando, quando envio essa mensagem todos os destinatários vêem os endereços de cada um, tem como ocultar isso, sei que tem o bcc na função, mas não consegui acertar e só falta isso pra mim apresentar esse projeto na faculdade O código que tenho é esse aqui: CODE <?php require_once('conexao.php'); mysql_select_db($db, $conn); $query_grupos = "SELECT email FROM usuarios WHERE id_grupo = ". $_POST["id_grupo"] ." "; $grupos = mysql_query($query_grupos, $conn) or die(mysql_error()); $row_grupos = mysql_fetch_assoc($grupos); $totalRows_grupos = mysql_num_rows($grupos); // inicilização da variável $lista = ""; // laço para buscar todos os componentes de determinado grupo do { if ( $lista == "" ) { $lista = $row_grupos['email']; } else { $lista = $lista . ";" . $row_grupos['email']; } } while ($row_grupos = mysql_fetch_assoc($grupos)); echo $lista; /* Formatação da mensagem a ser enviada por e-mail */ $where_form_is="http".($HTTP_SERVER_VARS["HTTPS"]=="on"?"s":"")."://".$SERVER_NAME.strrev(strstr(strrev($PHP_SELF),"/")); //Configuração do corpo do e-mail que será enviado para o Cliente $to = $lista; $subject = $assunto; $message = $msg_html; //Retorna a string retirando as aspas duplas $menssagem = nl2br(stripslashes($message)); // email de origem $email_origem = $email_de; // cabecalhos do e-mail $headers = "MIME-Version: 1.0\n"; $headers.= "Content-type: text/html; charset=iso-8859-1\n"; $headers.= "From: Empresa ".$email_origem."\n"; $headers.= "Return-Path: ".$email_origem."\n"; // envio da mensagem mail($to,$subject,$menssagem,$headers,$email); ?> <script > window.alert("A newsletter foi enviada com sucesso"); window.location.href="cartas.php"; </script> Valeu Compartilhar este post Link para o post Compartilhar em outros sites
Paulo André 0 Denunciar post Postado Março 11, 2008 Esses e-mails enviados com sucesso e com falha você diz erros do próprio PHP ou erros do tipo caixa de entrada cheia, usuário não existe, servidor indisponível e etc? Sobre a outra dúvida, o ideal neste caso é fazer uma iteração com a lista e enviar um e-mail pra cada um. []'s Compartilhar este post Link para o post Compartilhar em outros sites
formigoni 0 Denunciar post Postado Março 11, 2008 Olá Paulo André, Sim, gostaria de reportar esses tipos de erros, mas não imagino como possa ser feito em php. Sobre a iteração com a lista, como poderia ser feita, tem como dar um exemplo? Valeu Compartilhar este post Link para o post Compartilhar em outros sites
Paulo André 0 Denunciar post Postado Março 11, 2008 Para a iteração, modifiquei uma parte do seu código que faz a lista, ai ficaria assim montando um array: <?php // inicilização da variável $lista = array(); // laço para buscar todos os componentes de determinado grupo do { $lista = array_push($lista, $row_grupos['email']); } while ($row_grupos = mysql_fetch_assoc($grupos)); ?> E no momento do envio: <?php // envio da mensagem foreach( $lista as $to ) { mail($to, $subject, $mensagem, $headers); } ?> * Lembrando que normalmente nos servidores há um limite de envio por hora, então você deve ficar atento à isto. A parte dos erros é um pouco mais complicada, fiz isto esses dias aqui na empresa para desenvolver um sistema de e-mail marketing, a idéia é a seguinte: No quinto parâmetro da função mail() você deve passar o e-mail de retorno que irá no cabeçalho deste e-mail, caso ele volte, como por exemplo: -fbounce@empresa.com.br E esta conta bounce é configurada não da forma normal em seu painel de controle, você precisa usá-la como filtro para que todo e-mail que cair nesta caixa de entrada seja direcionada para um programa, ou seja, para um script seu que é basicamente assim: #! /usr/bin/php <?php $fd = fopen("php://stdin", "r"); $email = ""; while( !feof($fd) ) { $email .= fread($fd, 1024); } fclose($fd); ?> Onde a variável $email neste script é exatamente o e-mail retornado, incluindo cabeçalhos com data de envio, data de retorno e motivo pelo qual o e-mail não foi retornado. Com estas informações, você irá tratar esta variável pegando somente o erro, filtrando e adicionando em seu banco de dados de acordo com cada erro. Os erros comuns que encontrei foram dois tipo: Hard Bounce e Soft Bounce. Hard Bounce são e-mails retornados que o servidor de envio não encontrou o servidor de destino e Soft Bounce são os outros possíveis erros como caixa de entrada cheia, usuário inexistente, servidor não disponível no momento e etc. Bom, é complicado de entender, mas o funcionamento é perfeito, o resultado aqui foi incrível. :) []'s http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
formigoni 0 Denunciar post Postado Março 12, 2008 Olá, tá dando esses erros aqui: Warning: array_push() [function.array-push]: fisrt argument be an array ( linha 37 ) Warning: array_push() [function.array-push]: fisrt argument be an array ( linha 37 ) Warning: Invalid argument supplient for foreach() ( linha 61 ) fiz exatamente como você demontrou, mas deu esse pau do { $lista = array_push($lista, $row_grupos['email']); // essa é a linha 37 } while ($row_grupos = mysql_fetch_assoc($grupos)); foreach( $lista as $to ) // essa é a linha 61 { mail($to, $subject, $menssagem, $headers); } Tem como ajudar? Valeu Compartilhar este post Link para o post Compartilhar em outros sites
Paulo André 0 Denunciar post Postado Março 12, 2008 $lista = array(); Provavelmente você não incluiu esta linha acima. []'s Compartilhar este post Link para o post Compartilhar em outros sites
formigoni 0 Denunciar post Postado Março 12, 2008 Caramba, desculpa ai moçada, foi marcada minha, funcionou legal, mas preciso só de mais uma ajuda... ... como faço para gravar em meu banco de dados todos do e-mails enviados, tenho esse trecho no meu script // envio da mensagem foreach( $lista as $to ) { mail($to,$subject,$menssagem,$headers); } $sql = "insert into msg_enviadas ( data, horario, responsavel, assunto, msg_html, email_to, num_envios, num_falhas ) values ('$data1', '$horario', '$responsavel', '$subject', '$menssagem', '$to', '$num_envios', '$num_falhas' )"; $insere = mysql_query($sql); Só está gravando um e-mail e preciso de todos, se puderem me ajudar fecho isso. Valeu Compartilhar este post Link para o post Compartilhar em outros sites
Paulo André 0 Denunciar post Postado Março 12, 2008 Basta passar a query para dentro do foreach(), que é onde ocorre a iteração dos e-mails: <?php foreach( $lista as $to ) { mail($to,$subject,$menssagem,$headers); $sql = "INSERT INTO..."; $insere = mysql_query($sql); } ?> []'s Compartilhar este post Link para o post Compartilhar em outros sites
formigoni 0 Denunciar post Postado Março 12, 2008 Teria como gravar todos esses e-mail de uma vez no campo de minha tabela? no modo como ficou o foreach grava um registro individua para cada um. Assim, se tiver 10 e-mails gravar esses 10 e-mail no campo "email_to" de minha tabela... ... sei que já estou abusando, mas é que não consegui mesmo. Valeu. Compartilhar este post Link para o post Compartilhar em outros sites
Paulo André 0 Denunciar post Postado Março 12, 2008 Então volta para o que estava antes. :D Adicionando a linha do implode(): <?php foreach( $lista as $to ) { mail($to,$subject,$menssagem,$headers); } $to = implode(";", $to); $sql = "INSERT INTO..."; $insere = mysql_query($sql); ?> []'s Compartilhar este post Link para o post Compartilhar em outros sites
formigoni 0 Denunciar post Postado Março 12, 2008 Muito obrigado mesmo pelas dicas e paciência, valeu mesmo Fica na paz. Rapaz do céu, fuu gravar e deu um erro, veja: Warning: implode() [function:implode]: Bad arguments [linha 66] essa é a linha 66 $to = implode(";", $to); Bom dia pessoal. A solicitação de ajuda foi para fazer isso "Teria como gravar todos esses e-mail de uma vez no campo de minha tabela? no modo como ficou o foreach grava um registro individua para cada um. Assim, se tiver 10 e-mails gravar esses 10 e-mail no campo "email_to" de minha tabela... ... sei que já estou abusando, mas é que não consegui mesmo. Valeu." E deu esse erro aqui: Warning: implode() [function:implode]: Bad arguments [linha 66] Fiz isso aqui: // inicío do código CODE // inicilização da variável $lista = array(); // laço para buscar todos os componentes de determinado grupo do { array_push($lista, $row_grupos['email']); } while ($row_grupos = mysql_fetch_assoc($grupos)); // envio da mensagem CODE foreach( $lista as $to ) { mail($to,$subject,$menssagem,$headers); } $to = implode(";",$to); // o erro dá nessa linha $sql = "insert into msg_enviadas ( data, horario, responsavel, assunto, msg_html, email_to, num_envios, num_falhas ) values ('$data1', '$horario', '$responsavel', '$subject', '$menssagem', '$envios', '$num_envios', '$num_falhas' )"; $insere = mysql_query($sql); Mas agora grava os dados no banco mas não envia e-mail pra ninguém e dá aquela msg. Valeu moçada. Compartilhar este post Link para o post Compartilhar em outros sites
Paulo André 0 Denunciar post Postado Março 13, 2008 $to = implode(";", $lista); []'s Compartilhar este post Link para o post Compartilhar em outros sites
formigoni 0 Denunciar post Postado Março 13, 2008 Feras, Valeu pela grande ajuda... ... aprendi muita coisa com os meus erros (sic). Show. Compartilhar este post Link para o post Compartilhar em outros sites