Laravel环境下使用PHPMailer发送单封邮件失败问题咨询
代码问题排查与修复方案
现有代码的核心问题
- 参数不匹配问题:AJAX请求中传递的邮箱字段名为
email_button,但控制器中判断的是isset($_POST["email_data"]),且你将单个邮箱字符串当做数组进行遍历,逻辑完全无法进入发送流程 - 属性读取错误:HTML按钮中你定义的是
email_data属性,而非标准的data-*属性,用jQuery的data()方法无法读取到对应值 - 控制器逻辑错误:
- Laravel通过Composer自动加载类,无需手动require PHPMailer相关文件,额外引入的
class/class.phpmailer.php会造成类冲突 - 存在语法错误:
$$client_email多写了一个$变成可变变量,PHPMailer的send()方法返回布尔值而非数组,无法通过数组下标读取状态码 - 未做异常捕获,发送失败时无法拿到具体报错信息
- 重复调用
addAddress和To方法,To为PHPMailer旧版本废弃方法 - Gmail SMTP权限问题:目前Gmail不支持直接用账号密码登录SMTP,需要开启两步验证后生成专用应用密码才可使用
- AJAX成功回调中的判断是赋值操作
if(data = 'ok'),而非等值判断,会导致逻辑错误
- Laravel通过Composer自动加载类,无需手动require PHPMailer相关文件,额外引入的
修复步骤
- 修改HTML按钮属性,使用标准data属性存储邮箱
<button type="button" name="email_button" class="email_button" id="{{ $client->_id }}" data-email_data="{{ $client->email }}"> <i class="fas fa-envelope"></i> </button>
- 修改AJAX代码,修正传参字段和判断逻辑
<script> $(document).ready(function(){ $('.email_button').click(function(){ $(this).attr('disabled', 'disabled'); var id = $(this).attr("id"); var email_data = $(this).data("email_data"); $.ajax({ url:'{{ route('send-email-test') }}', method:'POST', data:{email_data: 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>
- 重写控制器发送逻辑
public function send_mail(\Illuminate\Http\Request $request) { $request->validate([ 'email_data' => 'required|email' ]); $targetEmail = $request->input('email_data'); try { $mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->Port = 587; $mail->SMTPAuth = true; $mail->Username = '你的 Gmail 账号'; $mail->Password = '你的Gmail应用密码'; // 需开启账号两步验证后生成 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->setFrom('你的Gmail账号', 'Coverage Giant'); $mail->addAddress($targetEmail); $mail->WordWrap = 50; $mail->isHTML(true); $mail->Subject = 'Welcome To Coverage Giant'; $mail->Body = '<p>Sed at odio sapien. Vivamus efficitur</p>'; $mail->AltBody = strip_tags($mail->Body); $mail->send(); return 'ok'; } catch (\PHPMailer\PHPMailer\Exception $e) { return $mail->ErrorInfo; } }
更适合Laravel的单邮件发送方案
直接使用Laravel自带的邮件系统,无需手动集成PHPMailer:
- 在
.env文件中配置SMTP参数,和你现有PHPMailer的配置保持一致即可 - 运行
php artisan make:mail WelcomeMail生成邮件类,在类中定义邮件主题、内容 - 控制器中直接调用
Mail::to($targetEmail)->send(new WelcomeMail())即可完成发送,自带异常处理、队列支持,更符合Laravel开发规范
内容的提问来源于stack exchange,提问作者Mark Johnson
相关产品推荐
相关产品推荐

