2009-05-05 19 views
22

想象一下,想要在网站上放置表单的用户可以让网站访问者上传文件和简单邮件,该邮件将立即通过电子邮件发送(即,该文件不存储在服务器上,或者只是暂时存储)作为文件附件与消息正文中的注释。简单的PHP表单:电子邮件附件(代码高尔夫)

http://a2zsollution.com/php-secure-e-mail/

什么是完成这一任务的最简单的方法查看更多信息?

最简单来讲:

  • 尺寸(代码高尔夫球)
  • 易于实施的(理想地全部在一个文件中,需要几无外部资源)
  • 不模糊的模糊处理的缘故(对于大小的权衡是细)
  • 自给例如(如果称为无形式后,它显示表格)

这几乎与此相反:How to get email and their attachments from PHP。它几乎可以在Compiling email with multiple attachments in PHP中得到解答,但它实际上并未显示代码。

+0

我会提供我自己的解决方案,但通过以前的代码高尔夫比赛判断,我会被狠狠打败! – 2009-05-05 18:26:47

回答

68

只是为了好玩,我以为我会把它敲起来。它最终比我想象的要复杂,因为我没有完全理解边界部分是如何工作的,最终我发现,' - '的开始和结束都很重要,并且结束了。

<?php 
    if(isset($_POST['submit'])) 
    { 
     //The form has been submitted, prep a nice thank you message 
     $output = '<h1>Thanks for your file and message!</h1>'; 
     //Set the form flag to no display (cheap way!) 
     $flags = 'style="display:none;"'; 

     //Deal with the email 
     $to = '[email protected]'; 
     $subject = 'a file for you'; 

     $message = strip_tags($_POST['message']); 
     $attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name']))); 
     $filename = $_FILES['file']['name']; 

     $boundary =md5(date('r', time())); 

     $headers = "From: [email protected]\r\nReply-To: [email protected]"; 
     $headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\""; 

     $message="This is a multi-part message in MIME format. 

--_1_$boundary 
Content-Type: multipart/alternative; boundary=\"_2_$boundary\" 

--_2_$boundary 
Content-Type: text/plain; charset=\"iso-8859-1\" 
Content-Transfer-Encoding: 7bit 

$message 

--_2_$boundary-- 
--_1_$boundary 
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment 
--_1_$boundary--"; 

     mail($to, $subject, $message, $headers); 
    } 
?> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>MailFile</title> 
</head> 

<body> 

<?php echo $output; ?> 

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post" <?php echo $flags;?>> 
<p><label for="message">Message</label> <textarea name="message" id="message" cols="20" rows="8"></textarea></p> 
<p><label for="file">File</label> <input type="file" name="file" id="file"></p> 
<p><input type="submit" name="submit" id="submit" value="send"></p> 
</form> 
</body> 
</html> 

非常准系统真是的,明明使用内联CSS来隐藏表单是有点便宜和你几乎肯定希望给用户更多的反馈!另外,我可能会多花一点时间来研究文件的实际内容类型,而不是作弊和使用应用程序/八位字节流,但这一部分非常有趣。

+5

在我看来,这是迄今为止最好的回应,因为您是唯一提供完整代码(问题特别要求)的人。 +1。 – pix0r 2009-11-05 17:38:38

+3

可以使用md5作为高尔夫的边界,但对于生产,您应该再次检查编码附件中是否出现边界。有些编码更安全,例如Base64永远不会意外地匹配其中有`_`的边界 – 2009-11-12 00:00:12

16

http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment

与PHP上传文件的例子就是工作的组合。在上传文件的例子,而不是使用move_uploaded_file将它从临时文件夹移动你只需打开它:

$attachment = chunk_split(base64_encode(file_get_contents($tmp_file))); 

其中$tmp_file = $_FILES['userfile']['tmp_name'];

并把它作为像例子中的其余部分的附件。

全部在一个文件/自包含:

<? if(isset($_POST['submit'])){ 
//process and email 
}else{ 
//display form 
} 
?> 

我认为它是一种快速的运动,以获得您所需要基于以上两个例子可以工作的。

P.S.它需要在Apache将它传递给PHP以执行其所需的任何地方之前上传到某处。这将是您的系统的临时文件夹默认情况下,除非它在配置文件中更改。

4

本文“How to create PHP based email form with file attachment”提供了分步说明如何实现您的要求。

报价:

本文将向您展示如何创建一个支持 文件附件一 基于PHP的电子邮件的形式。该文章还将 演示如何验证上传文件的类型和 大小。

它包括以下步骤:

  • HTML表单文件上传框
  • 获取在PHP上传文件 脚本
  • 验证的大小和 延伸上传文件
  • 复制上传的文件
  • 发送电子邮件

整个示例代码可以下载here

1

PEAR::Mail_Mime?当然,PEAR依赖于(min)2文件(如果你编辑它来删除pear依赖项,只需要mail_mime本身),但它运行良好。另外,大多数服务器都在一定程度上安装了PEAR,并且在最好的情况下它们具有Pear/Mail和Pear/Mail_Mime。对于提供相同功能的大多数其他库而言,这是无法说明的。

您也可以考虑查看PHP的IMAP extension。它稍微复杂一点,需要更多的设置(默认情况下未启用或安装),但在编写消息并将消息发送到支持IMAP的服务器时必须更有效。

4

为了将该文件作为附件添加到电子邮件中,其需要暂时存储在服务器上。然而,将它放置在tmp位置然后在完成之后将其删除,这是微不足道的。

至于电邮,Zend Mail有一个非常易于使用的界面处理电子邮件附件。我们运行了整个Zend框架,但是我确信你可以安装Zend_Mail库,而不需要任何其他的依赖关系模块。

$mail = new Zend_Mail(); 
$mail->setSubject("My Email with Attachment"); 
$mail->addTo("[email protected]"); 
$mail->setBodyText("Look at the attachment"); 
$attachment = $mail->createAttachment(file_get_contents('/path/to/file')); 
$mail->send(); 

如果你正在寻找一个文件包做整个表格/电子邮件/附件的事情,我的天堂:

使用Zend_Mail,带附件发送电子邮件一样一样简单没见过一个。但是单个组件是可用且易于组装的。整个团队中最棘手的是电子邮件附件,上述建议非常简单。

4

我还没有测试过这个电子邮件部分(我的测试盒不发送电子邮件),但我认为它会工作。

<?php 
if ($_POST) { 
$s = md5(rand()); 
mail('[email protected]', 'attachment', "--$s 

{$_POST['m']} 
--$s 
Content-Type: application/octet-stream; name=\"f\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

".chunk_split(base64_encode(join(file($_FILES['f']['tmp_name']))))." 
--$s--", "MIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"$s\""); 
exit; 
} 
?> 
<form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'] ?>"> 
<textarea name="m"></textarea><br> 
<input type="file" name="f"/><br> 
<input type="submit"> 
</form>