Tylër 0 Denunciar post Postado Agosto 10, 2010 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
lucaswxp 22 Denunciar post Postado Agosto 10, 2010 Dá um pr() no $mailsNewsletter Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Agosto 10, 2010 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
lucaswxp 22 Denunciar post Postado Agosto 10, 2010 $this->Email->replyTo = $to; # responder para o remetente O $to é deve ser string, e você está passando array. Dá uma olhada nisso. Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Agosto 11, 2010 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
lucaswxp 22 Denunciar post Postado Agosto 11, 2010 Você pode passar array para EmailComponent::$to, mas para EmailComponent::$replyTo não. Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Agosto 15, 2010 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
lucasvocals 0 Denunciar post Postado Agosto 16, 2010 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
Tylër 0 Denunciar post Postado Agosto 17, 2010 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
Tylër 0 Denunciar post Postado Agosto 29, 2010 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é.. up, isso não tá resolvido não hein! <_< Compartilhar este post Link para o post Compartilhar em outros sites
Taffarelo3 0 Denunciar post Postado Setembro 1, 2010 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
Tylër 0 Denunciar post Postado Setembro 1, 2010 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
Taffarelo3 0 Denunciar post Postado Setembro 1, 2010 bom aqui eu posso enviar 1000 email's para diferentes contatos que envia todos, um por um, bom espero que você consiga achar uma solução =D Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Setembro 1, 2010 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
Taffarelo3 0 Denunciar post Postado Setembro 1, 2010 Opa! Qualquer manda um email ou PM Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Setembro 7, 2010 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
Tylër 0 Denunciar post Postado Setembro 7, 2010 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