2011-11-29 204 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--