如何使用Yii2 Mailer将多条统计数据汇总发送至单封邮件
在Yii2中汇总多条电表统计数据到邮件发送
我来帮你搞定把多条电表统计数据汇总到同一封Yii2邮件里的需求,下面是具体的实现步骤和代码示例:
首先先确认你现有的查询代码没问题,先把它整理成规范的代码块:
// 你的SQL查询代码 $sql = "SELECT COUNT(DISTINCT od.`meter_serial`) AS 'OGP Created', COUNT(DISTINCT mp.`meter_id`) AS 'Installed & Un-Verified Meters', COUNT(DISTINCT ins.`meter_msn`) AS 'Installed & Verified', sd.`sub_div_code` AS 'SD Code',sd.`name` AS 'SD-Name' FROM `ogp_detail` od INNER JOIN `survey_hesco_subdivision` sd ON od.`sub_div` = sd.`sub_div_code` LEFT JOIN `meter_ping` mp ON od.`meter_id` = mp.`meter_id` LEFT JOIN `installations` ins ON od.`meter_serial` = ins.`meter_msn` WHERE od.`meter_type` = '3-Phase' GROUP BY sd.`name`"; $result = Yii::$app->db->createCommand($sql)->queryAll();
你查询到的数组结果是这样的(截取部分示例):
Array ( [0] => Array ( [OGP Created] => 7 [Installed & Un-Verified Meters] => 2 [Installed & Verified] => 4 [SD Code] => 37153 [SD-Name] => ALLAMA IQBAL ) [1] => Array ( [OGP Created] => 68 [Installed & Un-Verified Meters] => 3 [Installed & Verified] => 0 [SD Code] => 37281 [SD-Name] => BADIN ) // 更多数据... )
接下来我们把这些数据转换成易读的HTML表格,再通过Yii2 Mailer发送:
步骤1:构建HTML格式的邮件内容
邮件里用表格展示数据最清晰,我们可以循环查询结果生成表格,还可以加一点内联样式让表格更美观(邮件客户端对外部CSS支持差,所以用内联样式):
// 处理空结果的情况,避免报错 if (empty($result)) { Yii::$app->session->setFlash('warning', '没有找到任何电表统计数据!'); return $this->redirect(['your-index-page']); } // 开始构建HTML内容 $html = '<h3>三相电表统计数据汇总</h3>'; $html .= '<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%; font-family: Arial, sans-serif;">'; // 生成表头 $html .= '<tr style="background-color: #f0f0f0;">'; foreach (array_keys($result[0]) as $header) { $html .= '<th style="text-align: left;">' . htmlspecialchars($header) . '</th>'; } $html .= '</tr>'; // 填充表格数据 foreach ($result as $row) { $html .= '<tr>'; foreach ($row as $value) { $html .= '<td>' . htmlspecialchars($value) . '</td>'; } $html .= '</tr>'; } $html .= '</table>';
步骤2:调用Yii2 Mailer发送邮件
利用你已经配置好的Mailer,把上面的HTML作为邮件内容发送:
try { Yii::$app->mailer->compose() ->setFrom(['your-sender-email@domain.com' => '电表统计系统']) ->setTo(['recipient-email@domain.com' => '统计接收人']) // 可以设置多个收件人:->setTo(['email1@xxx.com', 'email2@xxx.com']) ->setSubject('【每日统计】三相电表安装及验证情况') ->setHtmlBody($html) ->send(); Yii::$app->session->setFlash('success', '统计邮件已成功发送!'); } catch (\Exception $e) { Yii::$app->session->setFlash('error', '邮件发送失败:' . $e->getMessage()); }
完整的控制器动作示例
把上面的代码整合到你的控制器动作里:
public function actionSendMeterStats() { // 执行SQL查询 $sql = "SELECT COUNT(DISTINCT od.`meter_serial`) AS 'OGP Created', COUNT(DISTINCT mp.`meter_id`) AS 'Installed & Un-Verified Meters', COUNT(DISTINCT ins.`meter_msn`) AS 'Installed & Verified', sd.`sub_div_code` AS 'SD Code',sd.`name` AS 'SD-Name' FROM `ogp_detail` od INNER JOIN `survey_hesco_subdivision` sd ON od.`sub_div` = sd.`sub_div_code` LEFT JOIN `meter_ping` mp ON od.`meter_id` = mp.`meter_id` LEFT JOIN `installations` ins ON od.`meter_serial` = ins.`meter_msn` WHERE od.`meter_type` = '3-Phase' GROUP BY sd.`name`"; $result = Yii::$app->db->createCommand($sql)->queryAll(); // 处理空结果 if (empty($result)) { Yii::$app->session->setFlash('warning', '没有找到任何电表统计数据!'); return $this->redirect(['index']); } // 构建HTML表格 $html = '<h3>三相电表统计数据汇总</h3>'; $html .= '<table border="1" cellpadding="8" cellspacing="0" style="border-collapse: collapse; width: 100%; font-family: Arial, sans-serif;">'; $html .= '<tr style="background-color: #f0f0f0;">'; foreach (array_keys($result[0]) as $header) { $html .= '<th style="text-align: left;">' . htmlspecialchars($header) . '</th>'; } $html .= '</tr>'; foreach ($result as $row) { $html .= '<tr>'; foreach ($row as $value) { $html .= '<td>' . htmlspecialchars($value) . '</td>'; } $html .= '</tr>'; } $html .= '</table>'; // 发送邮件 try { Yii::$app->mailer->compose() ->setFrom(['your-sender@example.com' => '电表统计系统']) ->setTo(['recipient@example.com']) ->setSubject('【每日统计】三相电表安装及验证情况汇总') ->setHtmlBody($html) ->send(); Yii::$app->session->setFlash('success', '统计邮件已成功发送给相关人员!'); } catch (\Exception $e) { Yii::$app->session->setFlash('error', '邮件发送失败,请检查配置:' . $e->getMessage()); } return $this->redirect(['index']); }
一些小提示
- 用
htmlspecialchars()转义内容,避免特殊字符导致邮件格式错乱或者XSS风险 - 如果需要发送纯文本版本,可以额外调用
setTextBody()方法添加纯文本内容 - 可以根据需求调整邮件的主题、发件人、收件人列表
内容的提问来源于stack exchange,提问作者Moeez
相关产品推荐
相关产品推荐

