如何使用 AJAX 执行 PHP 电子邮件脚本? [当前代码不起作用]
Posted
技术标签:
【中文标题】如何使用 AJAX 执行 PHP 电子邮件脚本? [当前代码不起作用]【英文标题】:How to execute a PHP email script using AJAX? [Current code is not working] 【发布时间】:2017-01-02 12:45:15 【问题描述】:在浏览了 *** 和多个其他网站以解决我的问题后,我想出了一些使用 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 会更好,因为它取决于脚本的结果。我会试着给你看。 【参考方案1】:查看 AJAX 和 PHP 的页面源代码,了解 PHP 为您生成了什么。
我希望您的 AJAX 函数呈现如下:
<script type="text/javascript">
function sendEmail()
$.ajax(
method: 'get',
url: "job_email.php",
data:
'setBy': ,
'useremail': ,
'emailContent': ,
'emailSub':
,
success: function ()
alert("done");
);
</script>
问题变得更加明显,这实际上并没有发送任何数据。您已尝试使用 <?php $setBy ?>
等将这些数据从 PHP 提供到 Javascript,但这样做实际上并没有输出它 - 要实际输出它,您必须 echo
它。
<?php echo $setBy ?>
【讨论】:
检查页面源代码后,我的一个变量似乎没有给出输出。这反过来又导致整个 AJAX 功能失败。 我已经用一个新错误更新了这个问题。感谢您迄今为止的支持! :)以上是关于如何使用 AJAX 执行 PHP 电子邮件脚本? [当前代码不起作用]的主要内容,如果未能解决你的问题,请参考以下文章
ajax - 执行 php 脚本和数据验证时出错 - 如何解决?
使用 mail() PHP 脚本的 jQuery AJAX 表单发送电子邮件,但来自 HTML 表单的 POST 数据未定义