使用php脚本跟踪php电子邮件?

时间:2011-06-15 05:36:10

标签: php email tracking newsletter

我正在使用php mail()函数发送电子邮件简报
我必须跟踪时事通讯的电子邮件状态
状态为 1. Num.Of Sent。
2. Num.Of Delivered。
3.交付日期。
4.总数。阅读 5.独特的数字。阅读 6.阅读日期。
7. Num.Of弹跳。
8. Total Num.Of用户点击了电子邮件中的链接 9.独特的Num.Of用户点击了电子邮件中的链接
从上述状态我可以跟踪以下内容:
1.已发送。 //这是从编码发送时跟踪的 8. Total Num.Of点击了电子邮件中的链接。 //通过在网址中添加其他参数来跟踪 9. Unique Num.Of点击电子邮件中的链接。 //通过在网址中添加其他参数来跟踪
如何跟踪从mail()功能发送的电子邮件的其他状态?
我必须发送和跟踪来自同一服务器的电子邮件。

7 个答案:

答案 0 :(得分:16)

您无法直接从mail()函数跟踪其他状态。技术上发送仅告诉您邮件已成功传递到服务器的出站邮件队列 - 您实际上无法判断它是否已离开您的服务器。

1 ,.您需要检查邮件服务器日志,以确切了解电子邮件何时离开服务器。

2,3。已交付和交付日期的数量 - 再次,您需要检查邮件服务器日志,以查看邮件何时(成功)移交给第三方邮件服务器。但是,这取决于您对这些统计数据的可靠性的定义(进入最终用户邮箱?进入他们的电子邮件客户端?)。

4,5,6。读取的总数,读取的唯一数字,读取日期。您无法准确跟踪此信息。但是,如果您发送了HTML电子邮件,则可以将图像嵌入到电子邮件中,从而使图像源成为您的网络服务器。如果每个图像URL都有您发送电子邮件的人的唯一标识符,那么您可以从服务器日志中跟踪这个(如果网址是返回图像的php脚本,则通过php跟踪)。但是,这依赖于最终用户允许从外部Web服务器加载图像(例如,Outlook和gmail默认关闭此功能)。

7 ,.如果您将发件人地址作为服务器上的脚本发送,则可以解析退回邮件并确定退回的数量。或者,您可以将发件人地址作为您进入的邮箱并手动检查。

8,9。电子邮件中的每个链接都需要是您网络服务器上网址的链接。该URL可以是一个脚本,可以跟踪谁(通过使用查询变量)和他们想要查看的内容(另一个查询变量),然后将它们(php中的标题函数)重定向到您希望它们结束的位置。

答案 1 :(得分:9)

要获得所有这些统计数据,您必须使用不同的系统:

检查发送的号码

邮件功能的返回代码不可靠,它只告诉您系统将开始尝试发送邮件。您必须使用通过SMTP本身进行通信的专用PHP类或解析系统邮件日志。但请记住,这个数字几乎毫无意义,这导致了下一点......

检查已交付的号码

即使您开始解析邮件日志或使用专门的PHP类自己通过SMTP发送,您也只能检查传递电子邮件的链中的第一台服务器。例如,在大公司中,邮件可能会传递到中央邮件服务器,您可以检查。然后将其发送到公司的另一个内部邮件服务器,该服务器拒绝邮件。你永远不会知道。甚至没有谈到垃圾邮件过滤器。因此,没有办法判断邮件是否已发送 - 直到下一点......

检查读取次数

更正式地说,您必须说“检查已打开的电子邮件数量”。为此,您可以向HTML邮件添加带有唯一URL的图像,例如http://mywebsite.com/images/IDOFRECIPIENT/IDOFMAILING/logo.jpg - 当请求URL时,您知道相应的收件人打开了邮件。缺点:如果收件人阻止外部内容的加载,你无能为力,你永远不会知道他的阅读。

链接的点击次数

这很简单:用您自己域名上的链接替换邮件中的所有链接。访问这些链接时,会引发一个计数器,并将访问者转发到真实站点。请注意:如果HTML电子邮件中的链接文本包含域名,但您链接到另一个域,则大多数电子邮件客户端都会认为它是垃圾邮件。例如,

www.citibank.com
不好。

跳出

这很难。在您的电子邮件中指定“发件人”标题。这是电子邮件退回的地址。您可以使用除“发件人”标题之外的其他地址,这意味着当收件人点击“回复”按钮时,他可以发送电子邮件至info@yourdomain.com,但如果它反弹,则电子邮件会发出反弹-123- 456@newsletter.yourdomain.com。

诀窍是创建弹跳地址作为整个域的全能 - 所以发送到“... @ newsletter.yourdomain.com”的每封电子邮件都应该转到同一个收件箱。在电子邮件地址中,您可以保存收件人和邮件的ID:bounces- [recipientid] - [mailingid] @ newsletter.yourdomain.com。收件人地址是弹跳时唯一可靠的数据,其他所有内容都可能被收件人的邮件服务器删除。

然后只需编写一个PHP脚本,通过POP3获取邮件并检查发件人。

希望我能帮到你!

答案 2 :(得分:4)

对于已发送的号码,您可以使用基本包装:

class Mailer
{
    /**
     * Events
     *
     * @var array
     */
    protected $_events = array();

    /**
     * Number of successful emails
     *
     * @var int
     */ 
    protected $_numFailures = 0;

    /**
     * Number of failed emails
     *
     * @var int
     */ 
    protected $_numSuccesses = 0;

    /**
     * Send email using PHP mail() function
     * 
     * @param string $to Send to email address
     * @param string $subject Email subject
     * @param string $message Email message
     * @param string $additionalHeaders Optional. Additional headers
     * @param string $additionalParams Optional. Additional params
     * @return Mailer
     */
    public function mail($to, $subject, $message, $additionalHeaders = '', $additionalParams = '')
    {
        $result = mail($to, $subject, $message, $additionalHeaders, $additionalParams);

        if ($result) {
            $this->_numSuccesses++;
        } else {
            $this->_numFailures++;
        }

        if (isset($this->_events['mail'])) {
            foreach ($this->_events['mail'] as $event) {
                $event($result, $to, $subject, $message);
            }
        }

        return $this;
    }

    /**
     * Get total number of emails sent
     *
     * @return int
     */
    public function count()
    {
        return $this->_numSuccesses + $this->_numFailures;
    }

    /**
     * Get number of successes
     *
     * @return int
     */
    public function getSuccessCount()
    {
        return $this->_numSuccesses;
    }

    /**
     * Get number of failures
     *
     * @return int
     */
    public function getFailureCount()
    {
        return $this->_numFailures;
    }

    /**
     * Add event
     * 
     * @param string $subject Event subject
     * @param Closure $event Event to execute when subject called
     * @return Mailer
     */
    public function addEvent($subject, Closure $event)
    {
        if (!is_string($subject)) {
            throw new InvalidArgumentException('$subject must be a string');
        }
        $this->_events[$subject][] = $event;
        return $this;
    }
}

/** Mailer */
$mailer = new Mailer();

$mailer->addEvent('mail', function($result, $to, $subject, $message) {
    // Code to log to database
});

$mailer->mail($to, $subject, $message);

// Execution order:
// 1. Mailer::mail()
// 2. Increase successes or failures, as appropriate
// 3. Execute 'mail' events
// 4. Closure with code to log to database executed

答案 3 :(得分:3)

您可以轻松记录通过PHP的mail()功能传输的任何外发邮件流量。

这是通过创建一个包装器来完成的,它将同时处理:记录和发送电子邮件。这相对容易实现,可以通过php.ini设置进​​行控制。

如果您正在运行linux,我可以推荐:How To Log Emails Sent With PHP's mail() Function To Detect Form Spam以获取更多详细信息。

答案 4 :(得分:1)

作为电子邮件营销中的PHP简报脚本,我们通常会在电子邮件中插入一小段或多个句子,以使其无形。 PHP函数将返回小图片的回显,以将跟踪状态返回到您的邮件服务器。当您打开简报并允许在电子邮件中显示所有图片时,此跟踪功能将被激活。

对于跳出系统,它必须引用服务器环境。只有在VPS或其他服务器中配置代码时,才能激活此代码。我相信你应该看到http://www.phpnewsletter.org

答案 5 :(得分:1)

您可以通过向php脚本和邮件功能添加一些额外的代码来跟踪电子邮件并获取阅读回执(更改电子邮件)。

这是一个可以帮助您track email read receipts - php script

的链接

答案 6 :(得分:0)

(修改)

这里的基本概念是您在PHP端记录发送。每条消息都有一些嵌入式HTML和图像。当用户打开电子邮件时,图像将向服务器发送ping,发送电子邮件已打开(读取)和日期(这可能来自服务器)以及其他信息(例如用于打开邮件的邮件客户端)(请求标题)。

关于交付的参数,我不完全确定。我知道您可以从某些类型的邮件服务器(例如Microsoft Exchange)获取此信息,但我不知道您的标准POP3服务器是否支持此功能。

您可以使用此方法自动收集大量数据。它确实像标准网页广告跟踪器一样工作。对于服务器端,我会推荐一个CMS框架,如Drupal或一个PHP框架,如CodeIgniter。

如果你去Drupal那么大部分繁重的工作都已经为你完成了。你只需要以你喜欢的方式组装拼图。我个人建议使用MailChimp来跟踪你的电子邮件。他们还有一个Drupal模块可以与它集成(http://drupal.org/project/mailchimp)。