邮件作为垃圾邮件发送 - phpmailer,如何避免

时间:2013-04-30 14:57:33

标签: php phpmailer spam spam-prevention

我知道,在第一眼看,很多用户将这个问题标记为重复,但在阅读了10多个问题之后,我没有得到任何满意的答案,几乎所有问题都有答案,例如“你可以做的事情不多。 “,”我不确定“,”没有确定的射击技巧“等等,这就是我写这个问题的原因,我认为这是非常普遍的问题,而且每个php开发人员至少面对它一次,确实足够的语言:) ,现在我的问题是......

我在项目管理应用程序上工作,并且在创建任何任务时使用phpmailer发送邮件,或者任何有关任何错误邮件的评论被发送给相关用户,实际上不是在动作发生后立即发送邮件我创建了'通知表我实际保存所有邮件数据和cron脚本然后发送所有邮件,这是我的cron脚本的一部分。

$query = "select * from notifications where  1 ";
    $projects = $obj_basic->get_query_data($query);  

    if(!empty($projects))
    {
        foreach($projects as $data)
        {       
            $message = html_entity_decode($data['content'], ENT_QUOTES);            
            list($ton, $email) =  get_name_email($data['to']);      

            if(!empty($email))
            {
                $query = "select send_notification from users where email='$email' AND send_notification !='1' ";
                $users = $obj_basic->get_query_data($query);
                if(!empty($users))
                {
                    $deleteQuery = "delete from notifications where id ='".$data['id']."'";
                    $obj_basic->run_query($deleteQuery, 'DELETE');
                    continue;
                }

                $comment_id = $data['reference_id'];
                $attribute = $data['attribute'];
                $mail = new PHPMailer();
                list($fromName, $fromEmail) =  get_name_email($data['from']);       
                if(!empty($comment_id) && $attribute == 'comment')
                {
                    $fromEmail = 'comment@changewebaddress.com';
                }

                $mail->SetFrom($fromEmail, $fromName);
                $mail->AddReplyTo($fromEmail, $fromName);
                $mail->AddAddress($email, $ton);
                $mail->BouncedTo = $fromEmail;
                $mail->IsHTML(true);                               
                $mail->Subject  = $data['subject'];              
                $mail->Body =  $message;        
                $MessageID = "<".md5($comment_id.'_'.$email).'@changewebaddress.com>';
                $mail->MessageID= $MessageID;

                if($mail->Send()) {         
                    if(!empty($comment_id) && $attribute == 'comment')
                    {
                        $query = "SELECT message_id FROM `project_comments` WHERE `id`='$comment_id'; ";
                        $project_comments = $obj_basic->get_query_data($query, 'SELECT');

                        if(!empty($project_comments))
                        {
                            $project_comments[0]['message_id'] = html_entity_decode(trim($project_comments[0]['message_id'], ","));
                            $query = "UPDATE  `project_comments` SET `message_id`=CONCAT_WS(',',  '".mysql_escape_string($project_comments[0]['message_id'])."', '".mysql_escape_string(html_entity_decode($MessageID))."') WHERE `id`='$comment_id'; ";
                            $obj_basic->run_query($query, 'UPDATE');
                        }                       
                    }                   
                    $deleteQuery = "delete from notifications where id ='".$data['id']."'"; 
                    $obj_basic->run_query($deleteQuery, 'DELETE'); 
                }           
            }
        }
    }

根据我测试的一切看起来不错,因为我使用phpmailer设置了所需的标题,它还在标题中设置了'Return-Path:'和'Reply-To:'。

这个问题是否有任何确切的解决方案

4 个答案:

答案 0 :(得分:15)

  1. 确保正在设置所有必需的标题。
  2. 检查是否有任何其他可选标题,您应该设置。
  3. 某些过滤器不赞成发送包含不匹配的文本/ HTML部分的HTML /多部分邮件。
  4. 绝对任何以编程方式发送的邮件都应该有关于如何选择退出的链接或说明。这通常只由人工策划的黑名单和ISP的滥用部门强制执行。
  5. 确保您的SMTP服务器未列入黑名单或声誉不佳。
  6. 确保您的网络服务器的声誉不佳。一些扫描仪包括链中每个MTA的声誉。
  7. 在发送消息之前,请先查看消息的内容。如果其中的任何内容甚至可以被粗略地解释为试图向某人出售某些东西,那就改变它。
  8. 将一只小动物献给黑暗的电子邮件神,希望不要抱希望。
  9. 检查标记为垃圾邮件的邮件标题,以查看垃圾邮件过滤系统是否留下了有关其被阻止原因的有用信息。
  10. 询问接收服务器的管理员邮件被阻止的原因。
  11. 接受没有,并且永远不会是“在这个问题上的确切解决方案”。如初。

答案 1 :(得分:3)

  

这个问题是否有任何确切的解决方案

不幸的是没有。这是一个非常重要的问题,其复杂程度很高,无法准确解决问题。

相反,您需要查找标记为垃圾邮件的每个电子邮件,这些电子邮件会导致垃圾邮件评分,并将其反向工程,然后再转换为您使用的软件和系统的部分 - 配置(改进配置和设置)或处理(修补您使用的软件并重新编译/部署)。

如果你想改善这个网站上的情况 - 你写道许多现有的问题都令人失望 - 请保留一份工作日志并记录每个案例。将此作为答案,以便将来的用户可以从中受益。这不会像以前的用户在网站上做的那样做错误,因为没有这个文档,因此缺少信息。

答案 2 :(得分:2)

接受的答案中有很多好的建议。此外,在我的DNS中添加SPF记录有助于避免垃圾邮件过滤器。了解有关SPF记录的更多信息:

http://en.wikipedia.org/wiki/Sender_Policy_Framework

Microsoft有一个帮助创建此类记录的工具:

http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/

答案 3 :(得分:1)

我知道这已经有了一个公认的答案,但这适用于那些可能像我一样遇到同样问题并在此结束的人。我有一个网站,邮件从我的网站发送到垃圾邮箱。即使我尝试使用phpmailer并将我们公司的邮件服务器添加为SMTP。

但是,通过白名单将网站的IP地址列入邮件服务器的发送过滤器,可以轻松解决这个问题。这是怎么做的我不知道,因为邮件服务器的管理员为我做了这个(谷歌,我猜)。

这样做意味着如果接收方对您的邮件服务器进行DNS查找或IP查找。邮件服务器告诉接收方它确实是从他或他的关联IP地址发送的,因此它不会最终出现在spambox中。

但是,如果你这样做,则不需要phpmailer,标准的mail()函数也可以。