2015-08-02 4 views
-4

Благодаря 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

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

screenshot of "two attachments", when there should only be one

Для полей ввода файлов, я звоню переменную таким образом ...

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'); 

?> 
+0

, если вы находитесь в WordPress, вы можете использовать 'wp_mail' для отправки электронной почты с прикреплением или без нее – mmm

+0

Я фактически использую wp_mail для отправки электронной почты (это в нижней части кода плагина), но, к сожалению, ошибка по-прежнему вернулся .. –

ответ

0

Просто проверьте, если дополнительное крепление устанавливается и пропустить часть, если нет:

if(isset($_FILES['cf-extra_attachment']['tmp_name'])) { 
    $second_attachment = chunk_split(base64_encode(file_get_contents($_FILES['cf-extra_attachment']['tmp_name']))); 
    $second_filename = $_FILES['cf-extra_attachment']['name']; 
} 
+0

спасибо! Я пробовал это, но, к сожалению, ошибка все равно возвращается. может ли быть, что поток MIME проверяет переменную и находит ее пустой? если да, то как я могу включить инструкцию if() в поток MIME для обеих границ привязки? –

+0

Вам нужно искать 'cf-extra-attachachement' в коде и делать то же самое. Также я заметил, что есть переменная '$ second_attachment' и' $ second_filename', которые связаны. Вы также должны сделать их условными, так как они также выдадут предупреждение –

0

отправить отсоединяемые с wp_mail, попробуйте этот

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']); 


     $attachements = array(); 

     if (isset($_FILES['cf-attachment']['tmp_name'])) { 
      $attachements[] = $_FILES['cf-attachment']['tmp_name']; 
     } 

     if (isset($_FILES['cf-extra_attachment']['tmp_name'])) { 
      $attachements[] = $_FILES['cf-extra_attachment']['tmp_name']; 
     } 


     $to = get_option('admin_email'); 

     $headers = "From: $name <$email>" . "\r\n"; 

     // If email has been processed for sending, display a success message 
     if (wp_mail($to, $subject, $message, $headers, $attachements)) { 
      echo '<div>'; 
      echo '<p>Thanks for contacting me, expect a response soon.</p>'; 
      echo '</div>'; 
     } else { 
      echo 'An unexpected error occurred'; 
     } 
    } 
} 

или другой вариант с установкой наименования аттестатов:

 add_action("phpmailer_init", function ($phpmailer) { 

      if (isset($_FILES['cf-attachment']['tmp_name'])) { 
       $phpmailer->addAttachment(
        $_FILES['cf-attachment']['tmp_name'] 
        , $_FILES['cf-attachment']['name'] 
       ); 
      } 

      if (isset($_FILES['cf-extra_attachment']['tmp_name'])) { 
       $phpmailer->addAttachment(
        $_FILES['cf-extra_attachment']['tmp_name'] 
        , $_FILES['cf-extra_attachment']['name'] 
       ); 
      } 

     }, 10, 1); 


     // 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'; 
     } 
Смежные вопросы