2009-05-05 22 views
22

Hãy tưởng tượng người dùng muốn đặt biểu mẫu trên trang web của họ cho phép khách truy cập trang web tải lên tệp và tin nhắn đơn giản. tệp không được lưu trữ trên máy chủ hoặc nếu tệp đó chỉ tạm thời) dưới dạng tệp đính kèm với ghi chú trong phần nội dung thư.Biểu mẫu PHP đơn giản: Đính kèm email (mã sân golf)

Xem thêm chi tiết tại http://a2zsollution.com/php-secure-e-mail/

Cách đơn giản nhất để thực hiện việc này là gì?

đơn giản nhất về:

  • Kích (mã golf)
  • Dễ thực hiện (lý tưởng tất cả trong một tập tin, cần vài hoặc không có nguồn lực bên ngoài)
  • Không obfuscated vì lợi ích của obfuscation (cân bằng cho kích thước là tốt)
  • Ví dụ tự chứa (nếu được gọi không có biểu mẫu, nó sẽ hiển thị biểu mẫu)

Điều này gần như ngược lại: How to get email and their attachments from PHP. Nó gần như có thể đã được trả lời trong Compiling email with multiple attachments in PHP, nhưng nó không thực sự hiển thị mã.

+0

Tôi sẽ đưa ra giải pháp của riêng mình, nhưng đánh giá bởi các cuộc thi gôn mã trước đó tôi sẽ bị đánh đập! –

Trả lời

68

Chỉ để cho vui, tôi nghĩ rằng tôi sẽ gõ nó lên. Nó đã trở nên phức tạp hơn tôi nghĩ bởi vì tôi đã không hiểu đầy đủ về cách phần biên hoạt động, cuối cùng tôi đã phát hiện ra rằng sự bắt đầu và kết thúc '-' là đáng kể và nó đã đi.

<?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> 

Sử dụng CSS nội tuyến để ẩn biểu mẫu hơi rẻ và bạn gần như chắc chắn muốn phản hồi một chút cho người dùng! Ngoài ra, tôi có thể dành nhiều thời gian hơn để tìm ra loại nội dung thực tế cho tệp, thay vì gian lận và sử dụng ứng dụng/octet-stream nhưng phần đó khá thú vị.

+5

Đây là phản hồi tốt nhất cho đến nay theo ý kiến ​​của tôi, vì bạn là người duy nhất cung cấp mã đầy đủ (mà câu hỏi cụ thể yêu cầu). +1. – pix0r

+3

Bạn nên sử dụng md5 cho ranh giới cho sân gôn, nhưng đối với sản xuất, bạn nên kiểm tra kỹ xem ranh giới không xuất hiện trong phần đính kèm được mã hóa hay không. Một số mã hóa an toàn hơn, ví dụ Base64 sẽ không bao giờ vô tình khớp với một đường biên có '_' trong nó –

+0

Có cách nào để đính kèm nhiều tệp không? –

16

Kết hợp này http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php#attachment

với ví dụ về tệp tải lên php sẽ hoạt động. Trong ví dụ tập tin tải lên thay vì sử dụng move_uploaded_file để di chuyển nó từ thư mục tạm thời bạn sẽ chỉ cần mở nó:

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

nơi $tmp_file = $_FILES['userfile']['tmp_name'];

và gửi dưới dạng đính kèm như phần còn lại của ví dụ.

Tất cả trong một tập tin/khép kín:

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

Tôi nghĩ rằng một bài tập nhanh chóng của nó để có được những gì bạn cần làm việc dựa trên hai ví dụ có sẵn ở trên.

P.S. Nó cần phải được tải lên một nơi nào đó trước khi Apache chuyển nó cùng với PHP để làm những gì nó muốn với nó. Đó sẽ là thư mục tạm thời của hệ thống theo mặc định trừ khi nó được thay đổi trong tập tin cấu hình.

4

Bài viết này "How to create PHP based email form with file attachment" trình bày hướng dẫn từng bước cách đạt được yêu cầu của bạn.

Trích:

bài viết này cho bạn thấy làm thế nào để tạo ra một PHP mẫu email dựa trên hỗ trợ tập tin đính kèm tập tin. Bài viết cũng sẽ cho bạn biết cách xác thực loại và kích thước của tệp được tải lên.

Nó bao gồm các bước sau:

  • Dạng HTML với hộp tập tin tải lên
  • Lấy tập tin tải lên trong PHP kịch bản
  • Members quy mô và mở rộng của các tải lên tệp
  • Sao chép tệp đã tải lên
  • Gửi email

Toàn bộ mã ví dụ có thể được tải here

1

PEAR::Mail_Mime? Chắc chắn, PEAR phụ thuộc của (min) 2 tập tin (chỉ mail_mime chính nó nếu bạn chỉnh sửa nó để loại bỏ các phụ thuộc lê), nhưng nó hoạt động tốt. Ngoài ra, hầu hết các máy chủ có PEAR được cài đặt ở một mức độ nào đó và trong trường hợp tốt nhất, chúng có Pear/Mail và Pear/Mail_Mime. Một cái gì đó mà không thể nói cho hầu hết các thư viện khác cung cấp các chức năng tương tự.

Bạn cũng có thể xem xét tìm kiếm trong số IMAP extension của PHP. Đó là một chút phức tạp hơn, và đòi hỏi phải thiết lập nhiều hơn (không kích hoạt hoặc cài đặt theo mặc định), nhưng phải hiệu quả hơn trong compilng và gửi tin nhắn đến một máy chủ có khả năng IMAP.

4

Để thêm tệp vào email dưới dạng tệp đính kèm, sẽ cần được lưu trữ trên máy chủ một thời gian ngắn. Nó là tầm thường, tuy nhiên, để đặt nó trong một vị trí tmp sau đó xóa nó sau khi bạn đang thực hiện với nó.

Đối với gửi email, Zend Mail có giao diện rất dễ sử dụng để xử lý các tệp đính kèm email. Chúng tôi chạy với toàn bộ khung công tác Zend được cài đặt, nhưng tôi khá chắc chắn rằng bạn chỉ có thể cài đặt thư viện Zend_Mail mà không cần bất kỳ mô-đun nào khác cho các phụ thuộc.

Với Zend_Mail, gửi một email với một tập tin đính kèm cũng đơn giản như:

$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(); 

Nếu bạn đang tìm kiếm một một-file-gói để làm toàn bộ điều hình thức/email/tập tin đính kèm, tôi thiên đường không thấy một. Nhưng các thành phần riêng lẻ chắc chắn có sẵn và dễ lắp ráp. Điều tuyệt vời nhất của toàn bộ nhóm là tệp đính kèm email, đề xuất ở trên rất đơn giản.

4

Tôi chưa kiểm tra phần email này (hộp kiểm tra của tôi không gửi email) nhưng tôi nghĩ nó sẽ hoạt động.

<?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> 
+1

Tôi thích của bạn cho nhỏ và đơn giản và ước gì tôi có thể cho cả hai người tiền thưởng. –

Các vấn đề liên quan