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

Dkid

[resolvido] Kohana - Enviar email com anexo

Mensagens Recomendadas

Dkid

Boas, desculpem lá vir colocar uma dúvida quase igual à anterior, mas agora em Kohana em vez de Code Igniter.

O meu problema é que ainda não preenchi o formulário e já me aparece uma mensagem de erro a dizer que o ficheiro se encontra vazio.

Para ficar tudo esclarecido, a intenção é que o utilizador preencha os dados e envie um email para mim.

a mensagem de erro:

Swift_FileException

system/vendor/swift/Swift/File.php [63]:

No such file ''

o meu controlador:

<?php defined('SYSPATH') OR die('No direct access allowed.');

     class Contacto_Controller extends Controller {
     
          public function index() {
          
               /* declaracao da view */
               $view = new View('contacto_view');
               
               /* estrutura da pagina */
               $view->header  = new View('header');
               $view->breadc  = new View('breadcrumbs');
               $view->sidebar = new View('sidebar');
               $view->footer  = new View('footer');

               $view->render(TRUE);
               
               // swift connect method
               $swift = email::connect();
               
               //email
               $de       = $this->input->post('email');
               $assunto  = $this->input->post('assunto');
               $mensagem = $this->input->post('mensagem');
               $upload   = $this->input->post('upload');

               // lista de pessoas que vao receber email
               $destino = new Swift_RecipientList;
               $destino->addTo('o_meu_mail@gmail.com');
               
               //anexo
               $swfile = new Swift_File($upload);
               $anexo  = new Swift_Message_Attachment($swfile);
               $mensagem->attach($anexo);
                      
               if ($swift->send($mensagem, $destino, $de) ) {
                    echo 'works';
               }
               else {
                    echo 'not working';
               }
          }
     }
?>

a minha view

<div id="formulario">

                                   <?php print form::open_multipart(); ?>
                                        
                                        <p>
                                        <label for="nome">nome</label>
                                        <input type="text" name="nome" id="nome" required/></p>
                                        
                                        <p>
                                        <label for="email">email</label>
                                        <input type="text" name="email" id="email" required/></p>
                                   
                                        <label for="assunto">assunto</label>
                                        <select id="assunto">
                                             <option value="motivo">motivo</option>
                                             <option value="motivo">motivo</option>
                                             <option value="motivo">motivo</option>
                                        </select>

                                        <p> <label for="mensagem">mensagem</label></p>
                                        
                                        <p>
                                        <textarea name="mensagem" rows="8" cols="30" required></textarea></p>
                                        
                                        <p>
                                        <label for="upload">documento</label>
                                        <input type="file" id="upload" name="upload" size="30" value="" /></p>
                                        <input type="submit" id="enviar" name="enviar" value="Enviar!" />
                                        
                                   </form>
                                   
                              </div>

Obrigado pela vossa atenção.


I promise that I will not change the PATH variable again other than:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mAiN_iNfEcTiOn

Assim de repente... =/ nao tem nada a ver... ele não está a fazer o attachment porque o ficheiro não vem no post... =/

Convinha também validares o ficheiro:

Isto vai criar um sistema de validação para o array $_FILES

$_FILES = Validation::factory($_FILES)
                ->add_rules('upload', 'upload::valid', 'upload::type[pdf,doc,jpg,jpeg,gif,png,xls]', 'upload::size[12M]');

if($_FILES->validate())
{
    # Está válido, vamos fazer o upload para uma pasta, enviar o e-mail e apagar o ficheiro.
    # Por defeito, o ficheiro é gravado no directório definido no ficheiro 'system/config/upload.php'
    # O nome do ficheiro também é gerado por defeito
    # Se pretenderes alterar a configuração por defeito, fazes:
    #          upload::save('nomeDoObjectoDoForm','novoNomeDoFicheiro','novoDirectório');

    # Neste caso vou supor que o directório por defeito existe.

    $filename = upload::save('upload');
    
    # !!! Colocas depois o teu código do Swift aqui !!!
    # No entanto, onde tens:
    #         $swfile = new Swift_File($upload);
    # Fica:
    #         $swfile = new Swift_File($filename);
    #
    # E onde tens:
    #         if ($swift->send($message, $recipients, $from))
    #        {
    #           // Success
    #        }
    #
    # Fica:
    #         if ($swift->send($message, $recipients, $from))
    #        {
    #           unlink($filename); # Elimina o ficheiro
    #        }
    #
}

Testa assim ;)

Claro, deves mudar a validação de acordo com o que pretendes... e eu não estou a fazer o error handling, isto é... se der erro tens que colocar um else e ir obter os erros do $_FILES, através do $_FILES->errors();

Abraço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dkid

Boas, desculpem a demora a responder, estou a ver se consigo resolver o problema.

O problema de mostrar o erro assim que a pagina inicia já ficou resolvido.

Mas agora acontecem-me duas situações que não estou a conseguir resolver.

E já agora, é possivel também passar o campo nome pelo mail ? não vejo documentação para realizar isso.

1ª situação: a pessoa não envia anexo e aparece a mensagem de erro que não existe ficheiro.

2ª situacao: a pessoa envia anexo, e este até vai para a pasta de upload, mas depois aparece-me outra mensagem de erro:

Fatal error: Call to a member function attach() on a non-object in application/controllers/contacto.php on line 52

Essa linha corresponde ao anexo :

//anexo

$swfile = new Swift_File($filename);

$anexo = new Swift_Message_Attachment($swfile);

$mensagem->attach($anexo);

O controlador :

<?php defined('SYSPATH') OR die('No direct access allowed.');

    class Contacto_Controller extends Controller {

         public function index() {

              /* declaracao da view */
              $view = new View('contacto_view');

              /* estrutura da pagina */
              $view->header  = new View('header');
              $view->breadc  = new View('breadcrumbs');
              $view->sidebar = new View('sidebar');
              $view->footer  = new View('footer');



              $view->render(TRUE);

              // swift connect method
              $swift = email::connect();

              //email
              $de       = $this->input->post('email');
              $assunto  = $this->input->post('assunto');
              $mensagem = $this->input->post('mensagem');

              // verificar se existe um anexo
              $_FILES = Validation::factory($_FILES)
                   ->add_rules('upload', 'upload::valid', 'upload::type[pdf,doc,docx,txt,jpg,jpeg,png,gif,xls,ppt,pptx,odt,psd]', 'upload::size[10M]');

              if (!$_FILES) { //sem ficheiros
                   $destino = new Swift_RecipientList;
                   $destino->addTo('hey@gmail.com');

                   if ( $swift->send($mensagem, $destino, $de) ) {
                        echo 'power';
                   }
                   else { echo 'power not'; }
              }

              if ($_FILES->validate() ) {
                        /*   o ficheiro é gravado no directorio '/upload'
                             para alterar:
                             upload::save('nomeDoObjectoDoForm','novoNomeDoFicheiro','novoDirectório');
                        */
                   $filename = upload::save('upload');

                   //anexo
                   $swfile = new Swift_File($filename);
                   $anexo  = new Swift_Message_Attachment($swfile);
                   $mensagem->attach($anexo);

                   // lista de pessoas que vao receber email
                   $destino = new Swift_RecipientList;
                   $destino->addTo('_o_meu_mail@gmail.com');

                   if ($swift->send($mensagem, $destino, $de) ) {
                        echo 'works';
                        unlink($filename); // elimina o ficheiro
                   }
                   else {
                        echo 'not working';
                        unlink($filename);
                   }
              }

              $swift->disconnect();
         }
    }
?>

Editado por Dkid

I promise that I will not change the PATH variable again other than:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mAiN_iNfEcTiOn

=) Bacano, vamos analisar o erro:

Fatal error: Call to a member function attach() on a non-object in application/controllers/contacto.php on line 52

Isto diz-nos que estás a chamar um método - attach() - numa variável que não é um objecto - non-object

Ora segundo a linha que destacaste, essa variável é a $mensagem .... Se subires um pouco no código vais ver que:

$mensagem = $this->input->post('mensagem');

Provavelmente o que precisarás é de criar um objecto do tipo Swift_Message. Eis o exemplo do site da framework:

// Use connect() method to load Swiftmailer and connect using the parameters set in the email config file
$swift = email::connect();

// From, subject and HTML message
$from = 'from@example.com';
$subject = 'Backup: ' . date("d/m/Y");
$message = 'This is the <b>backup</b> for ' . date("d/m/Y");

// Build recipient lists
$recipients = new Swift_RecipientList;
$recipients->addTo('to1@example.com');
$recipients->addTo('to2@example.com');

// Build the HTML message
$message = new Swift_Message($subject, $message, "text/html");

// Attachment
$swiftfile = new Swift_File('/backups/dump-' . date("d-m-Y") . '.tar.gz');
$attachment = new Swift_Message_Attachment($swiftfile);
$message->attach($attachment);

if ($swift->send($message, $recipients, $from))
{
  // Success
}
else
{
  // Failure
}

// Disconnect
$swift->disconnect();

Se reparares, existe a linha:

$message = new Swift_Message($subject, $message, "text/html");

O que TU podes fazer é, aproveitar a tua variável $mensagem para o fazer... Ou seja, podes corrigir o teu código acrescentando uma linha.

Assim, antes desta linha

if (!$_FILES) { //sem ficheiros

Acrescentas esta:

$mensagem = new Swift_Message($assunto, $mensagem, "text/html");

Tenta agora depois das alterações acima definidas ;):D

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dkid

Boas,

Isso é que foi uma grande falha minha, não tinha reparado na documentação nessa linha.

Já consigo enviar emails, no entanto se envio anexo não vem a mensagem nem assunto, se envio sem anexo ainda recebo um erro.

Mas isso vou tentar resolver agora, la para a noite senão conseguir volto a pedir ajuda.

E mais uma vez obrigado pela vossa ajuda.


I promise that I will not change the PATH variable again other than:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dkid

Boas, finalmente consegui!

Desisti no swiftmailer, e adoptei o phpmailer.

Tirei algumas validações, mas paciencia, já envia mails.

<?php defined('SYSPATH') OR die('No direct access allowed.');

require_once('class.phpmailer.php');

     class Contacto_Controller extends Controller {
     
          public function index() {
          
               /* declaracao da view */
               $view = new View('contacto_view');
               
               /* estrutura da pagina */
               $view->header  = new View('header');
               $view->breadc  = new View('breadcrumbs');
               $view->sidebar = new View('sidebar');
               $view->footer  = new View('footer');

               $view->render(TRUE);
               
               //email
               $nome     = $this->input->post('nome');
               $email    = $this->input->post('email');
               $assunto  = $this->input->post('assunto');
               $mensagem = $this->input->post('mensagem');

               $mail = new PHPMailer(true); 
               

               if (isset($email)) {
               
                    try {
                    

                         $mail->AddReplyTo($email,$nome);

                         $mail->AddAddress('mail@mail.com', 'nome');

                         $mail->SetFrom($email,$nome);

                         $mail->Subject = $assunto;

                         $mail->MsgHTML($mensagem);


                         $ficheiro = upload::save('upload');
                         $mail->AddAttachment($ficheiro); 


                         $mail->Send();

                         echo "<p>Message Sent OK</p>\n";

                    } 
                    catch (phpmailerException $e) {

                         echo $e->errorMessage(); //Pretty error messages from PHPMailer

                    } 
                    catch (Exception $e) {

                         echo $e->getMessage(); //Boring error messages from anything else!

                    }
               
               }
          }
     }
?>


I promise that I will not change the PATH variable again other than:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mAiN_iNfEcTiOn

Bem tu la sabes :P :P

Na minha óptica, o SWIFT Mailer é tão bom ou melhor que o PHPmailer :) tem vários objectos, mas torna-se bastante potente quando se utiliza o "motor" de e-mail ao máximo.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dkid

O problema é que eu não estava a alinhar com o SWIFT Mailer. Acredito no que dizes, talvez o swift até seja mais pequeno, mas como podes ver pela quantidade de perguntas e tentativas neste topico (sem contar com as dezenas de tentativas e pinos que fiz) não tive grande sucesso com ele.

Mais uma vez, obrigado por toda a ajuda.


I promise that I will not change the PATH variable again other than:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mAiN_iNfEcTiOn

Acho que o mal do Swift Mailer na Kohana é o facto de estar desactualizado... :) A versão actual é bem melhor

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.