Отправить содержимое динамически созданной страницы опроса по электронной почте

У меня установлено веб-приложение для проведения опросов LimeSurvey, настроенное для проекта коллеги. Это прекрасно работает. Я настроил HTML, CSS (с отдельной таблицей стилей печати) и JavaScript по своему вкусу.

Мне нужно, чтобы пользователь мог отправлять содержимое динамически генерируемой страницы вопросов (в нашем случае на самом деле "рекомендации", но все же "вопросы" в систему) либо в теле электронной почты или в виде вложения. Этот контент содержит несколько элементов div с текстовым содержимым, отформатированным в простом формате (некоторые из них выделены жирным шрифтом). Предпочтительно, чтобы это электронное письмо использовало таблицу стилей печати, которую я определил, но на самом деле подойдет что угодно читабельное.

Я бы использовал существующую службу, такую ​​как EcoSafe, но эта служба сама посещает указанный URL-адрес и преобразует его в PDF-файл. Это означает, что они получают первую страницу опроса, а не динамически генерируемый контент страницы, который видит пользователь.

Я искал и нашел некоторые разговоры о библиотеках PHP, которые могут отправлять форматированные электронные письма, но у меня практически нет опыта работы с PHP. Я думаю, может быть, я могу использовать JavaScript или JQuery для захвата содержимого страницы, а затем серверный инструмент для отправки этого содержимого по электронной почте... но я не совсем знаю, с чего начать. У меня есть полный доступ к нашему веб-серверу, поэтому я могу установить любые необходимые библиотеки или скрипты.

Или, если есть способ сделать это с помощью mailto: ссылок, этого может быть достаточно.

У кого-нибудь есть идеи о том, как отправить содержимое динамически сгенерированной страницы по электронной почте?

Заранее спасибо.


person LouieGeetoo    schedule 26.09.2011    source источник
comment
Что касается PHP, использование SwiftMailer или PHPMailer позволяет легко отправлять электронные письма в формате HTML с вложениями. Учитывая, что сам LimeSurvey, похоже, написан на PHP, вы сможете легко перехватить его вывод, чтобы получить HTML и использовать либо SM, либо PHPM для перенаправления его наружу в виде электронного письма.   -  person Marc B    schedule 27.09.2011


Ответы (2)


Вы можете использовать включенную систему от LimeSurvey.

  1. Создайте часть своего тела с помощью Expression Manager: пример: «Ваш ответ на {QuestionCode.question} был {QuestionCode.NAOK}» в каком-то типе вопросов типа уравнения (после этого его будет проще использовать)
  2. Используйте «Отправить основное электронное письмо с уведомлением администратора на:», чтобы указать адрес электронной почты: вы также можете использовать EM: например, {if(Q1.NAOK=='Y','[email protected]','adress@example. орг')} ...
  3. Используйте шаблон электронной почты/базовое уведомление администратора, чтобы разместить весь необходимый контент.

Денис

person Denis Chenu    schedule 17.04.2014

РЕДАКТИРОВАТЬ: Как отмечает Cheekysoft в комментариях, этот код в том виде, в каком он написан, не является безопасным и позволит злоумышленнику отправлять любой произвольный контент электронной почты через ваше приложение.

Другими словами, не используйте приведенный ниже код как есть.


В итоге я использовал комбинацию jQuery и PHP, чтобы выполнить работу.

  1. На моей странице опроса я добавил небольшую форму для сбора адреса электронной почты пользователя.
  2. Я использовал jQuery для POST этой формы и содержимого тега-оболочки страницы для сценария PHP. .
  3. В этом PHP-скрипте я использовал Emogrifier, чтобы добавить встроенные теги в HTML-код, переданный в с помощью jQuery, используя таблицу стилей в качестве ссылки (поскольку большинство почтовых клиентов, включая Gmail, не позволяют использовать связанные таблицы стилей).
  4. Затем (все еще в PHP-скрипте) я отправил электронное письмо, используя SwiftMailer (спасибо, что указали мне на него, Марк Б. ) и функции SMTP учетной записи Google Apps.

Работает отлично!

На случай, если это поможет кому-нибудь в будущем, вот скрипт PHP (дезинфицированный):

<?php

/***** INITIALIZE *****/

/* Import libraries */
require_once 'swiftmailer/swift_required.php';
require_once 'emogrifier/emogrifier.php';

/* Email stylesheet location */
$stylesheet = 'http://example.com/email.css';

/* SMTP Account Info */
$smtpusername = "[email protected]";
$smtppassword = "senderpassword";
$smtpserver = "smtp.gmail.com";
$smtpport = 465;
$smtpsecurity = "ssl";


/***** RETRIEVE THE DATA *****/

/* Retrieve the passed-in variables */
/* HTML for the email body */
$html = $_POST['content'];
/* Recipient mail address */
$address = $_POST['address'];
/* Recipient name */
$name = $_POST['name'];
if ($name==NULL || $name=="") {
    $name = "You";
}

/***** MODIFY THE HTML *****/
// Get stylesheet contents as a string
$css = file_get_contents($stylesheet);

// Convert stylesheet into in-line styles using Emogrifier - http://www.pelagodesign.com/sidecar/emogrifier/
$converter = new Emogrifier($html, $css);
$content = $converter->emogrify();


/***** CREATE THE MESSAGE *****/

/* Create the message */
$message = Swift_Message::newInstance()

  //Give the message a subject
  ->setSubject("Results for $name")

  //Set the From address with an associative array
  ->setFrom(array('[email protected]' => 'Sender Name'))

  //Set the To addresses with an associative array
  ->setTo(array($address => $name))

  //Give it a body
  ->setBody($content, 'text/html')
  ;

/***** SEND THE EMAIL *****/

//Create the Transport
$transport = Swift_SmtpTransport::newInstance($smtpserver, $smtpport, $smtpsecurity)
  ->setUsername($smtpusername)
  ->setPassword($smtppassword)
  ;

//Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);

//Send the message
$result = $mailer->send($message);

if ($result == "1") {
    echo "<span class='sendstatus success'>Email sent successfully. </span>";
} else {
    echo "<span class='sendstatus failure'>An error occurred. Result code: $result </span>";
}

?>

А вот форма jQuery (немного упрощенная):

<div id="emailresults">
    <form id="emailRecsForm" action="http://example.com/emailresults/emailrecs.php"> <!-- THIS PAGE WHERE THE PHP ABOVE IS LOCATED -->
        <h3><img src="email-icon.png" /> Email Your Results</h3>
        <label for="name">Name</label><input type="text" id="name" name="name" placeholder="Recipient's name (optional)" />
        <label for="address">Email address</label><input type="text" id="address" name="address" class="required email" placeholder="[email protected]" />
        <div id="submitdiv"><input type="submit" class="submit" value="Send Results" /></div>
    </form>
    <!-- the result of the send will be rendered inside this div -->
    <div id="result"></div>
</div>

<script>
/* attach a submit handler to the form */
$("#emailRecsForm").submit(function(event) {
    /* stop form from submitting normally */
    event.preventDefault();

    $( "#submitdiv" ).empty().append('<span class="sendstatus working"><img src="/images/loadwheel.gif" alt="Sending..."></img></span>');

    /* get some values from elements on the page: */
    var $form = $( this ),
        name = $form.find( 'input[name="name"]' ).val(),
        address = $form.find( 'input[name="address"]' ).val(),
        html = $('.container').html(),
        url = "http://example.com/emailrecs.php";

    /* Send the data using post and put the results in a div */
    $.post( url, { name: name, address: address, content: html },
      function( data ) {
          $( "#submitdiv" ).empty().append('<br />').append( data ).append('<input type="submit" class="submit" value="Send Results" />');
          $form.find( 'input[name="name"]' ).val("");
          $form.find( 'input[name="address"]' ).val("");
      }
    );
});
</script>
person LouieGeetoo    schedule 29.09.2011
comment
Имейте в виду, что без добавления надежной аутентификации или проверки злоумышленник может злоупотребить этим PHP-скриптом, чтобы отправить электронное письмо с произвольным содержимым HTML любому получателю, которому может отправить ваш почтовый сервер. - person Cheekysoft; 05.10.2017
comment
Ты прав. Этот код довольно старый, еще до того, как я что-то понял о веб-безопасности. Я переключил принятый ответ на ответ Дениса Ченю, который выглядит достаточно разумным. - person LouieGeetoo; 05.10.2017