Jquery отправьте письмо с вложениями - PullRequest
0 голосов
/ 01 июля 2019

Я работаю над jquery, чтобы загрузить вложения, чтобы я мог опубликовать имя файла через ajax. У меня проблема с хранением имени файла в массиве и отображением каждого имени файла в цикле, потому что он будет хранить 2 имени файла в массиве в одном индексе, используя этот код:

$(".file-list_yhs").each(function() {
    attachments[i++] = $(this).find('.vI').text();
});

Выход:

Array
{
    [0] => uploads/add email.txtemail.zip
}
Array

Должно быть:

Array
{
    [0] => uploads/add email.txt
}
Array
{
    [1] => uploads/email.zip
}

Вот полный код:

$(document).on('click','#domodal_send', function(e) {

    if ($(".notify-outer").css('display') == 'none') {

        var email = $("#domodal_email_receipt").val();
        var subject = $("#domodal_subject").val();
        var from_name = $("#avater_name").text();
        var from_email = $('#avater_email').text();
        var emailbody = $("#domodal_message").html();
        var attachments = [];
        var i = 0;

        $(".file-list_yhs").each(function() {
            attachments[i++] = $(this).find('.vI').text();
        });


         $.ajax({
                url: 'sendMail.php',
                type: 'POST',

                data : {
                    send_to: email,
                    from: from_name,
                    from_email: from_email,
                    emailsubject: subject,
                    emailbody: emailbody,
                    emailattachment: attachments
                },

                success: function(result)
                {
                    alert(result);
                }
         });
    }
});

SendMail.php:

<?php
require_once "Mail.php";
require_once "Mail/mime.php";
require_once('Mail/IMAPv2.php');

//Connect to the database
include('config.php');

$inbox = '{imap.example.com:993/imap/ssl/novalidate-cert}INBOX';
$mailserver = '{imap.example.com:993/imap/ssl/novalidate-cert}INBOX.Sent';

if (isset($_POST['send_to']))
{
    $from = "Robert <rob@example.com>";
    $to_email = $_POST['send_to'];
    $to = $firstname . " <$to_email>";
    $subject = $_POST['emailsubject'];
    $message = $_POST['emailbody'];
    $message_without_image = $_POST['emailbody'];
    $filenames =  $_POST['emailattachment'];
    $files = [];

    foreach ($filenames as $filename) {
        $files[] = 'uploads/' . $filename;
    }
    print_r($files);

    $username = 'username';
    $password = 'password';
    $smtp_hostname = "smtp.example.com";
    $port = "587";
    echo $files;

    /*$messageID = sprintf("<%s.%s@%s>",
            base_convert(microtime(), 10, 36),
            base_convert(bin2hex(openssl_random_pseudo_bytes(8)), 16, 36),
            'example.com');
    $date = date('Y-m-d H:i:s');
    $emailID = '';
    $sent_db = "SELECT email_id FROM sent WHERE email_id = '$messageID'";
    $sent_result = mysqli_query($link, $sent_db) or die($link->error);

    if(mysqli_num_rows($sent_result) == 0)
    {
        $sent_db1 = "INSERT INTO sent (id, email_id, email, sendDateTime, isRead, readDateTIme) VALUES ('', '$messageID', '$to', '$date', '0', '0000-00-00 00:00:00')";

        if (mysqli_query($link, $sent_db1)) {
            $emailID = mysqli_insert_id($link);
        }
    }
    $message .= "<img src=\"http://test.example.com/project/track/Images/signature.gif?id=".$emailID."&etc=".time()." \" style=\"width: 0; max-height:0; overflow:hidden; \">";

    $headers = array ('From' => $from, 
        'To' => $to, 'Subject' => $subject,
        'Reply-To' => $from,
        'Content-Type'  => 'Content-Type: text/plain; charset=UTF-8',
        'MIME-Version' => '1.0',
        'Received' => 'from smtp.example.com',
        'Date'  => date("r"),
        'Message-ID' => sprintf("<%s.%s@%s>",
            base_convert(microtime(), 10, 36),
            base_convert(bin2hex(openssl_random_pseudo_bytes(8)), 16, 36),
            'example.com'));

    $params = array ('host' => $smtp_hostname,
        'port' => $port,
        'auth' => 'PLAIN', // Note 1
        'socket_options' => array('ssl' => array('verify_peer_name' => false, 'verify_peer' => false)), // Note 2
        'username' => $username,
        'password' => $password);

    $mime_params = array(
        'text_encoding' => '7bit',
        'text_charset'  => 'UTF-8',
        'html_charset'  => 'UTF-8',
        'head_charset'  => 'UTF-8'
    );

    $crlf = "\r\n";
    $mime = new Mail_mime(array('eol' => $crlf));
    $body = $message;

    $mime->setTXTBody($body);
    $mime->setHTMLBody($body);

    if(!empty($files)) {
        $mime->addAttachment($files);
    }
    $body = $mime->get($mime_params);
    $headers = $mime->headers($headers);
    $smtp = Mail::factory ('smtp', $params);
    $mail = $smtp->send($to, $headers, $body);

    if (PEAR::isError($mail)) 
    {
        echo("<p>" . $mail->getMessage() . "</p>");
    }
    else 
    {
        echo("<p>Email has been sent!</p>");
    }
}
?>

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

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

Спасибо.

РЕДАКТИРОВАТЬ: Вот HTML:

<div style="width: 70%; margin-left: 10px; position:relative;" class="file-list_yhs">
  <div class="dL" tabindex="-1" id=":vw" aria-label="Attachment: edit_link1.png. Press enter to view the attachment and delete to remove it" style="position:relative;">
    <input id=":vp" name="attach" type="hidden" value="#msg-a:r-6685135251679589431_#msg-a:r-6685135251679589431_null_-1" checked="">
    <div style="display:flex">
      <a class="dO" id=":vq" style="display:flex;">
        <div id="domodal_attachment" class="vI">addd her email.txt</div>
        <div class="vJ">(0K)</div>
      </a>
      <div id=":vn" role="button" aria-label="Remove attachment" class="vq" tabindex="-1" data-tooltip="Remove attachment" style="position:absolute; right:5px; top:5px;"></div>
    </div>

  </div>
  <div class="dL" tabindex="-1" id=":vw" aria-label="Attachment: edit_link1.png. Press enter to view the attachment and delete to remove it" style="position:relative;">
    <input id=":vp" name="attach" type="hidden" value="#msg-a:r-6685135251679589431_#msg-a:r-6685135251679589431_null_-1" checked="">
    <div style="display:flex">
      <a class="dO" id=":vq" style="display:flex;">
        <div id="domodal_attachment" class="vI">email.zip</div>
        <div class="vJ">(183K)</div>
      </a>
      <div id=":vn" role="button" aria-label="Remove attachment" class="vq" tabindex="-1" data-tooltip="Remove attachment" style="position:absolute; right:5px; top:5px;"></div>
    </div>
  </div>
</div>

1 Ответ

2 голосов
/ 01 июля 2019

Вы создаете элемент массива для каждого .file-list_yhs DIV, а не для каждого .vI DIV. $(this).find('.vI').text() объединит тексты всех элементов .vI, найденных в каждом .file-list_yhs.

Измените ваш цикл на

$(".file-list_yhs .vI").each(function() {
    attachments.push($(this).text());
}

Вы также можете использовать .map:

attachments = $(".file-list_yhs .vI").map(function() {
    return $(this).text();
}).get();

.get() необходим в конце для преобразования объекта jQuery, который .map() возвращает в массив.

...