Nasıl bir PHP formu ekleri ile birlikte bir e-posta gönderebilir miyim?

4 Cevap php

Nasıl bir PHP formu ekleri ile birlikte bir e-posta gönderebilir miyim?

4 Cevap

Diğerleri cevapları önerdi gibi, varolan bir aracı kullanmak için muhtemelen en iyisidir. Ancak, kendi rulo istiyorum ya da sadece nasıl okumaya devam anlamak.

The HTML

Dosya ekleri göndermek için HTML sadece iki şartları gerçekten vardır.

  • Form, bu nitelik gerekir: enctype="multipart/form-data"
  • Sen <input type="file" name="examplefile"> gibi en az bir alan gerekir. Bu kullanıcı eklemek için bir dosyaya göz atmak için izin verir.

Bunlardan ikisi de varsa, the browser will upload any attached files along with the form submission.

Side note: These are saved as temporary files on the server. For this example, we'll take their data and email it, but if you move the temporary files to a permanent location, you've just created a file upload form.

The MIME Email Format

This tutorial PHP (HTML içeriği içerebilir, bir düz metin sürümünü, ekleri, vb) bir MIME e-posta oluşturmak için nasıl anlamak için harika. Ben bir başlangıç ​​noktası olarak kullanılır.

Temelde, üç şeyler:

  • Bu e-posta içinde birden çok içerik türlerini sahip olacağını ön beyan
  • Eğer farklı bölümleri ayırmak için kullanacağı metin bir dize bildirmek
  • Define each section and stick in the appropriate content. In the case of file attachments, you have to specify the type and encode them in ASCII.
    • Her bölüm olacak bir content-type gibi image/jpg veya application/pdf. Daha detaylı bilgi bulunabilir here. (Benim örnek komut kullanarak her dosya bu bilgileri çeker yerleşik PHP fonksiyonları.)

The PHP

Form gönderildikten sonra, tarayıcı tarafından yüklenen dosyalar (HTML bölümüne bakınız) HTTP POST yöntemi ile geçerli komut yüklenen öğeleri 'ilişkilendirilebilir bir dizi içeren $_FILES değişkeni, üzerinden satışa sunulacak . '

documentation üzerine $_FILES berbat, ancak bir yükleme sonra, print_r($_FILES) nasıl çalıştığını görmek için çalıştırabilirsiniz. Bu gibi çıktı bir şey olacaktır:

Array ( [examplefile] => Array ( [name] => your_filename.txt 
[type] => text/plain [tmp_name] => 
C:\path\to\tmp\file\something.tmp [error] => 0 [size] => 200 ) ) 

Daha sonra file_get_contents($_FILES['examplefile']['tmp_name']) ile ilişkili geçici dosyadaki verileri alabilirsiniz.

Side note on file size limits

php.ini eki boyutunu sınırlamak bazı ayarları vardır. this discussion daha fazla bilgi için bkz.

An Example PHP Function

Ben sayfada dahil ve bir form ile gönderilen dosya ekleri toplamak için kullanılabilir aşağıdaki işlevi yarattı. Kullanabilir ve / veya ihtiyaçlarınız için uyarlamak için çekinmeyin.

Toplam bağlanma sınırı keyfi, ancak büyük miktarlarda mail() komut çıkmaza veya bir gönderme veya alma e-posta sunucusu tarafından reddedilebilir. Kendi test yapın.

PHP (Note: The mail() function php.ini e-posta göndermek için bilmek bilgilere bağlıdır.)

function sendWithAttachments($to, $subject, $htmlMessage){
  $maxTotalAttachments=2097152; //Maximum of 2 MB total attachments, in bytes
  $boundary_text = "anyRandomStringOfCharactersThatIsUnlikelyToAppearInEmail";
  $boundary = "--".$boundary_text."\r\n";
  $boundary_last = "--".$boundary_text."--\r\n";

  //Build up the list of attachments, 
  //getting a total size and adding boundaries as needed
  $emailAttachments = "";
  $totalAttachmentSize = 0;
  foreach ($_FILES as $file) {
    //In case some file inputs are left blank - ignore them
    if ($file['error'] == 0 && $file['size'] > 0){
      $fileContents = file_get_contents($file['tmp_name']);
      $totalAttachmentSize += $file['size']; //size in bytes
      $emailAttachments .= "Content-Type: " 
      .$file['type'] . "; name=\"" . basename($file['name']) . "\"\r\n"
      ."Content-Transfer-Encoding: base64\r\n"
      ."Content-disposition: attachment; filename=\"" 
      .basename($file['name']) . "\"\r\n"
      ."\r\n"
      //Convert the file's binary info into ASCII characters
      .chunk_split(base64_encode($fileContents))
      .$boundary;
    }
  }
  //Now all the attachment data is ready to insert into the email body.
  //If the file was too big for PHP, it may show as having 0 size
  if ($totalAttachmentSize == 0) {
    echo "Message not sent. Either no file was attached, or it was bigger than PHP is configured to accept.";
   }
  //Now make sure it doesn't exceed this function's specified limit:
  else if ($totalAttachmentSize>$maxTotalAttachments) {
    echo "Message not sent. Total attachments can't exceed " .  $maxTotalAttachments . " bytes.";
  }
  //Everything is OK - let's build up the email
  else {    
    $headers =  "From: yourserver@example.com\r\n";
    $headers .=     "MIME-Version: 1.0\r\n"
    ."Content-Type: multipart/mixed; boundary=\"$boundary_text\"" . "\r\n";  
    $body .="If you can see this, your email client "
    ."doesn't accept MIME types!\r\n"
    .$boundary;

    //Insert the attachment information we built up above.
    //Each of those attachments ends in a regular boundary string    
    $body .= $emailAttachments;

    $body .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n"
    ."Content-Transfer-Encoding: 7bit\r\n\r\n"
    //Inert the HTML message body you passed into this function
    .$htmlMessage . "\r\n"
    //This section ends in a terminating boundary string - meaning
    //"that was the last section, we're done"
    .$boundary_last;

    if(mail($to, $subject, $body, $headers))
    {
      echo "<h2>Thanks!</h2>Form submitted to " . $to . "<br />";
    } else {
      echo 'Error - mail not sent.';
    }
  }    
}

Burada neler görmek istiyorsanız, mail() için çağrı açıklama ve yerine ekrana çıktı echo var.

Gerçek bir e-posta göndermek için ben PHPMailer library, her şey çok daha kolay hale getirir kullanarak öneriyoruz.

güzel tutorial here

Kod

<?php
//define the receiver of the email
$to = 'youraddress@example.com';
//define the subject of the email
$subject = 'Test email with attachment';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with \r\n
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com";
//add boundary string and mime type specification
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
//read the atachment file contents into a string,
//encode it with MIME base64,
//and split it into smaller chunks
$attachment = chunk_split(base64_encode(file_get_contents('attachment.zip')));
//define the body of the message.
ob_start(); //Turn on output buffering
?>
--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>"

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

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

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<h2>Hello World!</h2>
<p>This is something with <b>HTML</b> formatting.</p>

--PHP-alt-<?php echo $random_hash; ?>--

--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: application/zip; name="attachment.zip" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

<?php echo $attachment; ?>
--PHP-mixed-<?php echo $random_hash; ?>--

<?php
//copy current buffer contents into $message variable and delete current output buffer
$message = ob_get_clean();
//send the email
$mail_sent = @mail( $to, $subject, $message, $headers );
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";
?>

Sen SwiftMailer kontrol etmek isteyebilirsiniz. Bu güzel bir var tutorial on this.