2011-01-01 2 views
1

내 서버에서 PHP로 메일을 보내지 만 메일은 항상 스팸 폴더로 이동합니다. 나는 spf 레코드를했지만 그게 중요하지 않았다. 또한이 도메인과 Google 애플 리케이션 서비스를 사용합니다.내 전자 메일 항상 스팸 폴더로 이동

Delivered-To: [email protected] 
Received: by 10.42.178.133 with SMTP id bm5cs95762icb; 
     Fri, 31 Dec 2010 19:49:46 -0800 (PST) 
Received: by 10.223.112.1 with SMTP id u1mr875459fap.109.1293853785941; 
     Fri, 31 Dec 2010 19:49:45 -0800 (PST) 
Return-Path: <[email protected]> 
Received: from loft1397.serverloft.eu (loft1397.serverloft.eu [82.25.120.6]) 
     by mx.google.com with ESMTPS id 17si15455863fau.0.2010.12.31.19.49.45 
     (version=TLSv1/SSLv3 cipher=RC4-MD5); 
     Fri, 31 Dec 2010 19:49:45 -0800 (PST) 
Received-SPF: pass (google.com: best guess record for domain of [email protected] designates 82.25.120.6 as permitted sender) client-ip=82.25.120.6; 
Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of [email protected] designates 82.25.120.6 as permitted sender) [email protected] 
Received: from loft1397.serverloft.eu (unknown [127.0.0.1]) 
    by loft1397.serverloft.eu (Postfix) with ESMTP id 145B623A87F4 
    for <[email protected]>; Sat, 1 Jan 2011 03:49:45 +0000 (UTC) 
Received: by loft1397.serverloft.eu (Postfix, from userid 48) 
    id EED7623A8831; Sat, 1 Jan 2011 03:49:44 +0000 (UTC) 
To: [email protected] 
Subject: Test mail 
From: [email protected] 
Message-Id: <[email protected]> 
Date: Sat, 1 Jan 2011 03:49:44 +0000 (UTC) 

Hello! This is a simple email message. 

도메인 SPF 기록 : : 원래

메일 도와주세요는 V는 = spf1의 IP4 : 82.25.120.6 IP4 : 85.25.122.12은 다음과 같습니다 _spf.google.com ~ 모든

+0

이메일을 보내기 위해 무엇을 사용하고 있습니까? – RobertPitt

+0

가능한 복제본 [프로그래밍 방식으로 보내는 전자 메일이 자동으로 스팸으로 표시되지 않도록하려면 어떻게합니까?] (http://stackoverflow.com/questions/371/how-do-you-make-sure-email-you-send -programmatically-is-not-automatically-marked) –

+0

RoberPitt : http://pastebin.com/1JWEfXnE – mTuran

답변

3

먼저,이 문제를 장기적으로 해결하기 위해 할 수있는 최선의 방법은 이메일을 보내는 서비스를 이용하는 것입니다. 이 중 많은,하지만 난이 세 가지에 대해 좋은 것들을 들었어요 :

시원하게 여겨지는 새로운 참가자 인 http://www.emailyak.com/도 있지만 아직 베타 버전입니다. 모든 서비스는 매우 저렴하며 수퍼 간단한 API를 가지고 있으며 문제를 즉시 해결할 수 있습니다.

이것이 옵션이 아니거나 그 방향으로 가고 싶지 않은 경우 메시지가 생성되는 이유를 보여주는 스팸 보고서를 생성해야합니다 (또는 보낼 사람이 필요합니다). 스팸 폴더. 여기에 내가 스팸 암살자에서 무슨 말인지의 예

Content analysis details: (7.9 points, 6.0 required) 

pts rule name    description 
---- ---------------------- -------------------------------------------------- 
3.2 FH_DATE_PAST_20XX  The date is grossly in the future. 
1.1 DNS_FROM_OPENWHOIS  RBL: Envelope sender listed in bl.open-whois.org. 
0.6 SPF_SOFTFAIL   SPF: sender does not match SPF record (softfail) 
0.0 UNPARSEABLE_RELAY  Informational: message has unparseable relay lines 
1.6 HTML_IMAGE_ONLY_28  BODY: HTML: images with 2400-2800 bytes of words 
0.0 HTML_MESSAGE   BODY: HTML included in message 
0.0 BAYES_50    BODY: Bayesian spam probability is 40 to 60% 
          [score: 0.5000] 
1.5 MIME_HTML_ONLY   BODY: Message only has text/html MIME parts 

이 정보가 있으면, 문제를 진단 할 수 있습니다. 나는 그것이 귀하의 SPF 기록과 관련이 있는지 의심 스럽지만, 헤더에 "합격"으로 표시 되더라도 긍정적 인 것은 어렵습니다.

행운을 빈다. 에릭에 의해 언급 한 바와 같이

2

, 그래서 난 것 통과로 SPF가 언급되지만 아래로 당신의 PHP 주요 기능

에 기형 헤더하기 때문입니다 코드, 당신은 :

<?php 
$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; 
$headers .= "From: UzmanKirala <[email protected]>\r\n"; 

$mail_body = "This<br />is<br />a<br />test<br />mail."; 
mail('[email protected]', 'Subject', $mail_body, $headers); 
?> 

구글이 읽습니다 이것은 경계가 없으므로 메일 형식이 잘못되었다는 것을 알 수 있습니다. 올바른 새 라인이 부족합니다.

전자 메일 형식에 대해 전체 RFC를 설명하지는 않지만 대신 항상 사용하는 파일을 가리키며 아주 잘 작동합니다.

<?php 
class Mail { 
    protected $to; 
    protected $from; 
    protected $sender; 
    protected $subject; 
    protected $text; 
    protected $html; 
    protected $attachments = array(); 
    public $protocol = 'mail'; 
    public $hostname; 
    public $username; 
    public $password; 
    public $port = 25; 
    public $timeout = 5; 
    public $newline = "\n"; 
    public $crlf = "\r\n"; 
    public $verp = FALSE; 
    public $parameter = ''; 

    public function setTo($to) { 
     $this->to = $to; 
    } 

    public function setFrom($from) { 
     $this->from = $from; 
    } 

    public function addheader($header, $value) { 
     $this->headers[$header] = $value; 
    } 

    public function setSender($sender) { 
     $this->sender = html_entity_decode($sender, ENT_COMPAT, 'UTF-8'); 
    } 

    public function setSubject($subject) { 
     $this->subject = html_entity_decode($subject, ENT_COMPAT, 'UTF-8'); 
    } 

    public function setText($text) { 
     $this->text = $text; 
    } 

    public function setHtml($html) { 
     $this->html = $html; 
    } 

    public function addAttachment($file, $filename = '') { 
     if (!$filename) { 
      $filename = basename($file); 
     } 

     $this->attachments[] = array(
      'filename' => $filename, 
      'file'  => $file 
     ); 
    } 

    public function send() { 
     if (!$this->to) { 
      exit('Error: E-Mail to required!'); 
     } 

     if (!$this->from) { 
      exit('Error: E-Mail from required!'); 
     } 

     if (!$this->sender) { 
      exit('Error: E-Mail sender required!'); 
     } 

     if (!$this->subject) { 
      exit('Error: E-Mail subject required!'); 
     } 

     if ((!$this->text) && (!$this->html)) { 
      exit('Error: E-Mail message required!'); 
     } 

     if (is_array($this->to)) { 
      $to = implode(',', $this->to); 
     } else { 
      $to = $this->to; 
     } 

     $boundary = '----=_NextPart_' . md5(time()); 

     $header = ''; 

     if ($this->protocol != 'mail') { 
      $header .= 'To: ' . $to . $this->newline; 
      $header .= 'Subject: ' . $this->subject . $this->newline; 
     } 

     $header .= 'From: ' . $this->sender . '<' . $this->from . '>' . $this->newline; 
     //$header .= 'From: "' . $this->sender . '" <' . $this->from . '>' . $this->newline; 
     $header .= 'Reply-To: ' . $this->sender . '<' . $this->from . '>' . $this->newline; 
     $header .= 'Return-Path: ' . $this->from . $this->newline; 
     $header .= 'X-Mailer: PHP/' . phpversion() . $this->newline; 
     $header .= 'MIME-Version: 1.0' . $this->newline; 
     $header .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . $this->newline; 

     if (!$this->html) { 
      $message = '--' . $boundary . $this->newline; 
      $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline; 
      $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; 
      $message .= $this->text . $this->newline; 
     } else { 
      $message = '--' . $boundary . $this->newline; 
      $message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $this->newline . $this->newline; 
      $message .= '--' . $boundary . '_alt' . $this->newline; 
      $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline; 
      $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline; 

      if ($this->text) { 
       $message .= $this->text . $this->newline; 
      } else { 
       $message .= 'This is a HTML email and your email client software does not support HTML email!' . $this->newline; 
      } 

      $message .= '--' . $boundary . '_alt' . $this->newline; 
      $message .= 'Content-Type: text/html; charset="utf-8"' . $this->newline; 
      $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline; 
      $message .= $this->html . $this->newline; 
      $message .= '--' . $boundary . '_alt--' . $this->newline; 
     } 

     foreach ($this->attachments as $attachment) { 
      if (file_exists($attachment['file'])) { 
       $handle = fopen($attachment['file'], 'r'); 
       $content = fread($handle, filesize($attachment['file'])); 

       fclose($handle); 

       $message .= '--' . $boundary . $this->newline; 
       $message .= 'Content-Type: application/octetstream' . $this->newline; 
       $message .= 'Content-Transfer-Encoding: base64' . $this->newline; 
       $message .= 'Content-Disposition: attachment; filename="' . basename($attachment['filename']) . '"' . $this->newline; 
       $message .= 'Content-ID: <' . basename($attachment['filename']) . '>' . $this->newline . $this->newline; 
       $message .= chunk_split(base64_encode($content)); 
      } 
     } 

     $message .= '--' . $boundary . '--' . $this->newline; 

     if ($this->protocol == 'mail') { 
      ini_set('sendmail_from', $this->from); 

      if ($this->parameter) { 
       mail($to, $this->subject, $message, $header, $this->parameter); 
      } else { 
       mail($to, $this->subject, $message, $header); 
      } 

     } elseif ($this->protocol == 'smtp') { 
      $handle = fsockopen($this->hostname, $this->port, $errno, $errstr, $this->timeout); 

      if (!$handle) { 
       error_log('Error: ' . $errstr . ' (' . $errno . ')'); 
      } else { 
       if (substr(PHP_OS, 0, 3) != 'WIN') { 
        socket_set_timeout($handle, $this->timeout, 0); 
       } 

       while ($line = fgets($handle, 515)) { 
        if (substr($line, 3, 1) == ' ') { 
         break; 
        } 
       } 

       if (substr($this->hostname, 0, 3) == 'tls') { 
        fputs($handle, 'STARTTLS' . $this->crlf); 

        while ($line = fgets($handle, 515)) { 
         $reply .= $line; 

         if (substr($line, 3, 1) == ' ') { 
          break; 
         } 
        } 

        if (substr($reply, 0, 3) != 220) { 
         error_log('Error: STARTTLS not accepted from server!'); 
        } 
       } 

       if (!empty($this->username) && !empty($this->password)) { 
        fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . $this->crlf); 

        $reply = ''; 

        while ($line = fgets($handle, 515)) { 
         $reply .= $line; 

         if (substr($line, 3, 1) == ' ') { 
          break; 
         } 
        } 

        if (substr($reply, 0, 3) != 250) { 
         error_log('Error: EHLO not accepted from server!'); 
        } 

        fputs($handle, 'AUTH LOGIN' . $this->crlf); 

        $reply = ''; 

        while ($line = fgets($handle, 515)) { 
         $reply .= $line; 

         if (substr($line, 3, 1) == ' ') { 
          break; 
         } 
        } 

        if (substr($reply, 0, 3) != 334) { 
         error_log('Error: AUTH LOGIN not accepted from server!'); 
        } 

        fputs($handle, base64_encode($this->username) . $this->crlf); 

        $reply = ''; 

        while ($line = fgets($handle, 515)) { 
         $reply .= $line; 

         if (substr($line, 3, 1) == ' ') { 
          break; 
         } 
        } 

        if (substr($reply, 0, 3) != 334) { 
         error_log('Error: Username not accepted from server!'); 
        } 

        fputs($handle, base64_encode($this->password) . $this->crlf); 

        $reply = ''; 

        while ($line = fgets($handle, 515)) { 
         $reply .= $line; 

         if (substr($line, 3, 1) == ' ') { 
          break; 
         } 
        } 

        if (substr($reply, 0, 3) != 235) { 
         error_log('Error: Password not accepted from server!'); 
        } 
       } else { 
        fputs($handle, 'HELO ' . getenv('SERVER_NAME') . $this->crlf); 

        $reply = ''; 

        while ($line = fgets($handle, 515)) { 
         $reply .= $line; 

         if (substr($line, 3, 1) == ' ') { 
          break; 
         } 
        } 

        if (substr($reply, 0, 3) != 250) { 
         error_log('Error: HELO not accepted from server!'); 
        } 
       } 

       if ($this->verp) { 
        fputs($handle, 'MAIL FROM: <' . $this->from . '>XVERP' . $this->crlf); 
       } else { 
        fputs($handle, 'MAIL FROM: <' . $this->from . '>' . $this->crlf); 
       } 

       $reply = ''; 

       while ($line = fgets($handle, 515)) { 
        $reply .= $line; 

        if (substr($line, 3, 1) == ' ') { 
         break; 
        } 
       } 

       if (substr($reply, 0, 3) != 250) { 
        error_log('Error: MAIL FROM not accepted from server!'); 
       } 

       if (!is_array($this->to)) { 
        fputs($handle, 'RCPT TO: <' . $this->to . '>' . $this->crlf); 

        $reply = ''; 

        while ($line = fgets($handle, 515)) { 
         $reply .= $line; 

         if (substr($line, 3, 1) == ' ') { 
          break; 
         } 
        } 

        if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) { 
         error_log('Error: RCPT TO not accepted from server!'); 
        } 
       } else { 
        foreach ($this->to as $recipient) { 
         fputs($handle, 'RCPT TO: <' . $recipient . '>' . $this->crlf); 

         $reply = ''; 

         while ($line = fgets($handle, 515)) { 
          $reply .= $line; 

          if (substr($line, 3, 1) == ' ') { 
           break; 
          } 
         } 

         if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) { 
          error_log('Error: RCPT TO not accepted from server!'); 
         } 
        } 
       } 

       fputs($handle, 'DATA' . $this->crlf); 

       $reply = ''; 

       while ($line = fgets($handle, 515)) { 
        $reply .= $line; 

        if (substr($line, 3, 1) == ' ') { 
         break; 
        } 
       } 

       if (substr($reply, 0, 3) != 354) { 
        error_log('Error: DATA not accepted from server!'); 
       } 

       fputs($handle, $header . $message . $this->crlf); 
       fputs($handle, '.' . $this->crlf); 

       $reply = ''; 

       while ($line = fgets($handle, 515)) { 
        $reply .= $line; 

        if (substr($line, 3, 1) == ' ') { 
         break; 
        } 
       } 

       if (substr($reply, 0, 3) != 250) { 
        error_log('Error: DATA not accepted from server!'); 
       } 

       fputs($handle, 'QUIT' . $this->crlf); 

       $reply = ''; 

       while ($line = fgets($handle, 515)) { 
        $reply .= $line; 

        if (substr($line, 3, 1) == ' ') { 
         break; 
        } 
       } 

       if (substr($reply, 0, 3) != 221) { 
        error_log('Error: QUIT not accepted from server!'); 
       } 

       fclose($handle); 
      } 
     } 
    } 
} 
?> 

는 클래스 파일을 읽고 unserstand 방법을 완전히하지만 지금을 heres 선발 예를 들어이 기능을 사용하려면

$mail = new Mail(); 

$mail->setTo("[email protected]"); 
$mail->setFrom("[email protected]"); 
$mail->setSender("Bilgi"); 
$mail->setSubject("Test mail"); 
$mail->setHtml("<b>Some html email</b>"); 

$mail->send(); 
+0

나는 변화를 시도했지만 스팸 폴더에 메일을 보냈지 만 다른 서버에서 같은 코드를 시도하면 효과가있었습니다. 문제는 내 서버라고 생각하지만 뭐라구? 덕분에 – mTuran

+0

귀하의 IP를 다음 블랙리스트에 있어야합니다 * 또는 * 이메일 도메인 블랙리스트에있을 수 있습니다, 가능성은 그게 IP가 – RobertPitt

+0

이것은 확실하게 내 문제를 해결, 나는 또한 SPF가 통과했지만 스팸 통조림을 받고 있었다. 고맙습니다! – Simon

0

당신이 DNS는 사이트에서 메일을 보내도록 설정 했습니까. 그렇게하지 않으면 메일 수신자가 사용자를 식별하지 못하므로 메일을 스팸 메일로 보냅니다. 호스팅 지원 담당자와상의하면 DNS 설정을 안내합니다.