PHPMailer+PostgreSQL发邮件提示preg_match_all参数类型错误怎么办
报错原因
你代码中存在类型传参错误,具体问题如下:
- 初始化的
$html是fopen()返回的文件资源句柄(resource类型),并非HTML内容字符串 - 写完HTML内容、执行
fclose($html)后,你直接将已经关闭的文件资源句柄传给了sentEmailsReport函数的第四个参数 - PHPMailer的
MsgHTML()方法需要接收字符串类型的HTML内容作为参数,其内部会调用preg_match_all()处理内容,你传入资源类型就触发了对应报错,邮件内容异常也是因为没有传入实际的HTML文本。
解决方案
有两种可选方案,可根据你的需求选择:
方案1:直接拼接HTML字符串(不需要保留本地HTML文件时使用)
放弃通过文件句柄写本地文件的逻辑,直接用字符串变量拼接所有HTML内容,调整示例:
// 初始化改为字符串变量 $html = ''; $newline = "\r\n"; // 原来的所有fwrite($html, xxx)改为字符串拼接 $html .= '<html>'.$newline; $html .= '<head>'.$newline; // ... 其余所有HTML生成逻辑全部替换为.=拼接 // 不需要fclose操作 // 后续调用邮件函数直接传$html即可 sentEmailsReport($subject, $clientEmails, $companyEmails, $html, $attachment);
方案2:读取本地文件内容(需要保留本地HTML文件时使用)
写完文件关闭句柄后,读取文件的实际内容再传给邮件函数,调整示例:
// 原有写文件逻辑不变,fclose($html)之后新增代码 $htmlContent = file_get_contents("Status_movile_tccu.html"); // 调用邮件函数时传读取到的内容字符串,不要传原来的$html句柄 sentEmailsReport($subject, $clientEmails, $companyEmails, $htmlContent, $attachment);
内容的提问来源于stack exchange,提问作者Francisco Morales
相关产品推荐
相关产品推荐

