【发布时间】:2017-01-02 12:45:15
【问题描述】:
在浏览了 stackoverflow 和多个其他网站以解决我的问题后,我想出了一些使用 SwiftMailer 的 AJAX 和 PHP 电子邮件脚本。
据我所知,我的 AJAX 没有运行,因此 PHP 脚本永远不会执行。
我的问题:我是否正确使用 AJAX 来执行我的脚本?另外,有没有办法达到我想要的结果?
背景:我正在开展一个学校课程项目,该项目基于家庭的时间表/轮班表。我几乎达到了第一次构建的标准,并决定添加一个功能,以便在安排工作时发送电子邮件。
电子邮件脚本(域已被审查):
<?php
$setBy = $_GET['setBy'];
$jobEmail = $_GET['jobEmail'];
$subject = $_GET['emailSub'];
$content = $_GET['emailContent'];
$headers = 'From: MyRota@*****' . "\r\n" .
'Reply-To: MyRota@*****' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
require_once '../swiftmailer/lib/swift_required.php';
$transport = Swift_MailTransport::newInstance();
// Create the message
$message = Swift_Message::newInstance();
$message->setTo(array(
$jobEmail => "MyFamilyRota User",
));
$message->setSubject($subject);
$message->setBody($emailContent);
$message->setFrom("MyRota@*****", "MyFamilyRota");
$mailer = Swift_Mailer::newInstance($transport);
$mailer->send($message);
电子邮件发送部分运行良好,但由于电子邮件发送需要很长时间,因此当页面位于实际调度的 .php 上时会导致页面运行缓慢。因此,我希望将电子邮件功能推送到一个替代脚本,该脚本将在不减慢用户体验的情况下处理它。
我的 AJAX/PHP(不包括整个文件,因为问题出在以下部分):
$emailContent = "Assigned Job: $jobName\nJob Description: $jobDesc\nAssigned By: $setBy\nStart Time: $time_start\nEnd Time: $time_end\n";
$emailContent = wordwrap($emailContent, $words = 70);
$subject = "New Job Assigned: $jobName!";
?>
<script type="text/javascript" src="jquery-3.1.0.js"></script>
<script type="text/javascript">
function sendEmail() {
$.ajax({
method: 'get',
url: "job_email.php",
data: {
'setBy': <?php $setBy ?>,
'useremail': <?php $emailRow[0] ?>,
'emailContent': <?php $emailContent ?>,
'emailSub': <?php $subject ?>
},
success: function () {
alert("done");
}});
}
</script>
<?php
echo "<script type='text/javascript'>sendEmail();</script>";
这是使用 AJAX 执行 php 脚本的正确方法还是我做错了什么?
(请原谅任何低效的代码或不好的做法。我对 PHP 和 Web 开发比较陌生,所以我知道我的代码的某些部分可能很草率。)
编辑 - 发送数据的表单:
<form id='login' action='jobAssigner.php' method='post' accept-charset='UTF-8'>
<fieldset>
<legend>Assign Job To <?php echo $_SESSION['assignee_name'] ?></legend>
<input type='hidden' name='submitted' id='submitted' value='1'/>
<label for='jobSelect'>Job Selection:</label>
<?php echo $select; ?>
<br />
<label for='time_start'>Job Start:</label>
<input type='datetime-local' name='time_start' id='time_start' value=''/>
<br />
<label for='time_end'>Job End:</label>
<input type='datetime-local' name='time_end' id='time_end' value=''/>
<br />
<input type='submit' name='assign' id='assign' value='Assign!' />
</fieldset>
</form>
这一切都应该正常工作,因为正在将作业添加到数据库并显示在即将到来的作业列表下。
更新:
用我的代码修复了一些错误后,我遇到了一个新错误,但 AJAX 函数现在正在运行。
AJAX 函数返回错误:POST http://******.com/home/job_email.php 500 (Internal Server Error)send @jquery-3.1.0.js:9392ajax @jquery- 3.1.0.js:8999sendEmail@jobAssigner.php:4(匿名函数)@jobAssigner.php:18
新的 AJAX:
function sendEmail() {
$.ajax({
method: 'POST',
url: "job_email.php",
data: {
'setBy': '<?php echo $newSetBy ?>',
'useremail': '<?php echo $emailRow[0] ?>',
'emailContent': '<?php echo $emailContent ?>',
'emailSub': '<?php echo $subject ?>'
},
success: function () {
alert("done");
}});
}
</script>
<?php
echo "<script type='text/javascript'>sendEmail();</script>";
更新:
感谢大家的贡献! :) 500 错误是在原始问题的过程中更改了一些变量名的结果。现在都修好了。
【问题讨论】:
-
您需要考虑您的脚本将触发什么操作。是某种形式的提交吗?
-
这是基于最近分配的作业的数据。这些数据的大部分来自一些 MySQL 查询。
-
那么您希望什么时候发送电子邮件?我的意思是,用户的确切操作是什么(按钮单击、数据提交、数据库的外部更改、每天一次等)
-
啊,数据是从一个页面通过表单上的post发送的。这被发送到脚本以将作业添加到数据库。该电子邮件旨在在此脚本的末尾发送,以通知用户已分配/计划了一项工作。
-
总结一下。此时,您正在将表单提交给 jobAssigner.php - 脚本,它由 sql-execution 脚本和您的 ajax try 组成,它在加载 jobAssigner.php 时发送电子邮件。将 sql -execution 移动到 job_email.php 会更好,因为它取决于脚本的结果。我会试着给你看。