Ir para conteúdo

POWERED BY:

Arquivado

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

WarLiKe

Boundary e Anexos de email

Recommended Posts

Olá galera

 

Eu já virei a net de ponta cabeça e dei umas 20 chaqualhadinha pra ver se axava alguma coisa mais clara sobre boundary e como anexar mais de um arquivo num email

Achei uma classe que manda email com mais de um arquivo anexo, porém usa socket e eu não quero usar isso

 

a classe é essa:

 

<?
/*
*	Classe SendMail e todas as suas funções foraum escrita por: Bruno Pitteli Gonçalves ||
*scorninpc[(at])gmail([dot)]com como necessidade
*ao se deparar com tal problema em enviar emails com anexos em servidores SMTP auteticados na criação
*do portal http://www.unimed-andradina.com.br.
*	Esta classe ou qualquer função nela contida pode ser usada em qualquer programa com fins lucrativos ou não,
*porem devem ser setados no trexo do codigo fonte o nome e email do autor, e qual a
*modificação caso ouver.
*   O autor não é responsavel por erros e danos nestas funções.
*
*   Possiveis problemas:
*   Anexar mais de 10 arquivos sem ter auterado o array $Anexos para suportar mais que 10 anexos
*   Anexar um arquivo de tipo não setado que não seja uma aplicação (necessita de testes)
*   Caso a internet seja lenta o suficiente para cancelar a conexao com o servidor SMTP, o
*   script ficará travado, pois não trato a quantidade de loops que ele erá fazer na função Esperar_Resp()
*
*   Seja livre, distribua seu codigo, tire duvidas e de suporte a quem precisa.
*
*   Duvidas:
*   http://faidevel.zapto.org && http://www.fai.com.br/forum &&
*   scorninpc[(at])gmail([dot)]com && #motd@irc.freenode.net
*/
class SendMail
{
   var $Servidor;	   //Endereço do servidor SMTP
   var $Porta=25;	   //Porta do servidor SMTP
   var $Autenticado;	//Autenticado ou não
   var $Usuario;		//Usuario do servidor SMTP
   var $Senha;		  //Senha do servidor SMTP
	
   var $EmailDe;		//Email de quem está enviando
   var $EmailPara;	  //Email de quem vai receber
   var $Assunto;		//Assunto do email
   var $Corpo;		  //Mensagem do email

   //Aumente para mais anexos
   var $Anexos=array(" ", " ", " ", " ", " ", " "," ", " ", " "," ");
   var $NumAnexos=0;

   var $Barra="\\";	 //Variavel que guarda o tipo da barra, \\ - windows | / - Linux
   var $erros=FALSE;	//Variavel que trata a situação da classe

   //Construtor
   function SendMail()
   {
	   //Aumenta o tempo de espera maximo
	   set_time_limit(60);
   }

   //Criptografa o arquivo na base64
   function CodarArquivo($arq)
   {
	   $fp=fopen($arq, "rb");
	   if(!$fp)
	   {
		   $this->erros=TRUE;
		   return FALSE;
	   }
	   $File=fread($fp, filesize($arq));
	   fclose($fp);

	   return base64_encode($File);
   }
   
	//Retorna o nome do arquivo
	function PegarNome($str)
	{
		$Nome="";
		$Nome = end(explode("\\", $str));
		if(strlen($Nome)==0)
			$Nome = end(explode("/", $str));
		return $Nome;
	}

	//Retorna a extensão do arquivo, desde que ele tenha extesão
	function PegarTipo($str)
	{
		$tipo="";
		$i=strlen($str)-1;
		$j=0;
		while($str[$i]!=".")
			$i--;

		$i++;
		$j=0;
		for($i; $i<strlen($str); $i++)
		{
			$tipo.=$str[$i];
			$j++;
		}
		return $tipo;
	}

	//Coloca o endereço do arquivo no array e aumenta o numero de anexos
	function Anexar($arq)
	{
		$this->Anexos[$this->NumAnexos]=$arq;
		$this->NumAnexos++;
		return TRUE;
	}
	
   //Função que verifica se as variaveis estão OK
   function Verificar()
   {
	   //Verifica se é um servidor autenticado
	   if( $this->Autenticado )
		   if( !isset($this->Usuario) || !isset($this->Senha) )  //Se for autenticado, verifica o usuario e a senha
			   $this->erros=TRUE;

	   //Verifica se o servidor foi digitado
	   if( !isset($this->Servidor) )
		   $this->erros=TRUE;
		   
	   //Verifica se os parametros são validos
	   if( !isset($this->EmailDe) || !isset($this->EmailPara) || !isset($this->Assunto) || !isset($this->Corpo) )
		   $this->erros=TRUE;
   }

   //Função que espera o servidor responder
   function Esperar_Resp($socket, $response, $line = __LINE__)
   {
	   while (substr($server_response, 3, 1) != ' ')
		   if (!($server_response = fgets($socket, 256)))
			   $this->erros=TRUE;
	   if (!(substr($server_response, 0, 3) == $response))
		   $this->erros=TRUE;
   }

   function Enviar()
   {
		$this->Verificar();
		if( !$this->erros )
		{
			//Tenta conectar
			if( !$socket=fsockopen($this->Servidor, $this->Porta, $errno, $errstr, 20) )
				$this->erros=TRUE;

			//Espera por resposta
			$this->Esperar_Resp($socket, "220", __LINE__);

		   //Verifica se o email esta sendo autenticado
		   //Caso for ele ira mandar um EHLO, pra dizer que vai ser autenticado
		   //Caso não for ele manda um HELO simples.
		   if( $this->Autenticado )
		   {
			   fputs($socket, "EHLO " . $this->Servidor . "\r\n");
			   $this->Esperar_Resp($socket, "250", __LINE__);

			   fputs($socket, "AUTH LOGIN\r\n");
			   $this->Esperar_Resp($socket, "334", __LINE__);

			   fputs($socket, base64_encode($this->Usuario) . "\r\n");
			   $this->Esperar_Resp($socket, "334", __LINE__);

			   fputs($socket, base64_encode($this->Senha) . "\r\n");
			   $this->Esperar_Resp($socket, "235", __LINE__);

		   }
		   else
		   {
			   fputs($socket, "HELO " . $this->Servidor . "\r\n");
			   $this->Esperar_Resp($socket, "250", __LINE__);
		   }
		   
		   //Envia quem está mandando o email
		   fputs($socket, "MAIL FROM: " . $this->EmailDe . "\r\n");
		   $this->Esperar_Resp($socket, "250", __LINE__);

		   //Diz ao servidor quem vai receber o email
		   fputs($socket, "RCPT TO: " . $this->EmailPara . "\r\n");
		   $this->Esperar_Resp($socket, "250", __LINE__);

		   //Diz ao servidor que estou pronto para enviar a mensagem
		   fputs($socket, "DATA\r\n");
		   $this->Esperar_Resp($socket, "354", __LINE__);

		   //Cabeçalho do email
		   fputs($socket, "From: " . $this->EmailDe . "\r\n");
		   fputs($socket, "To: " . $this->EmailPara . "\r\n");
		   
		   //Mando o assunto do email
		   fputs($socket, "Subject: " . $this->Assunto . "\r\n");
		   
		   //Envia o cabeçalho
		   fputs($socket, "MIME-Version: 1.0\r\n");
		   fputs($socket, "Content-Type: multipart/mixed;\r\n");
		   fputs($socket, "	  boundary=KkK170891tpbkKk__FV_KKKkkkjjwq\r\n");
		   fputs($socket, "\r\n");
		   fputs($socket, "\r\n");
		   fputs($socket, "--KkK170891tpbkKk__FV_KKKkkkjjwq\r\n");
		   fputs($socket, "Content-Type: text/plain; charset=US-ASCII\r\n");
		   fputs($socket, "\r\n");
		   fputs($socket, $this->Corpo);
		   fputs($socket, "\r\n\r\n");
		   
		   //verifica se existe arquivo para ser enviado junto
		   if($this->NumAnexos>0)
		   {
			   for($i=0; $i<$this->NumAnexos; $i++)
			   {
				   //Pega o tipo para o MIME TYPE
				   $tipo=$this->PegarTipo($this->Anexos[$i]);
				   strtolower($tipo);
				   switch($tipo)
				   {
					   case "jpeg":
					   case "jpg":
						   $Tipo="image/jpeg";
						   break;
					   case "gif":
						   $Tipo="image/gif";
						   break;
					   case "doc":
						   $Tipo="application/msword";
						   break;
					   case "rar":
						   $Tipo="application/rar";
						   break;
					   case "zip":
						   $Tipo="application/zip";
						   break;
					   default:
						  $Tipo="application/octet-stream";
						  break;
						  
				   }
				   //Pega o nome do arquivo
				   $Nome=$this->PegarNome($this->Anexos[$i]);
				   
				   fputs($socket, "--KkK170891tpbkKk__FV_KKKkkkjjwq\r\n");
				   fputs($socket, "Content-Type: " . $Tipo . "; name=\"". $Nome . "\"\r\n");
				   fputs($socket, "Content-Transfer-Encoding: base64\r\n");
				   fputs($socket, "Content-Disposition: attachment; filename=\"" . $Nome . "\"\r\n");
				   fputs($socket, "\r\n");
				   fputs($socket, $this->CodarArquivo($this->Anexos[$i]));
				   fputs($socket, "\r\n");
			   }
			   fputs($socket, "--KkK170891tpbkKk__FV_KKKkkkjjwq--\r\n");
		   }

		   //Avisa o servidor que ja acabei de enviar a mensagem
		   fputs($socket, "\r\n.\r\n");
		   $this->Esperar_Resp($socket, "250", __LINE__);

		   //Sai do servidor e fecha o socket
		   fputs($socket, "QUIT\r\n");
		   fclose($socket);

		   //Retorna um TRUE pra dizer que o email foi enviado
		   if ($this->erros==TRUE)
			  return FALSE;
		   else
			  return TRUE;
		}
	}
}
?>

Pois então . . . . . para usar essa classe é assim:

 

<?
/*
*	Classe SendMail e todas as suas funções foraum escrita por: Bruno Pitteli Gonçalves ||
*scorninpc[(at])gmail([dot)]com como necessidade
*ao se deparar com tal problema em enviar emails com anexos em servidores SMTP auteticados na criação
*do portal http://www.unimed-andradina.com.br.
*	Esta classe ou qualquer função nela contida pode ser usada em qualquer programa com fins lucrativos ou não,
*porem devem ser setados no trexo do codigo fonte o nome e email do autor, e qual a
*modificação caso ouver.
*   O autor não é responsavel por erros e danos nestas funções.
*
*   Possiveis problemas:
*   Anexar mais de 10 arquivos sem ter auterado o array $Anexos para suportar mais que 10 anexos
*   Anexar um arquivo de tipo não setado que não seja uma aplicação (necessita de testes)
*   Caso a internet seja lenta o suficiente para cancelar a conexao com o servidor SMTP, o
*   script ficará travado, pois não trato a quantidade de loops que ele erá fazer na função Esperar_Resp()
*
*   Seja livre, distribua seu codigo, tire duvidas e de suporte a quem precisa.
*
*   Duvidas:
*   http://faidevel.zapto.org && http://www.fai.com.br/forum &&
*   scorninpc[(at])gmail([dot)]com && #motd@irc.freenode.net
*/
	include "smtp.class.php";

	$Email = new SendMail;
	$Email->Servidor="smtp.mail.yahoo.com.br"; //Servidor

	$Email->Autenticado=TRUE;  //É autenticado
	$Email->Usuario="eu";  //Usuario
	$Email->Senha="123456";	//Senha
	
	$Email->Barra="\\"; //barra pra windows
	/*
	$Email->Barra="\\" //barra pra windows
	$Email->Barra="/" //barra pra linux
	*/
	
	$Email->EmailDe="meuemail@email.com.br";  //seu email
	$Email->EmailPara="destino@destino.com.br";  //Destino
	$Email->Assunto="Assunto do email";  //Assunto
	$Email->Corpo="Corpo aqui";  //Corpo

	$Email->Anexar("arquivo.txt");   //Anexo 1
	$Email->Anexar("arquivo2.txt");   //Anexo 2 - para mais anexos é só anexar mais =P

	if($Email->Enviar())		   //Envia o email
		echo "Email enviado";
	else
		echo "Email não pode ser enviado";
?>

 

Essa classe faz certinho

 

Queria saber como é que ela consegue separar os anexos!

Afinal o boundary é no header ou no corpo?

Como separa isso?

Alguém tem um tuto q explica?

 

To a 3 dias criando scripts e testando e o máximo que consegui foi mandar varios arquivos mal codificados pela classe q criei e q já até exclui eu axo

 

Se alguém tiver uma luz me mande rs

 

Agradeço desde já

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa cara, vlw mesmo . . . . . . depois desse tópico vai dar pra entender certinho como fazer!

 

Qd eu fizer posto aqui o resultado

 

Uma braço ai!

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.