Ir para conteúdo

POWERED BY:

Arquivado

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

Henrique Flausino

[Resolvido] Erro Ao Tentar Enviar E-Mail Com Anexo

Recommended Posts

Olá pessoal.

Estou tendo problema com o script abaixo, não sei porque o servidor está me retornando o seguinte erro.

Warning: mail() [function.mail]: SAFE MODE Restriction in effect. The fifth parameter is disabled in SAFE MODE in /home/XXXXXXXX/public_html/Multi_Anexos/_inc/MultiAnexos.class.php on line 347

Index.php

<?php

require "_inc/MultiAnexos.class.php";

if( $_POST && MultiAnexos::is_mail($_POST['email']) ):

// Instânciamos a classe, sem assunto
$email = new MultiAnexos();
$email->setMail('From', $_POST['email'], $_POST['nome']);
$email->setMail('To', 'contato@mfdesign.com.br');
$email->send();

endif;

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>Multi-Anexos</title>
<link href="_css/typo.css" rel="stylesheet" type="text/css" />
<script type=text/javascript src="jquery.js"></SCRIPT>

</head>


<body>
<div id="div">


<?php

if( $_POST ):
	echo defined('SEND_RETURN') ?
	'<h2>'.SEND_RETURN.'</h2>' : '<h2>Informe seu nome e um email válido.</h2>' ;
endif;


// Exibindo as variáveis postadas após submeter o formulário
#MultiAnexos::showPOST();

// Exibindo um preview da mensagem html formatada
#MultiAnexos::showHTML();

?>


<h1>Submetendo um formulário com múltiplos anexos</h1>	

<p>Preencha o formulário abaixo para enviar sua mensagem.<br />É necessário preencher todos os campos.	</p>

<form id="frm" action="<?=basename(__FILE__)?>" method="post" enctype="multipart/form-data">

  <fieldset>
		<legend>
     <script language="JavaScript" type="text/javascript">

var currentcheckcontent,lastcheckcontent;
$(document).ready(function(){
   $("#addfileupload").click(function () {
       $("#fileuploads").append("<input type=\"file\" name=\"arquivo[]\" size=\"50\"><br />");
       return false;
   });
});


function getticketsuggestions() {
   currentcheckcontent = $("#message").val();
   if (currentcheckcontent!=lastcheckcontent && currentcheckcontent!="") {
       $.post("submitticket.php", { action: "getkbarticles", text: currentcheckcontent },
       function(data){
           if (data) {
               $("#searchresults").html(data);
               $("#searchresults").slideDown();
           }
       });
       lastcheckcontent = currentcheckcontent;
}
   setTimeout('getticketsuggestions();', 3000);
}
getticketsuggestions();

     </script>
     Formulário de Contato</legend>
		<p>
	    <label for="nome">Nome:</label>
			<input id="nome" name="nome" />
		</p>
		<p>
			<label for="email">E-Mail:</label>
			<input id="email" name="email" />
		</p>
		<p>
			<label for="telefone">Telefone:</label>
			<input id="telefone" name="telefone" />
		</p>
		<p id=fileuploads>
			<label for="arquivo1">Anexo</label>
			<INPUT size=50 type=file name=arquivo[]>
	  </p><A id=addfileupload href="#"><IMG class=absmiddle border=0 alt="" src="add.gif"></A>
         <p></p>
	  <p>
      <label for="mensagem">Mensagem:</label>
			<textarea id="mensagem" name="mensagem" cols="10" rows="10" class="text"></textarea>
		</p>
		<span>
			<input type="submit" value="ENVIAR" class="send" />
		</span>
	</fieldset>

</form>


</div>
</body>
</html>

MultiAnexos.class.php

<?php

/**
* Multi-Anexos | Multiple File Attachments 
* Envio de e-mail com múltiplos arquivos anexados
* 
* @author Giovanni Ramos
* @twitter @giovanni_ramos
* @version 2.5
* @since 2009-09-23 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
**/


class MultiAnexos {

public  static $head, $body;
private $boundary = array();


/**
 * O objeto MultiAnexos ao ser instanciado, pode opcionalmente atribuir um assunto à mensagem
 * 
 * @access public
 * @param string $subject Assunto da mensagem
 * 
 * */
public function __construct($subject = null) {
	self::setHTML();
	self::setReturnPath();
	$this->subject = $subject;
	$this->boundary = '==Multipart_Boundary_'.md5(uniqid(time()));
}


/**
 * Método para validar email
 * 
 * @access public
 * @param string $mail E-mail a ser testado
 * @return boolean Retorna true, se o e-mail for válido
 *
 * */
public function is_mail($mail = null) {
	return (filter_var(trim($mail), FILTER_VALIDATE_EMAIL) ? true : false);
}


/**
 * Método para atribuir um assunto à mensagem
 * 
 * @access public
 * @param string $subject Assunto da mensagem
 * @return void
 *
 * */
public function setSubject($subject = null) {
	$this->subject = $subject;
}


/**
 * Método para recuperar o assunto da mensagem
 * 
 * @access private
 * @return string Retorna o assunto da mensagem. Se nenhum for definido, retorna o Subject: "Sem assunto"
 *
 * */
private function getSubject() {
	return (!is_null($this->subject)) ? $this->subject : "Sem assunto";
}


/**
 * Método para incorporar um e-mail à mensagem
 * 
 * @access public
 * @param string $type Tipo pré-definido de e-mail: From, To, Cc, Bcc ou Reply-To
 * @param string $email Endereço de e-mail
 * @param string $name Um nome ou apelido para o e-mail (opcional)
 * @return array Retorna o email
 *
 * */
   public function setMail($type, $mail = null, $name = null) {
	if(isset($mail) && self::is_mail($mail)):
   		$type = strtolower($type);
   		$type = str_replace('-', null, $type);
   		$type = str_replace('_', null, $type);

		if(isset($type) && ereg('^[[:lower:]]*$', $type)):
	        if(!is_array($this->$type))
	            $this->$type = array();
	        array_push($this->$type, array($mail, $name));
	        return $this->$type;
			endif;
    	endif;
   }


/**
 * Método para retornar a lista de e-mails atribuída à mensagem
 * 
 * @access public
 * @param string $type Tipo de e-mail: From, To, Cc, Bcc ou Reply-To
 * @return string Retorna a lista de acordo com o tipo
 *
 * */
 public function getMail($type) {
	if(isset($type)):
		if(!$this->$type) return false;
		if(!is_array($list)) $list = array(); 

		foreach($this->$type as $k => $v)
			if(is_array($v))
				$list[] = (is_null($v[1])) ? $v[0] : $v[1].' <'.$v[0].'>';
		return implode(', ', $list);
	endif;
}


/**
 * Método para incorporar um e-mail de retorno em caso de falha no envio da mensagem
 * IMPORTANTE: Informar um Return-Path, evita bloqueios anti-spam de servidores como Gmail ou Hotmail
 * 
 * @access public
 * @param string $setReturnPath Por padrão um e-mail de retorno será atribuído a mensagem
 * @return void
 *
 * */
public function setReturnPath($setReturnPath = true) {
	$this->setReturnPath = $setReturnPath;
}


	/**
 * Método para recuperar o e-mail de retorno da mensagem
 * 
 * @access private
 * @return string Retorna o e-mail de retorno
 *
 * */
private function getReturnPath() {
	return (!is_bool($this->setReturnPath)) ? $this->setReturnPath : ( (bool)$this->setReturnPath ? $this->from[0][1] : null );
}


	/**
 * Método para capturar variáveis enviadas via post, pelo formulário 
 * 
 * @access private
 * @return string Retorna a lista de variáveis
 *
 * */
public function getPOST() { 
	$list = null;
	foreach($_POST as $k => $v)
		$list.= '<b>'.ucfirst($k).':</b> '.$v.'<br />';
	return $list;
}


	/**
 * Método para exibir as variáveis submetidas pelo formulário
 * 
 * @access static
 * @return string void
 *
 * */
static function showPOST() {
	if($_POST)
		echo '<pre>',htmlspecialchars(print_r($_POST, true)),'</pre>';
}


	/**
 * Método para formatar o conteúdo da mensagem
 * 
 * @access public
 * @return string void
 *
 * */
public function setHTML($body = null) {
	self::$body = (!is_null($body)) ? $body :
	'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-BR" lang="pt-BR">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
		<style>
		body 		{background:#FFFFFF;}
		a, a:link 	{color:#5b6105; text-decoration:none;}
		table 		{margin:0; padding:0; border:1px solid #8F8E96; width:500px;}
		table tr 	{background:#F6F6F6; }
		table td 	{color:#000000; font: normal 11px arial, helvetica, sans-serif; border:dashed 1px #DDD; padding:30px;}
		</style>
		</head>
		<body>
		<br />
		<table border="0" cellspacing="10" cellpadding="0">
		<tr>
			<td>
			'.self::getPOST().'
			</td>
		</tr>
		</table>
		<br />
		</body>
		</html>
	';
}


	/**
 * Método para limpar os espaços tabulados na mensagem 
 * 
 * @access public
 * @return string void
 *
 * */
public function getHTML() {
	return str_replace("\t",null,self::$body);
}


	/**
 * Método para exibir a mensagem enviada no corpo do e-mail
 * 
 * @access static
 * @return string void
 *
 * */
static function showHTML() {
	if($_POST)
		echo self::$body;
}


	/**
 * Método para preparar o cabeçalho da mensagem
 * 
 * @access public
 * @return string void
 *
 * */
public function setHeader($multipart = false) {
	self::$head 
	= ('MIME-Version: 1.0'.PHP_EOL)
	. ('From: '.self::getMail("from").PHP_EOL)
	. ('X-Mailer: MultiAnexos v.2.0 PHP/'.phpversion().' '.PHP_EOL)
	. ((!empty($this->to[0][0])) ? 'To: '.self::getMail("to").PHP_EOL : NULL)
	. ((!empty($this->replyto[0][0])) ? 'Reply-To: '.self::getMail("replyto").PHP_EOL : NULL)
	. ((!empty($this->cc[0][0])) ? 'Cc: '.self::getMail("cc").PHP_EOL : NULL)
	. ((!empty($this->bcc[0][0])) ? 'Bcc: '.self::getMail("bcc").PHP_EOL : NULL)
	. ('Content-type: '.(($multipart) ? 'multipart/mixed; boundary="'.$this->boundary.'"'.PHP_EOL:'text/html; charset="ISO-8859-1"').PHP_EOL);
}


	/**
 * Método para recuperar o cabeçalho da mensagem
 * 
 * @access public
 * @return string Retorna o HEADER da mensagem
 *
 * */
public function getHeader() {
	return self::$head;
}


	/**
 * Método para submeter a mensagem
 * 
 * @access public
 * @return boolean Retorna o status do envio
 *
 * */
public function send() {

	// Verifico se o formulário submetido, possui algum arquivo anexo
	$file = (isset($_FILES['arquivo']) && in_array('0',$_FILES['arquivo']['error'])) ? $_FILES['arquivo'] : FALSE;

	$subj = self::getSubject();

	$body = self::getHTML();

	self::setHeader((bool) $file);
	$head = self::getHeader();

	// Executo a condição seguinte, se identificar um ou mais anexos junto a mensagem
	if($file){

		// Removendo da matriz os anexos falsos
		for ($x=0; $x<count($_FILES['arquivo']['name']); $x++):
			if($file['error'][$x] <> UPLOAD_ERR_OK){
				unset($file['name'][$x]);
				unset($file['size'][$x]);
				unset($file['type'][$x]);
				unset($file['tmp_name'][$x]);
				unset($file['error'][$x]);
			}else{
				$attach[] = array(
					$file['name'][$x], 
					$file['size'][$x], 
					$file['type'][$x], 
					$file['tmp_name'][$x]
				);
			}
		endfor;


		$html = stripslashes($body);

		// Criando os cabeçalhos MIME utilizados para separar as partes da mensagem 
		$body = '--'.$this->boundary.PHP_EOL;
		$body.= 'Content-Type: text/html; charset="ISO-8859-1"'.PHP_EOL;
		$body.= 'Content-Transfer-Encoding: 8bit'.PHP_EOL.PHP_EOL;
		$body.= $html.PHP_EOL;
		$body.= '--'.$this->boundary.PHP_EOL;

		for ($i=0; $i<sizeof($attach); $i++):
			if(is_uploaded_file($attach[$i][3])) {
				$Name = $attach[$i][0];
				$Size = $attach[$i][1];
				$Type = $attach[$i][2];
				$Temp = $attach[$i][3];

				if((strlen($Name)>1) && ($Size>0)) {
					$fopen = fopen($Temp,"rb");
					$fread = fread($fopen, filesize($Temp));
					$cript = base64_encode($fread);
					$close = fclose($fopen);
					$chunk = chunk_split($cript);

					$body.= 'Content-Disposition: attachment; filename="'.$Name.'"'.PHP_EOL;
					$body.= 'Content-Type: '.$Type.'; name="'.$Name.'"'.PHP_EOL;
					$body.= 'Content-Transfer-Encoding: base64'.PHP_EOL.PHP_EOL;
					$body.= $chunk.PHP_EOL;
					$body.= '--'.$this->boundary;
					$body.= (sizeof($attach) == $i+1) ? '--'.PHP_EOL.PHP_EOL : PHP_EOL;
				}
			}
		endfor;

	}

	// Enviando a mensagem e definindo uma mensagem de status do envio em SEND_RETURN
	$status = mail(null, $subj, $body, $head, ((bool) $this->setReturnPath ? '-f'.self::getReturnPath() : null)) ? true : false;

	$status_message = ($status) ?
	'<span class="mail_ok">Sua mensagem foi enviada com sucesso.</span>' : 
	'<span class="mail_no">Sua mensagem não pôde ser enviada.</span><br /><br />Por favor tente novamente mais tarde.' ;

	define('SEND_RETURN', $status_message);

	return $status;
}

}


?>

 

Alguém pode me ajudar?

 

 

Atenciosamente.

Henrique Flausino

Compartilhar este post


Link para o post
Compartilhar em outros sites

pelo que entendi o SAFE MODE esta desabilitado e assim deveria parmanecer tb por razões de segurança, mais você pode tentar iniciar ele pelo ini_set(), agora nao aconselho..

 

abraços

Será que poderia me ajudar a contornar este erro sem ativar ele?

Compartilhar este post


Link para o post
Compartilhar em outros sites

troca essa linha aqui:

 

// Enviando a mensagem e definindo uma mensagem de status do envio em SEND_RETURN

$status = mail(null, $subj, $body, $head, ((bool) $this->setReturnPath ? '-f'.self::getReturnPath() : null)) ? true : false;

 

por isto:

 

// Enviando a mensagem e definindo uma mensagem de status do envio em SEND_RETURN

$status = mail("COLOCA AQUI SEU EMAIL", $subj, $body, $head);

 

 

e ve se chega algo pra você!

Compartilhar este post


Link para o post
Compartilhar em outros sites

troca essa linha aqui:

 

// Enviando a mensagem e definindo uma mensagem de status do envio em SEND_RETURN

$status = mail(null, $subj, $body, $head, ((bool) $this->setReturnPath ? '-f'.self::getReturnPath() : null)) ? true : false;

 

por isto:

 

// Enviando a mensagem e definindo uma mensagem de status do envio em SEND_RETURN

$status = mail("COLOCA AQUI SEU EMAIL", $subj, $body, $head);

 

 

e ve se chega algo pra você!

Opaaaaaaaaaaaaaaaa....

Valeu Fabio, nem tinha pensado nisso e olha que testei todo o código menos isso hahaha.

Para quem precisar estou colocando o código na integra para Down, pois tive de procurar muito para achar ele.

O melhor é que tem um sistema muito legal de add novos campos de anexos.

Já testei e está funcionando 100%.

 

 

Download: http://www.fileserve.com/file/EuGGXzs

 

 

Att.

Henrique Flausino

Compartilhar este post


Link para o post
Compartilhar em outros sites

troca essa linha aqui:

 

// Enviando a mensagem e definindo uma mensagem de status do envio em SEND_RETURN

$status = mail(null, $subj, $body, $head, ((bool) $this->setReturnPath ? '-f'.self::getReturnPath() : null)) ? true : false;

 

por isto:

 

// Enviando a mensagem e definindo uma mensagem de status do envio em SEND_RETURN

$status = mail("COLOCA AQUI SEU EMAIL", $subj, $body, $head);

 

 

e ve se chega algo pra você!

Opaaaaaaaaaaaaaaaa....

Valeu Fabio, nem tinha pensado nisso e olha que testei todo o código menos isso hahaha.

Para quem precisar estou colocando o código na integra para Down, pois tive de procurar muito para achar ele.

O melhor é que tem um sistema muito legal de add novos campos de anexos.

Já testei e está funcionando 100%.

 

 

Download: http://www.fileserve.com/file/EuGGXzs

 

 

Att.

Henrique Flausino

 

 

 

Boa tarde,

 

Testei num servidor e o vosso codigo funcionou correctamente.

 

Mas testei noutro servidor e aparece a seguinte mensagem:

 

"Sua mensagem não pode ser enviada"

 

Que será que está acontecer?

 

Será porque o meu servidor não aceita a função mail?

 

Abraço estou mesmo a necessitar deste formulario a funcionar no meu servidor de linux ;)

 

 

http://www.housedelight.com.pt/Multi_Anexos/Multi_Anexos.php

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.