Angular 7 结合 PHP 实现邮件发送时出现连接拒绝错误求助
解决Angular 7表单对接PHP后端时的连接拒绝问题
看起来你遇到的ERR_CONNECTION_REFUSED是前端无法连接到PHP服务器导致的,同时代码里还有几个细节问题需要修正,我一步步帮你排查解决:
1. 先确认PHP服务器是否正常运行
这个错误最常见的原因是你没有启动PHP内置服务器,或者服务器端口与配置不匹配。请按以下步骤操作:
- 打开终端,切换到你的Angular项目根目录
- 运行命令启动PHP服务器:
php -S 127.0.0.1:8080 - 启动后,在浏览器直接访问
http://127.0.0.1:8080/src/app/contact/contactMail.php,如果能看到页面(哪怕是空白或报错),说明服务器已正常运行。
2. 修正ApiService的请求参数与路径错误
你的sendEmail方法存在两个问题:
- POST请求发送的是
this.contact而非传入的表单数据form,导致PHP拿不到表单信息 - 请求URL路径与文件实际位置不匹配
修改api.service.ts的sendEmail方法:
sendEmail(form): Observable<Contact[]>{ // 把请求参数改为传入的form,同时修正URL路径 return this.httpClient.post<Contact[]>(`${this.PHP_API_SERVER}/src/app/contact/contactMail.php`, form); }
3. 优化PHP代码的健壮性
原PHP代码在未接收到数据或JSON解析失败时会直接报错,建议修改为:
header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: POST"); header('Access-Control-Allow-Headers: Content-Type'); // 获取POST数据 $postdata = file_get_contents("php://input"); // 检查是否接收到数据 if(empty($postdata)) { http_response_code(400); echo json_encode(['message' => 'No data received']); exit; } // 解析JSON并检查是否成功 $request = json_decode($postdata); if($request === null) { http_response_code(400); echo json_encode(['message' => 'Invalid JSON format']); exit; } // 安全提取表单数据(避免属性不存在报错) $name = htmlspecialchars($request->name ?? ''); $email = htmlspecialchars($request->email ?? ''); $phone = htmlspecialchars($request->phone ?? ''); $project = htmlspecialchars($request->project ?? ''); $notes = htmlspecialchars($request->notes ?? ''); $emailTo = "jg@gmail.com"; $to = $emailTo; $subject = "Correspondence from the Website"; // 优化发件人格式,降低被标记为垃圾邮件的概率 $headers = "From: " . $name . " <" . $email . ">\r\n"; $body = "Name: ".$name."\n Email: ".$email."\n Would like info on: " .$project." \nComments: " .$notes." \n"; $body = wordwrap($body,70); // 检查邮件发送状态并返回对应结果 if(mail($to, $subject, $body, $headers)) { $result = array('message'=>"Thank You " .$name." Your request has been sent."); echo json_encode($result); } else { http_response_code(500); echo json_encode(['message' => 'Failed to send email']); }
注意:本地环境下mail()函数可能无法直接发送邮件,若需测试可使用PHPMailer等库或配置本地邮件服务器。
4. 更规范的文件结构建议
把PHP后端文件和Angular源码混放不够规范,建议在项目根目录新建backend文件夹,将contactMail.php移入其中,然后启动PHP服务器时指定该文件夹为根目录:
cd /path/to/your/angular-project php -S 127.0.0.1:8080 -t backend
此时请求URL可简化为${this.PHP_API_SERVER}/contactMail.php,结构更清晰。
按照以上步骤调整后,应该就能解决连接拒绝问题,同时保证表单数据能正确传递到PHP后端。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

