2011-11-29 192 views
0

我有一个HTML表单,它在提交时调用我的服务器上的PHP脚本。表单的元素(收件人的地址,主题行,正文)被发送到脚本,并生成并发送电子邮件。这一切都很好。将文件附加到电子邮件

我想对此进行扩展,并允许用户从他们的本地机器上选择一个文件并将其发送到服务器以作为电子邮件附件发送。这可以用我目前的架构来完成吗?这也是在客户端的JavaScript代码中,因为该文件来自他们的本地机器或PHP脚本?我没有想到JavaScript可以做这样的事情,但我见过类似的工具,它打开了一个文件浏览窗口,所以它必须是可能的,但也许它不是JavaScript。从哪里开始或如何做到这一点,任何好的建议都会很棒。

回答

-1

你不需要使用JavaScript(事实上,在这个例子中你可以使用它来添加一些金光闪闪)。这将是HTML部分:

<form enctype="multipart/form-data" action="__URL__" method="POST"> 
Send this file: <input name="userfile" type="file" /> 
<input type="submit" value="Send File" /> 
</form> 

这将是PHP的一部分:从php.net采取

$uploaddir = '/var/www/uploads/'; 
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']); 

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 
    // handle success (add $uploadfile as attachment to the mail) 
} else { 
    // handle error 
} 

代码(http://php.net/manual/en/features.file -upload.php)。

+1

这是用于通用文件上传,并且需要将上传的文件保存到非临时磁盘空间(这不是必需的)。这如何适用于电子邮件附件,或者更具体地说是OP? – nickb

+1

@nickb:OP是要求**指针**,我认为这是一个很好的。 StackOverflow **不是免费的编码服务。我相信Zrvan的回答是有价值的。 – Icarus

+0

@伊卡洛斯 - 直接从文档中提交而不解释应用程序到OP的主题不是一个答案。不知道你为什么提到“免费编码服务”,我从来没有说过我们应该编写OP的请求(正如你可以通过我的回答得出的),也不需要**粗体文本**来理解你的意思。 – nickb

2

这可以用我目前的架构来完成吗?

是的,可以使用PHP将文件附加到电子邮件。

这也是在客户端的JavaScript代码,因为该文件来自>他们的本地机器或在PHP脚本?

在客户端侧的形式将提示用户选择要上传的文件(使用<input type="file" />形式元件和设置形式的enctypeenctype="multipart/form-data"),其将被上传到服务器。从那里,服务器负责将附件转换为电子邮件可接受的格式(即base64_encoding该文件)。一旦该文件进行了base64编码,它必须在电子邮件中正确组成,因此它被理解为收件人的附件。

谷歌搜索 “发送电子邮件附件在PHP” 产生很多教程,其中包括:

0

首先 - 这是用PHP进行,而不是使用Javascript。当在浏览器中运行时,Javascript无法访问本地文件系统。

你需要做的第一件事是添加<input type="file">到窗体,确保形式的methodpost,并添加/更改<form>元素的enctype属性,使其multipart/form-data。有关成功上传文件的信息将以PHP的形式在$_FILES阵列中提供 - see here for more information处理PHP中的文件上载。

接下来,您需要更改生成电子邮件的方式。如果您使用类似PHPMailerSwiftMailer(并且建议使用其中一种),您只需阅读各自的文档以了解如何为您的消息添加附件。如果您使用mail(),并且想要继续使用它,则必须了解multipart MIME messages的工作方式。

1

使用多形式HTML这样的:

<form action="send_email_with_attachment.php" method="post"enctype="multipart/form-data"> 
    <label for="file">Select file to attach:</label> 
    <input type="file" name="file" id="file" /> 
    <br /> 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

然后拼接文件内容以消息字符串使用PHP's mail function发送。使电子邮件标题(在消息字符串中)具有带边界的multipart的内容类型,并使用边界字符串(可以选择任意随机字符串)将电子邮件正文与文件内容分开。如果文件是一个图像,它可能看起来像这样(其中长字符串是图像文件的base64编码):

To: Someone 
Subject: Test HTML email 
From: SomeoneElse 
Reply-To: Nobody 
MIME-version: 1.0 
Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p 
Date: Tue, 29 Nov 2011 09:55:36 +0100 (CET) 


--gc0p4Jq0M2Yt08jU534c0p 
Content-Type: text/plain; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit 

Hello World!!! 
This is simple text email message. 

--gc0p4Jq0M2Yt08jU534c0p 
Content-Type: image/png; name="img.png" 
Content-Transfer-Encoding: base64 
Content-ID: xxxx 
Content-Disposition: inline, filename="img.png" 

iVBORw0KGgoAAAANSUhEUgAAAAUA 
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 
9TXL0Y4OHwAAAABJRU5ErkJggg== 

--gc0p4Jq0M2Yt08jU534c0p--