如何使用 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>

问题变得更加明显,这实际上并没有发送任何数据。您已尝试使用 &lt;?php $setBy ?&gt; 等将这些数据从 PHP 提供到 Javascript,但这样做实际上并没有输出它 - 要实际输出它,您必须 echo 它。

<?php echo $setBy ?>

【讨论】:

检查页面源代码后,我的一个变量似乎没有给出输出。这反过来又导致整个 AJAX 功能失败。 我已经用一个新错误更新了这个问题。感谢您迄今为止的支持! :)

以上是关于如何使用 AJAX 执行 PHP 电子邮件脚本? [当前代码不起作用]的主要内容,如果未能解决你的问题,请参考以下文章

ajax - 执行 php 脚本和数据验证时出错 - 如何解决?

使用 mail() PHP 脚本的 jQuery AJAX 表单发送电子邮件,但来自 HTML 表单的 POST 数据未定义

如何使用 jQuery 的 $.ajax() 函数来运行 php 脚本? [复制]

如何在 ios 解析服务器端执行 php 脚本?

如何保护 php 脚本?

如何使用 PHP 为 JQuery .ajax() 返回正确的成功/错误消息?