在php上通过邮件发送长名称附件

Posted

技术标签:

【中文标题】在php上通过邮件发送长名称附件【英文标题】:long name attachments by mail on php 【发布时间】:2014-12-29 11:40:52 【问题描述】:

我正在开发一个“发送电子邮件”项目。

我有我的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】:

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

你能不能这样试试看效果如何:

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

【讨论】:

以上是关于在php上通过邮件发送长名称附件的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 发送带附件的电子邮件不显示邮件内容

PHP通过SMTP实现发送邮件_包括附件

PHP不发送带有附件的邮件

在 Ubuntu 服务器上使用带有附件的 php 脚本发送邮件 [重复]

PHP发送带有文件附件的电子邮件 - 电子邮件根本不发送

PHP 获取电子邮件附件