【问题标题】:Send single email according to Weblesson根据 Weblesson 发送单个电子邮件
【发布时间】:2021-12-19 09:21:26
【问题描述】:

我是编程新手,目前正在寻找仅发送一封电子邮件的方法,就像 网络课程 教给我的那样(我不想要大量电子邮件),这是链接:' How to Send Bulk Email in PHP using PHPMailer with Ajax JQuery'。

我有两个地方运行这个函数,一个是index.blade.php,一个是ClientController

index.blade.php

<form action="{{ route('clients.destroy',$client->id) }}" method="POST">
    <a href="{{ route('clients.edit',$client->id) }}">
        <i class="fas fa-pencil-alt"></i>
    </a>
    <button type="button" name="email_button" class="email_button" 
            id="{{ $client->_id }}"
            method="post" action="single" email_data="{{ $client->email }}">
        <i class="fas fa-envelope"></i>
    </button>
    @csrf
    @method('DELETE')
    <button type="submit"><i class="far fa-trash-alt"></i></button>
</form>

这是 index.blade.php

底部的 JQueryAjax
<script>
    $(document).ready(function(){
        $('.email_button').click(function(){
            $(this).attr('disabled', 'disabled');
            var id = $(this).attr("id");
            var action = $(this).data("action");
            var email_data = $(this).data("email_data");
            $.ajax({
                url:'{{ route('send-email-test') }}',
                method:'POST',
                data:{email_button: email_data, _token: '{{csrf_token()}}'},
                beforeSend:function(){
                    $('#'+id).html('Sending...');
                    $('#'+id).addClass('uk-text-danger');
                },
                success:function(data){
                    if(data = 'ok')
                    {
                        $('#'+id).text('Success');
                        $('#'+id).removeClass('uk-text-danger');
                        $('#'+id).removeClass('uk-text-info');
                        $('#'+id).addClass('uk-text-success');
                    }
                    else
                    {
                        $('#'+id).text(data);
                    }
                    $('#'+id).attr('disabled', false);
                }
            });
        });
    });
</script>

这是我的路线脚本

// Here's my script in layout
<script src="{{ asset('js/jquery.min.js') }}" type="text/javascript"></script>

// Here's my route
Route::post('send-email-test','ClientController@send_mail')->name('send-email-test');

创建索引后,我尝试使用 ajax 路由到我的控制器。

客户端控制器

namespace App\Http\Controllers;

use App\Models\Company\Client\Client;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

class ClientController extends Controller
{
    public function send_mail()
    {
        if(isset($_POST["email_data"]))
        {
            require 'vendor/phpmailer/phpmailer/src/Exception.php';
            require 'vendor/phpmailer/phpmailer/src/PHPMailer.php';
            require 'vendor/phpmailer/phpmailer/src/SMTP.php';
            require 'class/class.phpmailer.php';
            $output = '';
            foreach($_POST['email_data'] as $row)
            {
                $mail = new PHPMailer();
                $mail->IsSMTP();
                $mail->Host = 'smtp.gmail.com';
                $mail->Port = '587';   //Initially is 465, doesn't work    
                $mail->SMTPAuth = true;
                $mail->Username = 'xxxxxxx@gmail.com';
                $mail->Password = 'xxxxxxx';
                $mail->SMTPSecure = 'tls';  //Initially is SSL, doesn't work either     
                $mail->From = 'xxxxxxxx@gmail.com';
                $mail->FromName = 'Coverage Giant';
                $mail->addAddress($row["email_data"]);
                $mail->To($row["email_data"]);
                $mail->WordWrap = 50;
                $mail->IsHTML(true);
                $mail->Subject = 'Welcome To Coverage Giant';

                $mail->Body = '
                    <p>Sed at odio sapien. Vivamus efficitur</p>
                    ';

                $mail->AltBody = '';

                $client_email = $mail->Send();

                if($$client_email["code"] == '400')
                {
                    $output .= html_entity_decode($client_email['full_error']);
                }
            }
            if($output == '')
            {
                echo 'ok';
            }
            else
            {
                echo $output;
            }
        }
    }
} 

如你所见,我正在做与 Web 课相反的事情,因为 Webslesson 使用 index.phpsend_mail.php,我使用的是 index.blade.phpClientController。因为在应用了 Websleeson 向我展示的内容后,它不能很好地运行,所以我稍微反转引擎,认为它可能会反过来工作。

我现在的问题是,我的 JQuery 和 Ajax 运行正常,并且能够从 index.blade.php 路由到 ClientController。尽管如此,在路由到控制器之后,我似乎无法使用PHPMailer 发送一封电子邮件;也许我的控制器和 PHPMailer 有问题?

我也想知道,有没有更好的方法来发送一封电子邮件?

顺便说一句,我正在使用 MongoDB 和 Laravel。我的 UI 是 Uikit 而不是 Boostrap。

【问题讨论】:

标签: ajax laravel mongodb email phpmailer


【解决方案1】:

由于您使用的是 Laravel,因此使用 Laravel 的内置邮件类确实更容易,但是您已经使用 PHPMailer 到此为止,所以我会帮助您清理它...

您正在同时加载两个不同的 PHPMailer 副本。这很可能会导致重大问题! class.phpmailer.php 来自您不应该使用的非常旧的版本。看起来你的代码基于一个非常古老的 PHPMailer 示例——使用the latest ones from the repo

如果你正确使用了 composer(你应该知道你已经设置了一个 Laravel 项目),你不应该需要任何 require 行——如果你添加了@,自动加载器会为你加载类987654328@ 到您的composer.json 要求,as described in the readme

Port 应该是整数,而不是字符串:

$mail->Port = 465;

没有To() 方法;拨打addAddress添加收件人。

在循环中发送多条消息时,在循环外创建实例,并为每条消息重复使用它,记住在每次迭代结束时调用$mail-&gt;clearAddresses();,如the mailing list example所示。

这是一个特殊的代码,而且是错误的,因为send() returns a boolean,而不是一个数组:

if($$client_email["code"] == '400')

它不提供codefull_error 属性。如所有示例所示,您正在寻找ErrorInfo

总体而言,在使用任何开源软件包时,请始终参考原始文档和示例——随意编造一些东西并期望它能够正常工作并不能很好地为您服务。

【讨论】:

  • hmm...应用了之后好像还是不行,要不要改用laravel的swiftmailer?
  • 嗯,说“它不起作用”然后放弃并不是真正的编程!调查为什么它不起作用。它实际上是在运行代码吗?如果是,它会产生什么错误?您提供的参数是否有效以及您的期望是什么?关键函数的返回值是多少?了解如何使用调试器(使用体面的 IDE)并单步调试代码,以便了解它在做什么。
猜你喜欢
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多