Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tylër

[Resolvido]  Email em massa, como enviar?

Recommended Posts

Como envio email em massa usando o método nativo do cakePHP, o send ($msg) ?

É claro, recebendo os e-mails em forma de lista do banco de dados...

Aguardo contato.

 

Sempre tento:

 

# Listando contatos do newsletter
 	$fields = array( 'name', 'mail' );
 	$conditions = array( 'Newsletter.id', 'status'=>1 );
 	
 	$mailsNewsletter = $this->Newsletter->find( 'list', array( 'fields'=>$fields, 'conditions'=>$conditions ) );
 	$this->set( 'listMail', $mailsNewsletter );

....


# Configuracoes para enviar como Newsletter
 	$from = 'naoresponda@meusite.com';
 	$to = $mailsNewsletter; // olha abaixo o erro que retorna (lógico né)


...
$this->Email->from = $from;
 	$this->Email->subject = $subject;
 	$this->Email->replyTo = $to; # responder para o remetente
 	$this->Email->to = $to;

 

Notice (8): Array to string conversion [CORE/cake/libs/controller/components/email.php, line 663]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu já havia tentado isso:

 

Mudo de 'lists' para 'all' e retorna:

 

Array
(
 [0] => Array
 (
 [Newsletter] => Array
 (
 [name] => Tylër Vortex
 [mail] => ****@*****
 )

 )

 [1] => Array
 (
 [Newsletter] => Array
 (
 [name] => Tylër Vortex
 [mail] => ******@rg.com.br
 )

 )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, então como devo enviar newsletter em cakePHP então? Pois é passando um array a única solução, eu acho...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eh, não tá enviando =/

 

$this->Email->from = $from;
 	$this->Email->subject = $subject;
 	$this->Email->replyTo = $from; # responder para o remetente
 	$this->Email->to = $to;
 	$this->Email->sendAs = 'html'; // html, text, both

Assim não foi =/

 

Ninguém sabe? =/

 

Bom, já que ninguém sabe, vou esclarecer melhor, para que possamos resolver isto e disponibilizar este exemplo aqui no fórum para todos:

 

Criei um novo controller e um novo model para este exemplo (sendmails_controller.php)

Dentro dele se encontra o código:

 

var $uses = array( 'Sendmail', 'Newsletter' );
var $component = array( 'Email' );

Onde Newsletter é o model responsável pela tabela de e-mails cadastrados no sistema.

 

function sends() {

 # Listando contatos do newsletter
 $fields = array( 'name', 'mail' );
 $conditions = array( 'Newsletter.id', 'status'=>1 );

 $nlt = $this->Newsletter->find( 'all', array( 'fields'=>$fields, 'conditions'=>$conditions ) );
 $this->set( 'listMail', $nlt );
Onde $conditions = array( 'Newsletter.id', 'status'=>1 ); seleciona apenas os e-mails de status 1

 

Até aí, se eu der um pr(), me retorna:

pr( $nlt ); exit;

Array
(
 [0] => Array
 (
 [Newsletter] => Array
 (
 [name] => Tylër Vortex
 [mail] => mail@servidor.net
 )

 )

 [1] => Array
 (
 [Newsletter] => Array
 (
 [name] => Tylër Vortex
 [mail] => outro@servidor.net
 )

 )

)

Retiro o pr() e prossigo na tentativa de enviar desta forma:

 

# Configuracoes para enviar como Newsletter
 $from = 'naoresponda@meuservidor.net';
 $to = array( 'meuemail@meuservidor.net', 'outroemail@outroservidor.net' );
E então eu tento add $nlt['Newsletter']['mail'] em $to, ficando:

$to = $nlt['Newsletter']['mail']
mas acho que isto não vai dar certo =/

 

Bom, pulando algumas linhas e indo pra decisão:

 

$this->Email->from = $from;
 $this->Email->subject = $subject;
 $this->Email->replyTo = $from; # responder para o remetente
 $this->Email->to = $to;

O resultado final é:

 

Notice (8): Undefined index: Newsletter [APP/controllers/sendmails_controller.php, line 23]
Linha 23: $to = $nlt['Newsletter']['mail'];

 

* Os e-mails que eu citei são fictícios, e é lógico que em meu exemplo eu utilizei e-mails reais.

 

Espero que com esta explicação, possamos resolver este problema.

Abraços e obrigado pelo espaço para publicar esta dúvida!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provavelmente ele dá esse warning pq no seu código você diz pra ele pegar $ntl['newsletter']['mail'] que equivale a um registro. e no seu array de exemplo tem dois registros. Aí ele não sabe qual pegar e diz que não tem um registro definido.

 

Pra mandar pra todos, você tem que passar o array inteiro de emails, acho que somente os endereços de email...

 

Mas não sei..

 

você pode tentar isso que eu falei, ou pode simplesmente ignorar esse comentário pq eu não faço a mínima ideia doq estou falando. IAUEHIAEU

 

 

=(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá, não ajudou, mas só quero saber uma coisa: se não cheguei nem perto, quem foi que intitulou o tópico como resolvido? Oo

 

Descobri alguma coisa:

http://book.cakephp.org/view/270/Class-Attributes-and-Variables

 

... que para enviar e-mails em loop, será preciso utilizar o método reset()

$this->Email->reset()
Só não sei como utilizá-lo em meu problema... =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, já que não consegui utilizando cakePHP, é o jeito usar mail() <_<

 

function add() {

 	$ptype = array( 'posts'=>'Post normal', 'news'=>'Destaques' );
 	$this->set( 'ptype', $ptype );

 	# Listando contatos do newsletter
 	$fields = array( 'name', 'mail' );
 	$conditions = array( 'Newsletter.id', 'status'=>1 );
 	
 	$nlts = $this->Newsletter->find( 'all', array( 'fields'=>$fields, 'conditions'=>$conditions ) );
 	$this->set( 'nlts', $nlts );

 	if( !empty($this->data) ) {

 	# Create the url title slug - ( configuracao no app_controller.php )
 	$this->data['Post']['slug'] = $this->stringToSlug($this->data['Post']['title']);
 	$this->data['Post']['photo'] = '';
 	
 	if( $this->Post->save( $this->data ) ) {

 	# Agora configuracoes para o upload da imagem de destaque
 	$path = '../../../files;
 	
 	$id = $this->Post->id;
 	$data = $this->Post->findById($id);

 	$title = $data['Post']['title'];
 	$slug = $data['Post']['slug'];
 	$body = $data['Post']['body'];
 	$photo = $data['Post']['photo'];

 	$novo_dir = $path.'/'.$id;
 	$nome_novo = date( 'HisYmd' );

 	# Se houver uma foto, mando para o componente
 	if( $this->data['Post']['fotodestaque']['name'] )
 	{
 	$this->UpImage->photos( $this->data['Post']['fotodestaque'] );

 	# Envia o conteudo do field para o componente
 	$result = $this->UpImage->resize_save( 250, $novo_dir, $nome_novo );
 	# Salva a imagem no BD
 	$this->Post->saveField( 'photo', $result );
 	}

 	# Configuracoes para enviar como Newsletter
 	$from = 'naoresponda@'.$_SERVER['SERVER_NAME'];
 	foreach ( $nlts as $nlt )
 	{
 	$to = $nlt['Newsletter']['name'].'<'.$nlt['Newsletter']['mail'].'>';
 	$site = htmlspecialchars_decode( utf8_decode( $title ) );
 	$subject = $site;

 	$urlSite = 'http://'.$_SERVER['SERVER_NAME'];
 	$dirSite = 'ts';
 	$urlNl = $urlSite.'/'.$dirSite.'/posts/view/'.$slug;

 	$message = '<p>Este post se encontra em:
<a href="'.$urlNl.'">'.$urlNl.'</a></p>';
 	$message.= '<h2>'.$title.'</h2>';
 	$message.= '<p><img src="'.$urlSite.'/files/'.$id.'/'.$result.'" alt="'.$title.'" title="'.$title.'" /></p>';
 	$message.= $body;
 	
 	# To send HTML mail, the Content-type header must be set
 	$headers = 'MIME-Version: 1.0' . "\r\n";
 	$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";

 	# Additional headers
 	$headers .= 'To: '. $to . "\r\n";
 	$headers .= htmlspecialchars_decode( utf8_decode( 'From: '.$from.' <'.$from.'>' ) ) . "\r\n";
 	//$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
 	//$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";
 	
 	$result = mail( $to, $subject, $message, $headers );

 	}
 	
 	if ( $result == false ) {
 	$this->Session->setFlash( 'Erro ao enviar para assinantes!', 'default', array( 'class'=>'flash_bad' ) );
 	} else {
 	$this->Session->setFlash( 'O post foi salvo!', 'default', array( 'class'=>'flash_good' ) );
 	}
 	
 	$this->redirect( '/posts/' );

 	}

 	}

	}

Mas a imagem de destaque não é visualizada na maioria dos servidores de e-mails <_<

Só no do meu site, que consegui visualizar.... =/

Peguei o código-fonte da página e vi que o caminho completo não aparecia na maioria dos e-mails, só no meu mesmo =/

 

Alguém que saiba algum método melhor para enviar esse tipo de e-mail bem que poderia ajudar né.. Imagem Postada

up, isso não tá resolvido não hein! <_<

Compartilhar este post


Link para o post
Compartilhar em outros sites

se pelo q eu entendi você quer fazer um email marketing? se for eu fiz um para um app que fiz aqui no trampo, bom eu vou passar parte do código ai vcs analisem e vejam se prossegue, aqui no trabalho essa função atende 100% das expectativas e claro há muito o que melhorar essa função.

 

 

function email(){
            // faz um select de todos os contatos com o id de sessão de cliente.
            $contato = $this->Cliente->Contato->find('all', array('conditions'=> array('Contato.cliente_id'=> $this>Session>read('Cliente.id'))));
            // percorre a array
            foreach($contato as $id){
                //na view eu usei checkbox para selecionar quais contatos eu quero enviar, um pra muitos, dai eu usei esse if para pegar somente os selecionados
                if($this->data['Cliente'][$id['Contato']['id']] == 1){
                  //verifica a sessão com o nome do usuario logado com os dados de nome e sobrenome da pessoa e email formatando da seguinte maneira, FULANO DE TAL <fulano@email.com>
                    $this->Email->from = $this->Session->read('Usuario.nome').' '.$this->Session->read('Usuario.sobrenome').'<'.$this->Session->read('Usuario.email').'>';
                    // envio para o email do contato;
                    $this->Email->to = $id['Contato']['email'];
                    //escrevo na sessao o nome do contato para usar no layout do email
                    $this->Session->write('Contato.nome', $id['Contato']['nome']);
                    //assunto do email vem da view
                    $this->Email->subject = $this->data['Cliente']['assunto'];
                     //opcao de enviar o email pelo protocolo smtp do host. obs nao uso servidor de email =/
                    $this->Email->smtpOptions = array(
                                                    'port' => '25', 
                                                    'timeout' => '120',
                                                    'host' => 'smtp.seuhost.com.br',
                                                    'username' => $this->Session->read('Usuario.email'),
                                                    'password' => 'suasenha');
                     //envio como smtp
                    $this->Email->delivery = 'smtp';
                     //uso o template apresentação e se encontra na pasta de elements, na documentação pode ser verificar com mais prescisão a criação das pastas
                    $this->Email->template = 'apresentacao';
                    //envio como o formato html
                    $this->Email->sendAs = 'html';
                    //envio a messagem
                    $this->Email->send();
                    //limpo tudo para começar de novo pelo foreach
                    $this->Email->reset();

                }
            }
            // quando acabar redireciona para o link desejado
            $this->redirect(array('controller'=>'clientes', 'action'=>'ver', $this->Session->read('Cliente.id').'#emailMKT'));
           
        }

bom espero que isso ajude

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, interessante, mas eu já tentei isto!

No meu modo foi assim:

$this->Email->send( $msg );
$this->Email->reset();
E não dava certo....

Eu pegava os dados por pr(), vinha um array, mas depois do reset() zerava o array, e mostrava um warning no reset()

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já encontrei uma solução com mail().... (by: kakaroto development) :)

 

So que se a gente começa a programar com cake, então tem que ser em cake!

Mas que fique seu code para outros!

Sou muito grato, depois vou testá-lo em minha app sem dúvidas! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me digam:

É correto enviar o newsletter logo após cadastrar o post?

 

É o que estou fazendo, e por isso, a página de cadastro fica super lenta <_<

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, @Taffarelo3, consegui utilizar seu método... vlw mesmo! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Fiz sem o SMTP e não cai na lixeira nem do Hotmail e muito menos do GMail!!!

 

Bom, mas é como falei, enviar newsletter após cadastrar o tópico pesa a página de cadastro <_<

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.