Estou tendo problema com o script abaixo, não sei porque o servidor está me retornando o seguinte erro.
Index.phpWarning: 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
<?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
Problema solucionado.
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