You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:48:56