Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

r  e  i  n  a  l  d  o

Eviar email com anexo

Recommended Posts

Olá

 

tenho o seguinte código que envia e-mails com arquivos anexos.

 

<?		$boundary = strtotime('NOW'); 			$headers = "From: Reinaldo\r\n";	 		$headers .= "MIME-Version: 1.0\r\n"; 		$headers .= "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\r\n";   		$msg = "--" . $boundary . "\r\n"; 		$msg .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n"; 		$msg .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";  		$msg .= "Aqui vai a mensagem";			for($e=1;$e<=5;$e++)		{				$arquivo = isset($_FILES["foto".$e]) ? $_FILES["foto".$e] : FALSE;				if(file_exists($arquivo["tmp_name"]) and !empty($arquivo))				{						$fp = fopen($arquivo["tmp_name"],"rb");						$anexo = fread($fp,filesize($arquivo["tmp_name"]));		  						$anexo = chunk_split(base64_encode($anexo)); 						fclose($fp);					  $msg .= "--" . $boundary . "\r\n";					  $msg .= "Content-Type:\"".$_FILES["foto".$e]["type"]."\"\r\n";					  $msg .= "Content-Transfer-Encoding: base64;\r\n"; 					  $msg .= "Content-Disposition: attachment; filename=\"".$_FILES["foto".$e]["name"]."\"\r\n";					  $msg .= "$anexo\r\n\r\n"; 				}		}mail("reinaldooli@gmail.com","Solicitação de Classificado Carro",$msg,$headers);	?>

O script funciona os anexos são enviados mais quando vou abrir o anexo dá erro, e não consigo abrir os anexos o que pode estar errado?????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se é o suficiente pra dar esse erro, mas faltou indicar o limite (boundary) pra fechar desse documento multipart. Tenta enviar o e-mail adicionando a seguinte linha logo após o laço "for" que anexa os arquivos:

 

$msg .= "--" . $boundary . "--\r\n";

 

[]'s!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora não ta enviando mais não por causa dessa linha a mais

é pq não tá achando o arquivo o codigo tá assim agora

 

$produto = @$_POST["produto"];   $boundary = strtotime('NOW'); 	   $headers = "From: Reinaldo\r\n";		    $headers .= "MIME-Version: 1.0\r\n";    $headers .= "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\r\n";      $msg = "--" . $boundary . "--\r\n";    $msg .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n";    $msg .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";     $msg .= "aqui vai a mensagem";   for($e=0;$e<=4;$e++)   {	  $arquivo = isset($_FILES["foto".$e]) ? $_FILES["foto".$e] : FALSE;	  if(file_exists($arquivo["tmp_name"]) and !empty($arquivo))	  {		 $fp = fopen($_FILES["foto".$e]["tmp_name"],"rb");		 $anexo = fread($fp,filesize($_FILES["foto".$e]["tmp_name"]));		  		 $anexo = chunk_split(base64_encode($anexo)); 		 fclose($fp);		 $msg .= "--" . $boundary . "--\r\n";		 $msg .= "Content-Type:\"".$_FILES["foto".$e]["type"]."\"\r\n";		 $msg .= "Content-Transfer-Encoding: base64;\r\n"; 		 $msg .= "Content-Disposition: attachment; filename=\"".$_FILES["foto".$e]["name"]."\"\r\n";		 $msg .= "$anexo\r\n";		 $msg .= "--" . $boundary . "--\r\n\r\n";	  }	  else	  {?>		 <script type="text/javascript">alert("não anexou")</script><?	  }   }mail("reinaldooli@gmail.com","Solicitação de Classificado Carro",$msg,$headers);	?>

agora coloquei um java script que avisa se ele não anexar o arquivo....

 

e isso funciona pq ele ta me avisando que não anexou o arquivo....

 

 

o que faço???????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, tem alguns (novos) erros no código... Acho que será legal que eu faça uma breve explicação sobre o tipo de documento "multipart", que é o tipo utilizado para criar um e-mail... ;)

 

Em primeiro lugar, é um documento de texto puro (mesmo quando há anexos), dividido em "cabeçalho" e "corpo". Como é que o programa que vai ler esse e-mail diferencia o cabeçalho do corpo? É simples... ele entende que é cabeçalho tudo aquilo que vai da primeira linha do documento até a primeira linha em branco que encontrar. Mas você não precisa se preocupar com isso, pois na função "mail" do PHP, você já passa o corpo e o cabeçalho como parâmetros separados, e a própria função cuida de adicionar linhas em branco entre um e outro.

 

No cabeçalho, você informa algumas coisas relevantes ao programa que vai ler o e-mail. Acho que a mais importante delas é o "Content-Type", que indica o tipo desse documento. No seu caso, ele é "multipart/mixed". Ou seja, o leitor de e-mail saberá que no "corpo" do documento haverá múltiplas partes (multipart), de diversos tipos (mixed). Essas partes serão separadas por um limite (o "boundary", que você declara logo após o "Content-Type"). Existe uma regra pra isso, que é a seguinte:

 

- Dois caracteres de hífen ("--") seguidos do "boundary" indicam uma nova parte nesse documento.

- Dois caracteres de hífen seguidos do "boundary" mais dois caracteres de hífen indicam o término do documento.

 

(se você analisar o seu código, tem um erro quando uma nova parte é declarada)

 

Você só precisa declarar o limite quando uma nova parte for criada. Não é necessário indicar o término dela pra começar uma nova, somente é necessário indicar o término do documento como um todo.

 

Logo que você declara o início de uma parte, novamente você terá um "cabeçalho" e um "corpo", mas somente para essa parte. Veja que na primeira parte do seu e-mail, você indicou no cabeçalho dela que o conteúdo ("Content-Type") será do tipo "text/html". E logo abaixo, após uma linha em branco (ou seja, no corpo dela), veio o texto do email (que será interpretado como código HTML, conforme indicado no cabeçalho).

 

Ok até aqui?

 

Bom, logo após, você declara uma nova parte para cada arquivo anexado. Veja que, nos cabeçalhos dessa nova parte, você indica um "Content-Type" diferente para cada tipo de arquivo (pois pode ser uma imagem, música, etc.), além de indicar através do "Content-Disposition: attachment" que essa parte do documento não deverá ser exibida no texto da mensagem, mas sim como anexo.

 

Bom, é isso... acho que com essa explicação, você poderá solucionar esse problema e evitar outros que poderiam acontecer no futuro.

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom você pode até me chamar de burro mais vo postar de novo e mostrar como eu fiz depois que li a sua explicação

 

$boundary = strtotime('NOW'); 	  $headers = "From: Reinaldo Oliveira\r\n";		   $headers .= "MIME-Version: 1.0\r\n";   $headers .= "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\r\n";     $msg = "--" . $boundary . "\r\n";   $msg .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n";   $msg .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";    $msg .= "AQI VEM A MENSAGEM";	  for($e=0;$e<=4;$e++)  {	$arquivo = isset($_FILES["foto".$e]) ? $_FILES["foto".$e] : FALSE;	if(file_exists($arquivo["tmp_name"]) and !empty($arquivo))	{	  $fp = fopen($_FILES["foto".$e]["tmp_name"],"rb");	  $anexo = fread($fp,filesize($_FILES["foto".$e]["tmp_name"]));		  	  $anexo = chunk_split(base64_encode($anexo)); 	  fclose($fp);	  $msg .= "--" . $boundary . "\r\n";	  $msg .= "Content-Type:\"".$_FILES["foto".$e]["type"]."\"\r\n";	  $msg .= "Content-Transfer-Encoding: base64;\r\n"; 	  $msg .= "Content-Disposition: attachment; filename=\"".$_FILES["foto".$e]["name"]."\"\r\n\r\n";	  $msg .= "$anexo\r\n\r\n";				}		  }$msg .= "--" . $boundary . "--\r\n";mail("reinaldooli@gmail.com","Solicitação de Classificado Carro",$msg,$headers);

E mesmo assim não ta dando certo os anexos vão certinhos com o nome das imagens a mensagem vai certinha tudo ok na hora de abrir o anexo naum abre fala que o arquivo ta corrompido meu num sei mais o que fazer

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.