通过电子邮件发送动态生成的调查页面的内容

时间:2011-09-26 21:17:59

标签: php javascript html email limesurvey

我为同事的项目安装了调查网络应用LimeSurvey。它很棒。我已经根据自己的喜好定制了HTML,CSS(带有单独的打印样式表)和JavaScript。

我需要用户能够发送动态生成的问题页面的内容(在我们的案例中实际上是“建议”,但仍然是“系统问题”)在电子邮件正文中,或作为附件。此内容包含许多具有简单格式(一些粗体)文本内容的div。这个电子邮件最好使用我定义的打印样式表,但实际上任何可读的都可以。

我会使用像EcoSafe这样的现有服务,但该服务会访问给定的网址并将其转换为PDF。这意味着他们获得了调查的首页,而不是用户看到的动态生成的页面内容。

我已经搜索并发现了一些可以发送格式化电子邮件的PHP库,但我几乎没有PHP经验。我想也许我可以使用JavaScript或JQuery来获取页面内容,然后使用服务器端工具将该内容发送到电子邮件中...但我不知道从哪里开始。我可以完全访问我们的Web服务器,因此可以安装所需的任何库或脚本。

或者如果甚至有办法用mailto:链接做到这一点,那就足够了。

有人知道如何在电子邮件中发送动态生成页面的内容吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

编辑:正如Cheekysoft在评论中指出的那样,所写的代码不安全,并允许恶意用户通过您的应用发送任意电子邮件内容。

换句话说,不要使用下面的代码


我最终使用jQuery和PHP的组合来完成工作。

  1. 在我的调查页面上,我添加了一个小表单来收集用户的电子邮件地址。
  2. 我使用jQuery to POST此表单以及页面的包装器标记内容到PHP脚本。
  3. 在那个PHP脚本中,我使用Emogrifier使用样式表作为参考,为jQuery传入的HTML添加内嵌标记(因为most email clients, including Gmail, don't allow using linked styleheets)。
  4. 然后(仍然在PHP脚本中)我使用SwiftMailer发送了实际的电子邮件(感谢您指点我,Marc B)和Google Apps帐户的SMTP功能。
  5. 效果很好!

    如果它将来会帮助任何人,这里是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 = "sender@gmail.com";
    $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('sender@gmail.com' => '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="recipient@address.org" />
            <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>
    

答案 1 :(得分:1)

您可以使用LimeSurvey的附带系统。

  1. 使用表达式管理器构建您身体的某些部分:示例:“您对{QuestionCode.question}的回答是{QuestionCode.NAOK}”,在某个等式问题类型中(之后更容易使用)
  2. 使用'发送基本管理员通知电子邮件:'par来放置电子邮件地址:您也可以使用EM:例如{if(Q1.NAOK =='Y','yesadress@example.org','adress @ example.org')} ...
  3. 使用电子邮件模板/基本管理员通知来填写您需要的所有内容。
  4. 丹尼斯