Благодаря wonderful tutorial by Agbonghama Collins, я начал работать над плагином WP для личного использования, который выводит простую форму контакта с файловыми вложениями.Отправка почты через PHP: Как отправить почту, если вложение пустое?
На данный момент есть два поля прикрепления файлов, но они не должны быть обязательными. Однако, если либо остается пустым, форма выводит следующее сообщение об ошибке:
WARNING: FILE_GET_CONTENTS() [FUNCTION.FILE-GET-CONTENTS]: FILENAME CANNOT BE EMPTY IN ~/SP-FORM-EXAMPLE.PHP ON LINE 55
электронной почты в конечном счете делает посыла, но приходит с двумя приложениями в любом случае, либо один или оба из которых пусто, в зависимости от того, что было загружено к форме. На следующем рисунке изображен, как он выглядит, если только одно вложение было включено:
Для полей ввода файлов, я звоню переменную таким образом ...
if (isset($_POST['cf-submitted'])) {
...
$first_attachment = chunk_split(base64_encode(file_get_contents($_FILES['cf-attachment']['tmp_name'])));
$first_filename = $_FILES['cf-extra_attachment']['name'];
$second_attachment = chunk_split(base64_encode(file_get_contents($_FILES['cf-attachment']['tmp_name'])));
$second_filename = $_FILES['cf-extra_attachment']['name'];
...
.. и передает почту как поток MIME. Итак, мой вопрос заключается в следующем: есть ли способ разрешить эти переменные быть пустым, когда электронная почта обрабатывается и отправляется, так что соответствующее количество вложений будет включено в отправленное письмо и никакая ошибка не будет возвращена? Примеры кода были бы полезны :)
И для более четкой ссылки, вот весь файл плагина. Он очень легкий и не использует вспомогательные скрипты. Спасибо всем заранее!!
<?php
/*
Plugin Name: Contact Form Plugin
Plugin URI: http://dbudell.com
Description: Modification to the "Simple non-bloated WordPress Contact Form" by Agbonghama Collins (http://w3guy.com); now allows for file attachments.
Version: 1.0
Author: Daniel Bogre Udell (@dbudell)
Author URI: http://dbudell.com
*/
function html_form_code() {
echo '<form enctype="multipart/form-data" action="' . esc_url($_SERVER['REQUEST_URI']) . '" method="post">';
echo '<p>';
echo 'Your Name (required) <br/>';
echo '<input type="text" name="cf-name" pattern="[a-zA-Z0-9 ]+" value="' . (isset($_POST["cf-name"]) ? esc_attr($_POST["cf-name"]) : '') . '" size="40" />';
echo '</p>';
echo '<p>';
echo 'Your Email (required) <br/>';
echo '<input type="email" name="cf-email" value="' . (isset($_POST["cf-email"]) ? esc_attr($_POST["cf-email"]) : '') . '" size="40" />';
echo '</p>';
echo '<p>';
echo 'Subject (required) <br/>';
echo '<input type="text" name="cf-subject" pattern="[a-zA-Z ]+" value="' . (isset($_POST["cf-subject"]) ? esc_attr($_POST["cf-subject"]) : '') . '" size="40" />';
echo '</p>';
echo '<p>';
echo 'File Attachment (required)';
echo '<input type="file" name="cf-attachment" size="40" />';
echo '</p>';
echo '<p>';
echo 'Second File Attachment (required)';
echo '<input type="file" name="cf-extra_attachment" size="40" />';
echo '</p>';
echo '<p>';
echo 'Your Message (required) <br/>';
echo '<textarea rows="10" cols="35" name="cf-message">' . (isset($_POST["cf-message"]) ? esc_attr($_POST["cf-message"]) : '') . '</textarea>';
echo '</p>';
echo '<p><input type="submit" name="cf-submitted" value="Send"></p>';
echo '</form>';
}
function deliver_mail() {
// if the submit button is clicked, send the email
if (isset($_POST['cf-submitted'])) {
// collect form values
$name = sanitize_text_field($_POST['cf-name']);
$email = sanitize_email($_POST['cf-email']);
$subject = sanitize_text_field($_POST['cf-subject']);
$message = esc_textarea($_POST['cf-message']);
$first_attachment = chunk_split(base64_encode(file_get_contents($_FILES['cf-attachment']['tmp_name'])));
$first_filename = $_FILES['cf-attachment']['name'];
$second_attachment = chunk_split(base64_encode(file_get_contents($_FILES['cf-extra_attachment']['tmp_name'])));
$second_filename = $_FILES['cf-extra_attachment']['name'];
$boundary =md5(date('r', time()));
$to = get_option('admin_email');
$headers = "From: $name <$email>" . "\r\n";
$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: multipart/alternative; boundary=\"_3_$boundary\"
--_3_$boundary
Content-Type: text/plain; charset=\"utf-8\"
Content-Transfer-Encoding: 7bit
$message
--_3_$boundary--
--_2_$boundary
Content-Type: application/octet-stream; name=\"$first_filename\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$first_attachment
--_2_$boundary--
--_1_$boundary
Content-Type: application/octet-stream; name=\"$second_filename\"
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$second_attachment
--_1_$boundary--";
// If email has been processed for sending, display a success message
if (wp_mail($to, $subject, $message, $headers)) {
echo '<div>';
echo '<p>Thanks for contacting me, expect a response soon.</p>';
echo '</div>';
} else {
echo 'An unexpected error occurred';
}
}
}
function cf_shortcode() {
ob_start();
deliver_mail();
html_form_code();
return ob_get_clean();
}
add_shortcode('test_contact_form', 'cf_shortcode');
?>
, если вы находитесь в WordPress, вы можете использовать 'wp_mail' для отправки электронной почты с прикреплением или без нее – mmm
Я фактически использую wp_mail для отправки электронной почты (это в нижней части кода плагина), но, к сожалению, ошибка по-прежнему вернулся .. –