Как я могу послать электронное письмо с вложениями от формы PHP?

Я aam более любящий использование Сетки и изменение ответа ввожу, у меня должна все же быть проблема с той методологией. Я не использовал прямые файлы с разделением табуляцией. Одна возможность является \n, возможно, придется быть \r\n. Просто слепой выстрел.

5
задан Nathan Long 25 August 2009 в 20:04
поделиться

4 ответа

Для отправки фактического сообщения электронной почты я бы рекомендовал использовать библиотеку PHPMailer , она все упрощает.

2
ответ дан 18 December 2019 в 10:47
поделиться

хороший учебник здесь

Код

<?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";
?> 
1
ответ дан 18 December 2019 в 10:47
поделиться

Вероятно, лучше всего использовать существующий инструмент, как предлагали другие в своих ответах. Однако, если вы хотите попробовать свои собственные или просто понять, как, продолжайте читать.

HTML

На самом деле в вашем HTML есть только два требования для отправки файловых вложений.

  • Ваша форма должна иметь этот атрибут: enctype = "multipart / form-data"
  • Вам нужно хотя бы одно поле, например . Это позволяет пользователю искать файл для вложения.

Если у вас есть оба из них, браузер загрузит все вложенные файлы вместе с отправкой формы .

Примечание: они сохраняются как временные файлы на сервере. В этом примере мы возьмем их данные и отправим их по электронной почте, но если вы переместите временные файлы в постоянное место, вы только что создали форму загрузки файлов.

Формат электронной почты MIME

Этот учебник отлично подходит для понимания того, как создать электронную почту MIME (которая может содержать содержимое HTML, текстовую версию, вложения и т. д.) в PHP. Я использовал это как отправную точку.

По сути, вы делаете три вещи:

  • заранее объявляете, что в этом электронном письме будет несколько типов содержимого.
  • Объявите строку текста, которую вы будете использовать для разделения различных разделов
  • Определите каждый раздел и вставьте соответствующий контент. В случае файловых вложений необходимо указать тип и закодировать их в ASCII.

    Формат электронной почты MIME

    Этот учебник отлично подходит для понимания того, как создать электронную почту MIME (которая может содержать содержимое HTML, текстовую версию, вложения и т. Д.) В PHP. Я использовал это как отправную точку.

    По сути, вы делаете три вещи:

    • заранее объявляете, что в этом электронном письме будет несколько типов содержимого.
    • Объявите строку текста, которую вы будете использовать для разделения различных разделов
    • Определите каждый раздел и вставьте соответствующий контент. В случае файловых вложений необходимо указать тип и закодировать их в ASCII.

      Формат электронной почты MIME

      Этот учебник отлично подходит для понимания того, как создать электронную почту MIME (которая может содержать содержимое HTML, текстовую версию, вложения и т. Д.) В PHP. Я использовал это как отправную точку.

      По сути, вы делаете три вещи:

      • заранее объявляете, что в этом электронном письме будет несколько типов содержимого.
      • Объявите строку текста, которую вы будете использовать для разделения различных разделов
      • Определите каждый раздел и вставьте соответствующий контент. В случае файловых вложений необходимо указать тип и закодировать их в ASCII.

        • Заранее объявите, что это электронное письмо будет содержать несколько типов содержимого.
        • Объявите строку текста, которую вы будете использовать для разделения различных разделов.
        • Определите каждый раздел и вставьте соответствующий контент. В случае файловых вложений необходимо указать тип и закодировать их в ASCII.

          • Заранее объявите, что это электронное письмо будет иметь несколько типов содержимого.
          • Объявите строку текста, которую вы будете использовать для разделения различных разделов.
          • Определите каждый раздел и вставьте соответствующий контент. В случае файловых вложений необходимо указать тип и закодировать их в ASCII.
            • Каждый раздел будет иметь тип содержимого , например image / jpg или application / pdf. Более подробную информацию можно найти здесь . (Мой пример сценария извлекает эту информацию из каждого файла с помощью встроенных функций PHP.)

          PHP

          После отправки формы любые файлы, загруженные браузером (см. Раздел HTML), будут доступны через переменная $ _ FILES , которая содержит «Ассоциативный массив элементов, загруженных в текущий скрипт с помощью метода HTTP POST».

          Документация на $ _ FILES ужасна, но после загрузки вы можете запустить print_r ($ _ FILES) , чтобы посмотреть, как это работает. Результат будет примерно таким:

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

          Затем вы можете получить данные в связанном временном файле, используя file_get_contents ($ _ FILES ['examplefile'] ['tmp_name']) .

          Дополнительное примечание об ограничениях размера файла

          php.ini имеет некоторые настройки, ограничивающие размер вложения. См. это обсуждение для получения дополнительной информации.

          Пример PHP-функции

          Я создал следующую функцию, которую можно включить на страницу и использовать для сбора любых вложений файлов, отправленных с формой. Не стесняйтесь использовать его и / или адаптировать под свои нужды.

          Общий лимит вложений является произвольным, но большие объемы могут затруднить выполнение сценария mail () или быть отклонены отправкой или получением электронной почты сервер. Проведите собственное тестирование.

          (Примечание: функция mail () в PHP зависит от информации в php.

12
ответ дан 18 December 2019 в 10:47
поделиться

Вы можете попробовать SwiftMailer . У него есть хорошее руководство по этому .

1
ответ дан 18 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: