Enviar email com Anexo em PHP

Danilo Iannone 22/11/2011 18

Segue um tutorial simples e funcional para enviar email com anexo em PHP utilizando a função mail()

Página: index.html

obs: NUNCA se esqueçam de colocar o enctype=”multipart/form-data” e o método de envio precisa ser POST.

Página: enviar_email.php

  • Yuhara

    Olá, eu tentei usar o codigo mais não funcionou, o script não anexou o documento. será q vc poderia me ajudar ?

    • http://danilowm.com Danilo Iannone

      Retornou algum erro ou somente não anexou o arquivo?

  • http://www.studiostalo.com.br Richard

    OLá Amigo, o anexo vem com 0k é o mesmo erro do amigo Yuhara, o que pode ser? ele chega certinho mais com 0K

    • http://danilowm.com Danilo Iannone

      Estranho, vou dar uma revisado em todo o script para ver o que pode ser…

  • felipe

    sou novato emphp, usei o script e retornou este erro:Parse error: syntax error, unexpected T_VARIABLE in /home/allcarvi/public_html/email.php on line 198.

    poderia me ajudar?

    agradeço

    • http://danilowm.com Danilo Iannone

      Felipe, para poder lhe ajudar precisaria ver a página inteira… se puder me envie por email!

  • http://emconstruçao Claudio

    Caros,

    estou tentando enviar email com a funcao abaixo porém nao funciona poderia verificar se existe algum erro…

    while ( $lista = mysql_fetch_assoc( $q_ListaForn ) ){

    $envia = mail( $lista['email'],”Solicitação de Cotação”, $v_mensagem, $v_cabec );
    mysql_query(“INSERT INTO cotacao(
    cot_codusuario,
    cot_codfornecedor,
    cot_datsolicitacao,
    cot_descricao)
    VALUES(
    ‘$v_codusuario’,
    ‘$lista[id_usuario]‘,
    ‘$v_datacotacao’,
    ‘$v_mensagem’)”);

    }

    $envia = mail($v_emailusuario,”Cópia de sua cotação enviada!”,$v_mensagem, $v_cabec);

    obrigado pela ajuda

    • http://danilowm.com Danilo Iannone

      Bom, se você quer enviar um Anexo está com o código errado…
      Agora, se for só para enviar um mail() simples, a sintaxe está correta… precisa checar com o seu host se está habilitado

  • Anderson Coimbra

    Olá…Estou conseguindo anexar o arquivo, porém o resto da mensagem não aparece no email, tipo: nome, mensagem…

    O que pode ser?

  • http://designtec.com.br Samuel

    Cara, eu estou tentando usar o seu código, mas estou encontrando uma dificuldade, o arquivo anexado sempre chega vazio, sabe o motivo disso estar ocorrendo?

    • http://danilowm.com Danilo Iannone

      Pode ser algum erro de variável que você está passando, já checou isso?

  • Andre Larangeira

    Muito bom script, funcionou perfeitamente.
    Parabens!!!

  • http://wccastro.net Wesley

    Danilo,
    É possível enviar mais de um anexo no mesmo e-mail?
    Valeu!

    • http://danilowm.com Danilo Iannone

      É possível sim, você terá que duplicar o código e alterar as variáveis

  • Daniel Cordeiro

    ola, copiei e colei no dreamwever e logo de cara ele informa um erro nas linhas 17, 27 e 29…

    • http://danilowm.com Danilo Iannone

      Quais erros são apresentados?

  • Bruno Padilha

    Copiei e colei o código, logo, surgiram vários erros de concatenação. Consertei, e resolvi postar : http://pastebin.com/625DxsKE ! E obrigado pelo código!

  • Marcelo Jannotti N, R.

    Segue correção para quem está tendo dificuldades para implementar o código dessa publicação.

    Erros encontrados:
    – O boundary para serparação dos arquivos deve começar com — seguido do boundary informado.
    – O arquivo anexo deve estar junto do cabeçalho e não junto da mensagem.
    – No php quando inicia um string com “, ao querer imprimir o caracter “, deve-se colocar \”.
    – É de extrema importância, por questões de compatibilidade, finalizar uma linha com \r\n.

    Danilo Iannone, meus parabéns pelo script. É de grande valia para todos.

    ——————————————
    $nome = $_POST['nome'];
    $arquivo = $_FILES["arquivo"];

    // Para quem vai ser enviado o email
    $para = “[E-MAIL DESTINATÁRIO]“;

    // Assunto do email
    $assunto = “[ASSUNTO DO EMAIL]“;

    $boundary = “XYZ-“.date(“dmYis”).”-ZYX”;
    $fp = fopen($arquivo["tmp_name"], “rb”); // abre o arquivo enviado
    $anexo = fread($fp, filesize($arquivo["tmp_name"])); // calcula o tamanho
    $anexo = base64_encode($anexo); // codifica o anexo em base 64
    fclose($fp); // fecha o arquivo

    // cabeçalho do email
    $headers = “MIME-Version: 1.0\r\n”;
    $headers .= “Content-Type: multipart/mixed; “;
    $headers .= “boundary=\”$boundary\”\r\n”;
    $headers .= “–$boundary\r\n”;

    // email
    $mensagem .= “Content-Type: text/html; charset=’utf-8’\r\n”;
    $mensagem .= “Nome: $nome \r\n”;
    $mensagem .= “–$boundary \r\n”;

    // anexo
    $file = “Content-Type: “.$arquivo["type"].”; name=\””.$arquivo['name'].”\” \r\n”;
    $file .= “Content-Transfer-Encoding: base64 \r\n”;
    // NA LINHA ABAIXO É IMPORTANTE COLOCAR DUAS VEZES \r\n
    $file .= “Content-Disposition: attachment; filename=\””.$arquivo['name'].”\” \r\n\r\n”;
    $file .= “$anexo \r\n”;
    $file .= “–$boundary \r\n”;

    // enviar o email
    mail($para, $assunto, $mensagem, $headers.$file);