使用 PHP/MySQL 自动化电子邮件活动,不确定如何构建查询

Posted

技术标签:

【中文标题】使用 PHP/MySQL 自动化电子邮件活动,不确定如何构建查询【英文标题】:Using PHP/MySQL to automate email campaign, not sure how to structure query 【发布时间】:2015-03-16 18:06:56 【问题描述】:

我有两个 mysql 表,一个包含订阅者详细信息,另一个用于跟踪谁收到了电子邮件、哪个活动、哪个版本等(分别是爬虫和 sent_mail。)我已经建立了一个可以通过爬虫表并基于 SendGrid API、Web 表单和一些 javascript 发送电子邮件的脚本。但我试图弄清楚如何告诉脚本从爬虫表中提取电子邮件,这些电子邮件没有在 sent_mail 表中列出当前活动。我知道我必须使用连接,但我不确定如何将逻辑构建到查询中。想法?我的尝试如下:

foreach ('SELECT crawler.email FROM crawler LEFT JOIN sent_mail ON crawler.email = sent_mail.email WHERE sent_mail.campaigns <> "$campaign"') as $address) as $address) 
    $email = new SendGrid\Email();
    $email
        ->addTo($address)
        ->setFrom($address)
        ->setSubject($title)
        ->setText($text)
        ->sethtml($text)
    ;
    $sendgrid->send($email);
    $db-> $query = "
          INSERT INTO sent_mail (email, campaigns, campaign_version)
          VALUES ($address, $campaign, $campaign_version)"; echo 'great success';

【问题讨论】:

您在这里使用什么应用程序或数据库框架?一般来说,使用字符串插值表示你做错了什么,因为你没有正确地escaping those variables。 我只是用普通的 php 编写这个,通过 PDO 访问 MySQL。它在我的本地服务器上运行,无法在整个互联网上使用,所以我不担心 SQL 注入。 对此不要随便。使用 PDO 正确地做到这一点并不难,并且如果此代码以某种方式投入生产,它会为您避免可能发生的破坏公司的错误。老实说,你在这里的马虎是没有任何借口的。 Prepared statements 真的很容易写。一旦有人在任何这些字符串中加上引号,你在这里所做的事情就会失败。 【参考方案1】:

我认为您正在寻找以下代码.. 我认为下面的代码可能会有所帮助

    $get_records = mysql_query('SELECT crawler.email as `email_val` FROM crawler LEFT JOIN sent_mail ON crawler.email = sent_mail.email WHERE sent_mail.campaigns <> "$campaign"');

$i = 1;
while($data = mysql_fetch_assoc($get_records))

    $to = $data['email_val'];
    $subject = 'Your Subject';

    // Always set content-type when sending HTML email
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

    // More headers
    $headers .= 'From: Your Name <you@you.com>' . "\r\n";


    $sendmail = mail($to,$subject,$message,$headers);
    if($sendmail)
        $insert = mysql_query("INSERT INTO sent_mail (email, campaigns, campaign_version)
          VALUES ('your value', 'your value', 'your value')");
        if($insert)
            echo  $i.'Value inserted & Mail sent to'.$data['email'];
        else
            echo  $i.'Value not inserted but Mail sent to'.$data['email'];
        
    else
        echo  $i.'Mail sending fail to'.$data['email'];
    
$i++;

注意:在运行上述代码之前,请确保您已经建立了数据库连接。

【讨论】:

我应该更清楚 - 如果给定的电子邮件已经在给定的活动中被击中(意味着活动在该电子邮件的 sent_mail 表条目中),我不希望它通过电子邮件发送再次。 因为您已经通过 SELECT 查询签入 db... 现在我正在更改我的代码,假设您在 $campaign 中传递了正确的值并且您提供了正确的表名和字段 mysql_query 到底在做什么?

以上是关于使用 PHP/MySQL 自动化电子邮件活动,不确定如何构建查询的主要内容,如果未能解决你的问题,请参考以下文章

Paypal php MySQL 集成教程

SQLSTATE [42000]:语法错误或访问冲突:1064 PHP/MySQL [关闭]

是否可以为不活动实现自动注销功能?

PHP/MySQL 活动 (ala facebook)

php+mysql 模拟队列发送邮件

PHP MySQL导致电子邮件