Laravel使用PHPMailer批量发邮件:多选Select参数处理报错求助
解决Laravel中PHPMailer批量发件的类型错误问题
错误原因
前端多选select的name属性为recipient[],提交后Laravel会自动将其解析为数组,但你在代码里用explode(',', $request->recipient)尝试处理数组,而explode要求第二个参数必须是字符串,这就导致了类型不匹配的错误。
修复步骤
- 直接使用
$request->recipient获取收件人数组,无需explode处理 - 建议添加表单验证,确保提交的是合法的邮箱数组
- 补充PHPMailer的SMTP配置和发送逻辑,否则邮件无法实际发出
修改后的控制器代码
public function sendBulkEmail(Request $request) { try { // 验证提交的收件人是数组且包含合法邮箱 $request->validate([ 'recipient' => 'required|array', 'recipient.*' => 'email:rfc,dns' ]); $recipients = $request->recipient; $mail = new PHPMailer(true); // 配置SMTP服务器(根据你的邮箱服务商填写) $mail->isSMTP(); $mail->Host = 'smtp.example.com'; // 示例:smtp.gmail.com、smtp.qq.com $mail->SMTPAuth = true; $mail->Username = 'your-email@example.com'; $mail->Password = 'your-email-password'; // 注意:部分服务商需用应用专用密码 $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; $mail->setFrom('sender@example.com', 'Sender'); $mail->addReplyTo('sender@example.com', 'Information'); // 遍历添加收件人 foreach ($recipients as $recipient) { $mail->addAddress(trim($recipient)); // 去除邮箱前后空格避免异常 } $mail->isHTML(true); $mail->Subject = 'Request'; $mail->Body = 'this test message'; // 执行发送 $mail->send(); return redirect()->back()->with('success', '批量邮件发送成功'); } catch (Exception $e) { return redirect()->back()->with('error', "邮件发送失败: {$mail->ErrorInfo}"); } }
额外优化建议
- 若担心前端提交的数组存在重复或空值,可提前过滤:
$recipients = array_filter(array_unique(array_map('trim', $request->recipient))); - SMTP配置需根据实际邮箱服务商调整,比如QQ邮箱可使用
smtp.qq.com,端口465(SSL加密)或587(TLS加密)
内容的提问来源于stack exchange,提问作者sally
相关产品推荐
相关产品推荐

