在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上通过邮件发送长名称附件的主要内容,如果未能解决你的问题,请参考以下文章