PHP é à quinta-feira – Envio de Email Simples com Anexo

24 Comentários

Boas,

A nível de direitos sobre o código, devo remeter-vos para o meu primeiro artigo desta rubrica.

Como tinha falado, cá está a função para enviar anexos num email, se necessário.


<?php

function sendEmail($name, $email, $to_mail, $subject, $msg, $attachment = “”) {

$sending = false;

if (!empty($attachment[‘tmp_name’]) && !empty($attachment[‘error’])) $attachment[‘tmp_name’] = “”;

if (!empty($name) && !empty($email) && !empty($to_mail) && !empty($subject) && !empty($msg)) {

$from_name = $name;

$from_mail = $email;

$sending = true;

}

if ($sending) {

$eol = “\n”;

$tosend[‘email’] = $to_mail;

$tosend[‘subject’] = $subject;

$tosend[‘message’] = ”

<!DOCTYPE html PUBLIC \”-//W3C//DTD XHTML 1.0 Transitional//EN\” \”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\”>

<html>

<head>

<meta http-equiv=\”Content-Type\” content=\”text/html; charset=utf-8\”>

<title>”.$subject.”</title>

</head>

<body>

“.$msg.”<br />

</body>

</html>

“.$eol.$eol;

$tosend[‘headers’] = “From: \””.$from_name.”\” <“.$from_mail.”>”.$eol;

$tosend[‘headers’] .= “Return-path: <“.$from_mail.”>”.$eol;

$tosend[‘headers’] .= “MIME-Version: 1.0”.$eol;

if (!empty($attachment[‘tmp_name’])) {

$file = $attachment[‘tmp_name’];

$content = file_get_contents($file);

$content = chunk_split(base64_encode($content));

$uid = md5(uniqid(time()));

$f_name = $attachment[‘name’];

$tosend[‘headers’] .= “Content-Type: multipart/mixed; boundary=\”PHP-mixed-“.$uid.”\””.$eol.$eol;

$tosend[‘headers’] .= “This is a multi-part message in MIME format.”.$eol;

$tosend[‘headers’] .= “–PHP-mixed-“.$uid.””.$eol;

$tosend[‘headers’] .= “Content-Type: multipart/alternative; boundary=\”PHP-alt-“.$uid.”\””.$eol.$eol;

$tosend[‘headers’] .= “–PHP-alt-“.$uid.””.$eol;

$tosend[‘headers’] .= “Content-type: text/html; charset=utf-8”.$eol;

$tosend[‘headers’] .= “Content-Transfer-Encoding: 7bit”.$eol.$eol;

$tosend[‘headers’] .= $tosend[‘message’].””.$eol.$eol;

$tosend[‘headers’] .= “–PHP-alt-“.$uid.”–“.$eol;

$tosend[‘headers’] .= “–PHP-mixed-“.$uid.””.$eol;

$tosend[‘headers’] .= “Content-Type: application/octet-stream; name=\””.$f_name.”\””.$eol; // use diff. types here

$tosend[‘headers’] .= “Content-Transfer-Encoding: base64”.$eol;

$tosend[‘headers’] .= “Content-Disposition: attachment; filename=\””.$f_name.”\””.$eol.$eol;

$tosend[‘headers’] .= $content.””.$eol.$eol;

$tosend[‘headers’] .= “–PHP-mixed-“.$uid.”–“;

$tosend[‘message’] = “”;//– The message is already in the headers.

}

if (mail($tosend[‘email’], $tosend[‘subject’], $tosend[‘message’] , $tosend[‘headers’]))

return true;

else

return false;

}//– if ($sending)

return false;

}

?>

Modo de utilização:

É bastante simples e intuitivo. Segue um exemplo com um ficheiro que acabo de submeter (não do servidor directamente):

<?php

$msg = ”

Olá, visita o <a href=”http://www.pplware.com/”>http://www.pplware.com/</a>!! É fantástico!!!

“;

if (sendEmail(“Nome Origem”, “email@origem.com”, “email@destino.com”, “Assunto”, $msg, $_FILES[‘ficheiro’])) {

echo “Email enviado”;

} else {

echo “Email não enviado”;

}

?>

Para qualquer dúvida ou sugestão, estão completamente à vontade.

Comentários

24

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de aospapeis.blogspot.com

    Em ColdFusion seria, simplesmente:

    :))

    1. Avatar de Bruno Bernardino

      Pois, mas não tens muito controlo sobre os headers, se quiseres fazer algo mais personalizado.

      No entanto, se tens programas para enviar, podes enviar para o pplware, geral[at]pplware.com 😉

  2. Avatar de aospapeis.blogspot.com

    Oh pá, como é que se mete código aqui? Eu, todo lampeiro a escrever três linhas e, no fim, não fica nada!

    1. Avatar de Gilberto Pereira
      Gilberto Pereira

      Código não pode ser como é obvio, mas já agora metes uma imagem com os comandos?

      Obrigado.

      1. Avatar de aospapeis.blogspot.com

        Faço melhor, deixo aqui um link. Pasmem-se com a “limpeza” e facilidade do código:

        http://www.quackit.com/coldfusion/tutorial/coldfusion_mail.cfm

  3. Avatar de Oliveira
    Oliveira

    Boas,

    nice tut, mas gostava de saber como adiciono a Hora e Data?
    Dava jeito de vez em quando =P

    Cumps

  4. Avatar de Nuno Amaral
    Nuno Amaral

    Bom artigo. Pode dar jeito no futuro.

    http://www.cidadeviseu.com

  5. Avatar de tagravado.com

    com anexos fora do joomla ainda não sabia fazer por acaso, obrigado pelo tutorial

    http://www.tagravado.com

  6. Avatar de Nunojfg
    Nunojfg

    Lembro-me que xeguei a precisar de uma função sendmail para um projecto na faculdade, tentamos PHP, mas como normalmente é mais confuso em termos de código, optamos pela solução em Java. Mas o maior problema quando se quer fazer esse tipo de aplicação de envio de email, nem é o codigo, mas sim conseguir um servidor de jeito. Obviamente tivemos de usar um da faculdade.

  7. Avatar de Dr. Estagiário

    PHPMailer também parece-me bem

  8. Avatar de delaorden9.com

    Belo tuto Bruno, alto nível, como sempre…

    keep it up ! 😀

    carlos rajas

  9. Avatar de sampaio
    sampaio

    existe algum servidor gratuito de php e sql, em que eu consiga através deste codigo enviar um email?

    1. Avatar de aospapeis.blogspot.com

      É só procurares… mas, essa junção de “sql + email”… isso cheira-me a SPAM!!!

      1. Avatar de sampaio
        sampaio

        Ou nao, por exemplo tens um site de gestao de uma biblioteca e queres enviar um email para todos os utilizadores, que estao registados numa base de dados(sql), a dizer quais os novos livros que chegaram a biblioteca, isto nao e SPAM. eu queria um servidor gratuito onde pudesse fazer isso.

    2. Avatar de Filipe

      Viva,

      http://www.000webhost.com

      este site é free. Tem mysql e php e muito mais, tudo de borla.

      cumps

  10. Avatar de @RicardoGoulart [Twitter]
    @RicardoGoulart [Twitter]

    Basico com o PHPmailer:
    -> Script desenvolvido por mim com muita dor de cabeça

    ######################################
    # Script Developed by Ricardo Goulart
    # 12-01-2008
    ######################################

    require(“phpmailer/class.phpmailer.php”);

    $mail = new PHPMailer();
    $mail->IsSMTP(); // set mailer to use SMTP

    $mail->Host = “mail.********.com”; // specify main and backup server
    $mail->SMTPAuth = true; // turn on SMTP authentication
    $mail->Username = “no-reply@*********.com”; // SMTP username
    $mail->Password = “********”; // SMTP password

    $mail->From = “no-reply@*********.com”;
    $mail->FromName = $_POST[‘nome’];
    $mail->Subject = “Inscrição de Formando via site www.**********.com ” ;
    $mail->AddBCC(“meuEmail@aqui”);
    $mail->AddCC(“geral@*********.com”);
    $mail->IsHTML(true);
    $mail->AddAttachment($_FILES[‘biAnexo’][‘tmp_name’], $_FILES[‘biAnexo’][‘name’]);
    $mail->AddAttachment($_FILES[‘CVAnexo’][‘tmp_name’], $_FILES[‘biAnexo’][‘name’]);

    $mens=”Nome: “.$_REQUEST[‘nome’].””;
    $mens.=”Naturalidade: “.$_REQUEST[‘naturalidade’].””;
    $mens.=”Nacionalidade: “.$_REQUEST[‘nacionalidade’].””;
    $mens.=”Data de Nascimento: “.$_REQUEST[‘dnascimento’].””;
    $mens.=”Número de BI: “.$_REQUEST[‘nbi’];
    $mens.=” Validade: “.$_REQUEST[‘vbi’].””;
    $mens.=”Arquivo de Identificação: “.$_REQUEST[‘arqid’].””;
    $mens.=”Estado Civil: “.$_REQUEST[‘estado’].””;
    $mens.=”NIF: “.$_REQUEST[‘nif’].””;
    $mens.=”Endereço: “.$_REQUEST[‘endereco’].””;
    $mens.=”Código Postal: “.$_REQUEST[‘cp’].””;
    $mens.=”Freguesia: “.$_REQUEST[‘freguesia’].””;
    $mens.=”Concelho: “.$_REQUEST[‘concelho’].””;
    $mens.=”Distrito: “.$_REQUEST[‘distrito’].””;
    $mens.=”Situação de Emprego: “.$_REQUEST[‘emprego’].””;
    $mens.=”Situação de Emprego: “.$_REQUEST[‘emprego2’].””;
    $mens.=”Habilitações Literárias: “.$_REQUEST[‘habilitacoes1’];
    $mens.=” Completo? : “.$_REQUEST[‘completo’];
    $mens.=” Outro: “.$_REQUEST[‘habilitacoes2’].””;
    $mens.=”NIB: “.$_REQUEST[‘NIB’];
    $mens.=”Banco: “.$_REQUEST[‘banco’].””;
    $mens.=”Qual a acção de formação que pretende frequentar?: “.$_REQUEST[‘areasformacao’].””;
    $mens.=”Autoriza que os seus dados sejam utilizados para envio de publicidade de futuras acções de formação?: “.$_REQUEST[‘pub’].””;

    $mens.=”Data: “.date(‘d-m-Y’).””;
    $mens.=”Hora: “.date(‘H:m:s’).””;

    $mail->Body = $mens;

    if($mail->Send()){
    echo ‘alert(“A sua mensagem foi enviada com sucesso!Agradecemos o seu contacto!”);’;
    }
    else
    {
    echo ‘alert(“Ocorreu um erro ao enviar a mensagem! Por favor, envie um e-mail para sadomilenio@netcabo.pt a reportar a situação! Obrigado!”);’;
    }

    1. Avatar de Bruno Bernardino

      Obrigado pela contribuição 🙂

  11. Avatar de Tiago Coelho
    Tiago Coelho

    Já tentei os dois sistemas, o “mail()” e o “class.phpmailer.php” mas não consigo enviar nenhum email com os exemplos dados….será que numa próxima rubrica poderiam explicar que configurações são necessárias no servidor para que o serviço de email funcione correctamente?

    Abraço e continuação de bom trabalho

    1. Avatar de Bruno Bernardino

      Olá Tiago.

      Isso depende de muitas variáveis.

      Coloca a tua questão no fórum, indicando o sistema operativo, versão, qual o programa de mailing, se tens acesso “root” ou Administrativo à máquina em questão, e qual erro te aparece, se algum.

    2. Avatar de Tiago Coelho
      Tiago Coelho

      O meu sistema operativo é o WindowsXP no qual eu sou o administrador,
      e o gestor de servidor é o WampServer. Configurei o php.ini da seguinte forma:

      [mail function]
      ; For Win32 only.
      ; http://php.net/smtp
      SMTP = smtp.gmail.com
      ; http://php.net/smtp-port
      smtp_port = 25

      ; For Win32 only.
      ; http://php.net/sendmail-from
      sendmail_from = meu_email@gmail.com

      ; For Unix only. You may supply arguments as well

      (default: “sendmail -t -i”).
      ; http://php.net/sendmail-path
      ;sendmail_path =

      o meu ficheiro index.php tem o seguinte:

      IsSMTP();
      $mail->SMTPAuth = true;
      $mail->SMTPSecure = “ssl”;
      $mail->Host = “smtp.gmail.com”;
      $mail->Port = 465;

      $mail->Username = “meu_mail@gmail.com”;
      $mail->Password = “*****”;

      $mail->From = “meu_mail@gmail.com”;
      $mail->FromName = “Tiago Coelho”;

      $mail->Subject = “Teste de envio de mail”;

      $html = “Olá PHPMailer!“;
      $texto = “Olá PHPMailer!”;

      $mail->Body = $html;
      $mail->AltBody = $texto;

      $mail->AddAddress(“meu_mail@gmail.com”, “Pixo”);

      if(!$mail->Send()){
      echo “não foi possivel enviar o email. Erro: “.$mail->ErrorInfo.””;
      }
      else{
      echo ‘mensagem enviada com sucesso’;
      }
      ?>

      o erro que me dá é o seguinte:

      SMTP Error: Could not connect to SMTP host.
      não foi possivel enviar o email. Erro: SMTP Error: Could not connect to SMTP host.

      O que estarei eu a fazer mal??

      1. Avatar de Bruno Bernardino

        Tiago, vou-te responder uma última vez aqui, depois disso só se colocares a tua dúvida no fórum. É ridículo com uma secção própria para esclarecer dúvidas andar a colocar aqui essa informação e a enviar mails a pessoal a quem isto nada interessa.

        Com o que deixaste não vi qualquer problema, pelo que penso que poderá estar noutra zona do teu ficheiro index.php, não vi qualquer declaração da variável $mail, mas deduzo que tenhas para cima $mail = new PHPMailer(); ou algo do género.

  12. Avatar de Filipe

    Olá

    tens que instalar um servidor smtp no pc onde está instalado o wamp. O proprio servidor smtp do windows funciona perfeitamente.

    cumps

  13. Avatar de 7ilipe
    7ilipe

    Já ninguém usa a função mail do php!

    A maior parte dos servidores, nem sequer deixa enviar a mensagem, sem ser com autenticação usando por ex.º a biblioteca phpmailer.

    PS: se não andávamos todos a brincar aos e-mails do tipo cavaco@presidencia.pt ou billgates@microsoft.com