将文件附加到电子邮件中

时间:2011-11-29 17:35:47

标签: php javascript html

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

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

4 个答案:

答案 0 :(得分:2)

  

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

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

  

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

客户端表单将提示用户选择要上传的文件(使用<input type="file" />表单元素并将表单的enctype设置为enctype="multipart/form-data"),这将是被上传到服务器。从那里,服务器负责将附件转换为电子邮件可接受的格式(即base64_encoding该文件)。一旦文件被base64_encoded,它必须正确地形成电子邮件,因此它被理解为收件人的附件。

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

答案 1 :(得分: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--

答案 2 :(得分:0)

首先 - 这是用PHP完成的,而不是Javascript。在浏览器中运行时,Javascript无权访问本地文件系统。

您需要做的第一件事是在表单中添加<input type="file">,确保表单的methodpost,然后添加/更改enctype您的<form>元素的属性,使其为multipart/form-data。有关成功上传文件的信息将在PHP $_FILES数组 - see here for more information中提供,用于处理PHP中的文件上传。

接下来,您需要更改生成电子邮件的方式。如果您使用PHPMailerSwiftMailer之类的内容(建议使用其中之一),则只需阅读相应的文档,了解如何在邮件中添加附件。如果您使用mail(),并希望继续使用它,则必须了解multipart MIME messages的工作原理。

答案 3 :(得分:-1)

你不需要JavaScript(实际上你可以在这个例子中使用它来添加一些bling)。这将是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部分:

$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
}

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