通过邮件在PHP上的长名称附件

时间:2014-11-02 19:58:47

标签: php email mime email-attachments

我正在开发一个"发送电子邮件"项目

我有formulario.html,这里有我的表格(姓名,地址,信息和附件......) 我有enviar.php我拥有所有工作代码。

邮件已发送!!但我的问题是:附件文件由长名称显示,而不是文件...
如果我发送图像,我会看到ASDF345Fw45yHSDF456HG...和许多字母和数字......

那么......关于我能做什么的任何想法?这是我的代码:

//formulario.html
<form name='formulario' id='formulario' method='post' action='enviar.php' target='_self' enctype="multipart/form-data"> 
    <p>Nombre <input type='text' name='Nombre' id='Nombre'></p> 
    <p>E-mail 
    <input type='text' name='email' id='email'> 
    </p> 
    <p>Asunto 
    <input type='text' name='asunto' id='asunto' /> 
    </p> 
    <p>Mensaje 
    <textarea name="mensaje" cols="50" rows="10" id="mensaje"></textarea> 
    </p> 
    <p>Adjuntar archivo: <input type='file' name='archivo1' id='archivo1'></p> 
    <p> 
    <input type='submit' value='Enviar'> 
    </p> 
    </form> 


//enviar.php 
<?php 
$sPara=$_POST['email'];
$sTexto=$_POST['mensaje'];
$sAsunto=$_POST['asunto'];
$sDe='myemail@gmail.com';

function form_mail($sPara, $sAsunto, $sTexto, $sDe) 
{ 
  $bHayFicheros = 0; 
  $sCabeceraTexto = ""; 
  $sAdjuntos = ""; 

  if ($sDe) $sCabeceras = "From:".$sDe."\n"; 
  else $sCabeceras = "---CABECERA"; 
  $sCabeceras .= "MIME-version: 1.0n"; 
  foreach ($_POST as $sNombre => $sValor) 
    $sTexto = $sTexto."n".$sNombre." = ".$sValor; 

  foreach ($_FILES as $vAdjunto) 
  { 
    if ($bHayFicheros == 0) 
    { 
      $bHayFicheros = 1; 
      $sCabeceras .= "Content-type: multipart/mixed;"; 
      $sCabeceras .= "boundary='--_Separador-de-mensajes_--'\n"; 

      $sCabeceraTexto = "----_Separador-de-mensajes_--n"; 
      $sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1n"; 
      $sCabeceraTexto .= "Content-transfer-encoding: 7BITn"; 

      $sTexto = $sCabeceraTexto.$sTexto; 
    } 
    if ($vAdjunto["size"] > 0) 
    { 
      $sAdjuntos .= "\----_Separador-de-mensajes_--\n"; 
      $sAdjuntos .= "Content-type: ".$vAdjunto['type'].";name=".$vAdjunto['name']."n";

      $sAdjuntos .= "Content-Transfer-Encoding: BASE64n"; 
      $sAdjuntos .= "Content-disposition: attachment;filename=".$vAdjunto["name"]."nn"; 

      $oFichero = fopen($vAdjunto["tmp_name"], 'r'); 
      $sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"])); 
      $sAdjuntos .= chunk_split(base64_encode($sContenido)); 
      fclose($oFichero); 
    } 
  } 

  if ($bHayFicheros) 
    $sTexto .= $sAdjuntos."\n----_Separador-de-mensajes_----\n"; 
  return(mail($sPara, $sAsunto, $sTexto, $sCabeceras)); 
} 

//cambiar aqui el email 
if (form_mail("myemail@gmail.com", $sAsunto, 
    "Los datos introducidos en el formulario son:", $_POST['email'])) 
  echo ''.$sPara;
echo "Su formulario ha sido enviado con exito"; 
?>

1 个答案:

答案 0 :(得分:2)

我认为原因是因为很多行结尾都不存在。

你能尝试那样,看看它是如何运作的:

foreach ($_FILES as $vAdjunto) 
{ 
  if ($bHayFicheros == 0) 
  { 
    $bHayFicheros = 1; 
    $sCabeceras .= "Content-type: multipart/mixed;\n"; 
    $sCabeceras .= "boundary='--_Separador-de-mensajes_--'\n"; 

    $sCabeceraTexto = "----_Separador-de-mensajes_--\n"; 
    $sCabeceraTexto .= "Content-type: text/plain;charset=iso-8859-1\n"; 
    $sCabeceraTexto .= "Content-transfer-encoding: 7BIT\n"; 

    $sTexto = $sCabeceraTexto.$sTexto; 
  } 
  if ($vAdjunto["size"] > 0) 
  { 
    $sAdjuntos .= "\----_Separador-de-mensajes_--\n"; 
    $sAdjuntos .= "Content-type: ".$vAdjunto['type'].";name=".$vAdjunto['name']."\n";

    $sAdjuntos .= "Content-Transfer-Encoding: BASE64\n"; 
    $sAdjuntos .= "Content-disposition: attachment;filename=".$vAdjunto["name"]."\n\n"; 

    $oFichero = fopen($vAdjunto["tmp_name"], 'r'); 
    $sContenido = fread($oFichero, filesize($vAdjunto["tmp_name"])); 
    $sAdjuntos .= chunk_split(base64_encode($sContenido)); 
    fclose($oFichero); 
  } 
} 

根据所使用的MTA,您可能需要将所有\n替换为\r\n