使用phpmailer发送大量电子邮件,其中电子邮件正文是html表中sql查询的结果

时间:2016-08-28 10:45:35

标签: php html sql sql-server phpmailer

我会尽力解释我需要做的事情:

我有这个远程SQL数据库,其中存储了数千个os记录和表; 我用php和sqlsrv模块成功连接到这个数据库。

我运行的查询是:

$sql = "SELECT [FOURNI], [NU_INT], [NU_IMM], [NOM_EQP], [N_SERI], [TYP_MOD], [MARQUE], [NOM_UF], [NOM_ETAB], [DA_AP], [OBSERV], [OBSERV2], [INT_CM], [LIB_STATUT] FROM [INPROGRESS_WO_VIEW]
        WHERE [FOURNI] <> 'NULL'
        ORDER BY [FOURNI] ASC, [NU_INT] ASC";

这就是结果:

query result table

我还设置了phpmailer,并且已经能够向选定的地址发送电子邮件;

我需要做什么:

在查询中为每个[FOURNI](第1列)发送一封电子邮件,其中包含电子邮件正文中的HTML表格,该表格会返回特定[FOURNI]的所有行(在已发布的图片中,列标题为“Fornitore”)

大多数[FOURNI]有多个关联的行,你无法预测多少行; 我能够在不同的查询中关联每个[FOURNI]的电子邮件地址,从不同的表中获取参数并使用LEFT JOIN。

我需要能够使用变量并将它们放在主题中,例如:

$sub = "TEST EMAIL TO THIS  " . $fourni;

其中$ fourni是返回该单行数据的查询结果, 例如:

$sql = "SELECT [FOURNI] FROM [INPROGRESS_WO_VIEW]
        WHERE [FOURNI] = 'GAMBRO'";

如果这太混乱我很抱歉,我会尽量澄清。

我在Windows 10 32bit上使用WAMP - php 5.6.19 //远程数据库是Windows Server 2008上的SQL SERVER 2008 R2

谢谢

编辑2016年8月30日:

感谢@Synchro,我在phpmailer的示例文件中尝试了maillist文件,搜索了几个小时,found something,我已经提出了这个代码,但是当我运行它时它只是加载页面undefinitely:

//connection details and query
    $serverName = "**********"; //serverName\instanceName
    $connectionInfo = array( "Database"=>"******", "UID"=>"*****", "PWD"=>"*****");
    $conn = sqlsrv_connect( $serverName, $connectionInfo);

    if( $conn ) {
         echo "Connection established.<br />";
    }else{
         echo "Connection could not be established.<br />";
         die( print_r( sqlsrv_errors(), true));
    }

    $sql = "SELECT [FOURNI], [NU_INT], [NU_IMM], [NOM_EQP], [N_SERI], [TYP_MOD], [MARQUE], [NOM_UF], [NOM_ETAB], [DA_AP], [OBSERV], [OBSERV2], [INT_CM], [LIB_STATUT] FROM [INPROGRESS_WO_VIEW]
            WHERE [FOURNI] = <> 'NULL'
            ORDER BY [NU_INT] ASC";


    $sql2 = "SELECT DISTINCT FOURNI, AD_EMAIL FROM FOURNIS2
             WHERE FOURNI = 'BARBAGALLO'
             ORDER BY FOURNI";

    $stmt = sqlsrv_query($conn, $sql);
    if( $stmt === false ) {
         die( print_r( sqlsrv_errors(), true));
    }

    $stmt2 = sqlsrv_query($conn, $sql2);
    if( $stmt2 === false ) {
         die( print_r( sqlsrv_errors(), true));
    }

//here begins the mailing list

error_reporting(E_STRICT | E_ALL);

date_default_timezone_set('Etc/UTC');

require 'PHPMailerAutoload.php';

$mail = new PHPMailer;
$mail->isHTML(true);
$mail->isSMTP();
$mail->Host = 'smtps.aruba.it';
$mail->SMTPAuth = true;
$mail->SMTPKeepAlive = true;
$mail->Port = 465;
$mail->Username = '*****';
$mail->Password = '*****';
$mail->setFrom('*****');

$mail->Subject = "PHPMailer Simple database mailing list test";

include "sql.php";
$result = sqlsrv_fetch_array($stmt2, SQLSRV_FETCH_ASSOC);

foreach ($result as $row) { 
    $mail->addAddress($result["AD_EMAIL"], $result["FOURNI"]);    

    while ($result = sqlsrv_fetch_array($stmt2, SQLSRV_FETCH_ASSOC)) {
        $fornitore = $result['FOURNI'];
    }
    $body = "<table><tr><th>ODL</th><th>INV</th><th>APP.</th><th>SERIALE</th><th>MODELLO</th><th>MARCA</th></tr>";

    while($row2 = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {

    $body .= "<tr><td>".$row2['NU_INT']."</td><td>".$row2['NU_IMM']."</td><td>".$row2['NOM_EQP']."</td><td>".$row2['N_SERI']."</td><td>".$row2['TYP_MOD']."</td><td>".$row2['MARQUE']."</td></tr>"; 
}

$mail->Body = $body.'</table>';
$mail->set('X-Priority', '3'); //Priority 1 = High, 3 = Normal, 5 = low
$mail->Send();    
    // Clear all addresses and attachments for next loop
    $mail->clearAddresses();
if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}
}
?>

从这个例子中,我有一个邮件列表$ sql2由两列组成:FOURNI,AD_MAIL 从该表中运行第一个应该将电子邮件地址替换为addAddress字段的foreach;

对于我发送的每封电子邮件,我需要从$ sql表创建一个动态生成的html表,它返回表$ sql2中与列FOURNI(两个表中的第一列)相关联的所有行。

我尝试了一百种不同的错误方法,但我无法弄清楚编写代码的正确算法。

0 个答案:

没有答案