2011-09-26 104 views
2

我安装了为同事项目设置的调查Web应用LimeSurvey。它效果很好。我已经定制了HTML,CSS(带有单独的打印样式表)和JavaScript。通过电子邮件发送动态生成的调查页面的内容

我需要的用户可以发送的问题动态生成的网页的内容(在我们的例子实际上是“建议”,但仍“问题”的系统)无论是在电子邮件的正文或作为附件。此内容包含许多带有简单格式(粗体)文本内容的div。最好这封电子邮件会使用我定义的打印样式表,但真正可以读取的任何东西都可以。

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

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

或者如果甚至有一种方法可以用mailto:链接执行此操作,那可能就足够了。

任何人都有关于如何发送电子邮件中动态生成的页面内容的想法?

在此先感谢。

+1

在PHP前,使用SwiftMailer或PHPMailer的两个可以很容易地发送HTML格式的电子邮件,带有附件。鉴于LimeSurvey本身似乎是用PHP编写的,您应该能够轻松拦截它的输出以获取HTML并使用SM或PHPM将其作为电子邮件向外重定向。 –

回答

1

您可以使用包括来自LimeSurvey的系统。

  1. 构建你的身体表达管理者的一些部分:例如:“你的答案{} QuestionCode.question是{} QuestionCode.NAOK”在一些方程问题的类型(更容易后再使用)
  2. 使用'发送基本的管理员通知电子邮件到:'par来放置电子邮件地址:您也可以使用EM:例如{if(Q1.NAOK =='Y','[email protected]','adress @ example。 org')} ...
  3. 使用电子邮件模板/基本管理通知来放置所有需要的内容。

丹尼斯

1

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


我结束了使用jQuery和PHP的组合来完成工作。

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

很好用!

在情况下,它会帮助任何人在未来,这里的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> 
+1

请记住,如果不添加健壮的身份验证或验证,攻击者可以滥用此PHP脚本向您的邮件服务器能够发送的任何收件人发送任意HTML内容的电子邮件。 – Cheekysoft

+0

你说得对。这段代码非常古老,从我真正了解web安全的任何事情之前。我已将接受的答案转换为Denis Chenu's,看起来很合理。 – LouieGeetoo

相关问题