基于SOAP请求返回JSON值的邮件发送及PHP数据提取问题
提取SOAP响应字段并用于邮件发送
看起来你已经搞定了SOAP请求和XML转关联数组的核心流程,接下来要提取$output里的DemoUName、DemoPass等值其实非常简单,直接通过数组键名就能访问,下面一步步给你说明:
1. 直接提取目标字段
你的$output是一个标准的关联数组,所以可以直接通过键名获取对应的值。为了避免某个字段不存在时触发报错,建议用null合并运算符给个默认值兜底:
// 提取需要的字段,字段不存在时返回默认值 $demoUName = $output['DemoUName'] ?? '未获取到用户名'; $demoPass = $output['DemoPass'] ?? '未获取到密码'; $futAcct = $output['FutAcct'] ?? '未获取到期货账户'; $resultMsg = $output['Result'] ?? '无系统返回信息';
如果习惯用传统方式,也可以用isset()判断:
$demoUName = isset($output['DemoUName']) ? $output['DemoUName'] : '未获取到用户名';
2. 整合到邮件发送逻辑
拿到这些字段后,就可以直接嵌入到邮件内容里了。下面用PHP原生的mail()函数举个例子(如果用PHPMailer等第三方库,逻辑是一样的,只是调用方式不同):
// 邮件配置 $to = '收件人邮箱@example.com'; $subject = '新Demo用户创建成功通知'; // 邮件内容,用提取到的变量填充 $message = <<<EOT 您好,新Demo用户已创建完成,详情如下: - 用户名:$demoUName - 密码:$demoPass - 期货账户:$futAcct - 系统返回信息:$resultMsg EOT; $headers = 'From: 系统通知@yourdomain.com' . "\r\n" . 'Reply-To: 系统通知@yourdomain.com' . "\r\n"; // 发送邮件 if(mail($to, $subject, $message, $headers)){ echo '用户信息生成成功,通知邮件已发送'; } else { echo '用户信息生成成功,但邮件发送失败'; }
3. 完整代码整合
把上面的逻辑加到你原有的代码里,完整版本如下:
$soap_do = curl_init(); curl_setopt($soap_do, CURLOPT_URL, $url2 ); curl_setopt($soap_do, CURLOPT_HEADER, false); curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 100); curl_setopt($soap_do, CURLOPT_TIMEOUT, 100); curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true ); curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($soap_do, CURLOPT_POST, true ); curl_setopt($soap_do, CURLOPT_POSTFIELDS, $xml_post_string); curl_setopt($soap_do, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($soap_do); if ($result === false) { $err = 'Curl error: ' . curl_errno($soap_do); print $err; } else { $xml = simplexml_load_string($result); $body = $xml->xpath("//soapenv:Body//demosetupReturn")[0]; $output = []; foreach ( $body as $item) { $output[(string)$item->key] = (string)$item->value; } // 提取目标字段 $demoUName = $output['DemoUName'] ?? '未获取到用户名'; $demoPass = $output['DemoPass'] ?? '未获取到密码'; $futAcct = $output['FutAcct'] ?? '未获取到期货账户'; $resultMsg = $output['Result'] ?? '无系统返回信息'; // 发送通知邮件 $to = 'recipient@example.com'; $subject = '新Demo用户创建成功'; $message = "新用户创建详情:\n"; $message .= "用户名:$demoUName\n"; $message .= "密码:$demoPass\n"; $message .= "期货账户:$futAcct\n"; $message .= "系统返回信息:$resultMsg\n"; $headers = 'From: noreply@yourdomain.com' . "\r\n"; if(mail($to, $subject, $message, $headers)){ echo '操作完成,邮件已发送'; } else { echo '用户信息已生成,但邮件发送失败'; } // 如果仍需要输出JSON给前端,保留此行 // echo json_encode($output); } curl_close($soap_do);
额外提醒
- 生产环境中建议开启
CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST,关闭这两个选项会带来SSL安全风险。 - 如果邮件发送需求复杂(比如HTML邮件、附件),推荐使用PHPMailer或SwiftMailer这类成熟的邮件库,比原生
mail()更稳定灵活。
内容的提问来源于stack exchange,提问作者Dirty Bird Design
相关产品推荐
相关产品推荐

