Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Dkid

[resolvido] Kohana - Enviar email com anexo

Recommended Posts

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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();
         }
    }
?>

Edited by 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.