PHP é à quinta-feira – Envio de Email Simples com Anexo
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="https://pplware.sapo.pt/">https://pplware.sapo.pt/</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.
Este artigo tem mais de um ano
Em ColdFusion seria, simplesmente:
:))
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 😉
Sem anexos, mas bem funcional:
http://fastletter-news.sourceforge.net/
Oh pá, como é que se mete código aqui? Eu, todo lampeiro a escrever três linhas e, no fim, não fica nada!
Código não pode ser como é obvio, mas já agora metes uma imagem com os comandos?
Obrigado.
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
Boas,
nice tut, mas gostava de saber como adiciono a Hora e Data?
Dava jeito de vez em quando =P
Cumps
Bom artigo. Pode dar jeito no futuro.
http://www.cidadeviseu.com
com anexos fora do joomla ainda não sabia fazer por acaso, obrigado pelo tutorial
http://www.tagravado.com
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.
PHPMailer também parece-me bem
Belo tuto Bruno, alto nível, como sempre…
keep it up ! 😀
carlos rajas
existe algum servidor gratuito de php e sql, em que eu consiga através deste codigo enviar um email?
É só procurares… mas, essa junção de “sql + email”… isso cheira-me a SPAM!!!
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.
Viva,
http://www.000webhost.com
este site é free. Tem mysql e php e muito mais, tudo de borla.
cumps
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!”);’;
}
Obrigado pela contribuição 🙂
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
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.
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??
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.
Olá
tens que instalar um servidor smtp no pc onde está instalado o wamp. O proprio servidor smtp do windows funciona perfeitamente.
cumps
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