web-dev-qa-db-ja.com

Gmailのスパムフィルターをバイパスします(共有ホストからPHPで送信されたメール)

TL; DR:共有ホスティング(UnoeuroやOne.comの安価なドメインなど)から送信されたメールは、最終的にスパムになります。直し方?


私は最初にPDFファイルを生成するメールシステムを作成しました( [〜#〜] fpdf [〜#〜] を使用)、その後、PHPのSwiftmailerの添付ファイルとしてPDFファイルを送信しました。このメールは130人に送信されました(「1つの」請求書として)。しかし、それはほとんどすべての人のスパムフィルターに到達しました。 SwiftMailersのヘッダー設定を調整しようとしましたが、うまくいきませんでした。私が以前に送信したことのないメールでさえ(徹底的にテストされています)。これが私の初期設定でした:

_function sendMailEt($toEmail, $toName, $invoiceNumber){

require_once('includes/lib/Swift_required.php');

$transport = Swift_SmtpTransport::newInstance('mailout.one.com', 25)
  ->setUsername('[email protected]')
  ->setPassword('THE-PASSWORD')
  ;    

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('FROM COMPANY')
      ->setSubject('Thanks for signing up - COMPANY')
  ->setFrom(array('[email protected]' => 'Company name'))
  ->setTo(array($toEmail => $toName))
      ->setBody('A brief body, that explains that this is an invoice and that it has to be paid within 5 days. (written in danish)')
      ->addPart('A brief body, that explains that this is an invoice and that it has to be paid within 5 days. (written in danish)', 'text/html')

   ->attach(Swift_Attachment::fromPath('/URL-TO-THE-PDF-FILE.pdf'))
  ;

$result = $mailer->send($message);
}
_

また、PHPのネイティブmail()- functionを使用して電子メールを送信し、請求書にリンクしてみました(_http://www.company-domain-name.dk/invoice/base64_encoded-name.pdf_)...同じ結果(スパム)。

ヘッダー全体を自分で書いてみました。ヘッダーに含めるべきものについてのフォーラムをたくさん読んだことがありますが、それらはすべて異なることを書いています。そこで、いくつかの異なることを試しました(以前に送信した電子メールと送信しなかった電子メールの両方)...同じ結果(スパム)。

次に、MailChimpsとまったく同じようにヘッダーをヘッダーに書き込んでみました。それは私をこれに導きました:

_ $headers = "Reply-To: Company name <[email protected]>\r\n"; 
 $headers .= "Return-Path: Company name <[email protected]>\r\n"; 
 $headers .= "From: Message from Company name <[email protected]>\r\n"; 
 $headers .= "MIME-Version: 1.0\r\n";
 $headers .= "Sender: Message from Company name <[email protected]>\r\n";
 $headers .= "Content-type: text/plain; charset=\"utf-8\"; \r\n";
 $headers .= "X-Mailer: PHP". phpversion() ."\r\n";
_

そして、私はこのようにメールを送ります:

_mail($toName . '<'.$toEmail.'>', utf8_decode('Faktura på depositumet'), utf8_decode($someMessage), $headers);
_

...同じ結果(スパム)。

ウェブスペースはOne.comにあるので、使用できません PHPmailer (インストールする必要があり、one.comのサーバーでは実行できないため)。また、One.comでSPFを定義することはできません。

私が欲しいのは、スパムに行かない電子メールを送信できるようにすることです。

これが私の質問です:

  1. ヘッダーがオフになっているからですか、それとも「より深い」ものですか?

  2. Gmailスパムフィルターは単一のメールアカウント(_[email protected]_など)を禁止しますか、それともドメイン全体(_@example.com_など)を禁止しますか?

  3. ブラックリストに登録された電子メールを何らかの方法でホワイトリストに登録することはできますか?

*加算1 *

わかりました...私は今、いくつかのことを試しました:

  • 推奨されているように、LoneWolfPRのリターンパスを追加しようとしましたが、役に立ちませんでした。
  • One.com(ホスティング会社)に連絡し、SPFレコードやDKIMレコードを設定できないことを確認しました。まだそうではありません。
  • フォーム付きのウェブサイトへのリンクを含む「登録解除」リンクを設定することを検討しましたが、そのアプローチを信じていませんでした。つまり、請求書は常に電子メールで送信されます。そして、なぜ請求書の購読を解除できるのですか?!それは私の頭の中であまり意味がなかったので、私はそれを約20分間だけ試しました(明らかに、結果はありませんでした)。

これが私の現在のメールヘッダーです(Gmailから[オリジナルを表示]をクリックして取得):

_Delivered-To: [email protected]
Received: by 10.76.75.104 with SMTP id b8csp48728oaw;
        Sat, 16 Mar 2013 17:32:56 -0700 (PDT)
X-Received: by 10.152.116.45 with SMTP id jt13mr7897860lab.0.1363480376067;
        Sat, 16 Mar 2013 17:32:56 -0700 (PDT)
Return-Path: <[email protected]>
Received: from mail-out2.b-one.net (mail-out2.one.com. [91.198.169.19])
        by mx.google.com with ESMTP id p10si4637427lbb.120.2013.03.16.17.32.55;
        Sat, 16 Mar 2013 17:32:55 -0700 (PDT)
Received-SPF: neutral (google.com: 91.198.169.19 is neither permitted nor denied by best guess record for domain of [email protected]) client-ip=91.198.169.19;
Authentication-Results: mx.google.com;
       spf=neutral (google.com: 91.198.169.19 is neither permitted nor denied by best guess record for domain of [email protected]) [email protected]
Date: Sat, 16 Mar 2013 17:32:55 -0700 (PDT)
Message-Id: <[email protected]>
Received: from localhost.localdomain (srv18.one.com [193.202.110.18])
    by mail-out2.b-one.net (Postfix) with ESMTP id F3D0B10365
    for <[email protected]>; Sun, 17 Mar 2013 01:32:53 +0100 (CET)
Received: from 85.218.159.219 by www.DOMAIN-NAME.dk via URL_TO_THE_SCRIPT.php with HTTP; Sun, 17 Mar 2013 00:32:53 +0000
To: RECIEVERS_NAME <[email protected]>
Subject: EMAIL-SUBJECT
X-PHP-Originating-Script: 87486:NAME-OF-THE-SCRIPT-THE-E-MAIL-WAS-SENT-FROM.php
Reply-To: COMPANY NAME <[email protected]>
From: Besked fra COMPANY NAME <[email protected]>
MIME-Version: 1.0
Sender: Besked fra COMPANY NAME <[email protected]>
Content-type: text/plain; charset="utf-8"; 
X-Mailer: PHP5.3.21
_
16
Zeth

解決策:Mailgun (テストされていません)または Sendgrid (テストされて驚異的に機能します!)両者の間には価格の違いがありますが、要するに、Mailgunはあなたが小さい場合に適しています。 Sendgridは、あなたが大きい場合に適しています。

それか、-または MailChimps API などを使用してメールを送信します。共有ホストでは修正できません(ほとんどの場合)。その理由は以下のとおりです。


説明:後で、共有ホストがどのように機能するかについて詳しく学びました。複数の異なるサイトが同じサーバー上にあると想像してください(domain-1.orgdomain-2.orgdomain-3.orgなど)。つまり、domain-3.orgが大量の迷惑メールを送信した場合、Gmail(およびその他のスパムフィルター)はそのIPアドレスをスパムとしてマークします。したがって、domain-2.orgが送信する場合、それは(おそらく)何らかのIPアドレスから送信されるため、スパムになります。共有ホストは実際には何もできません(この問題を抱えている人はほとんどいないので気にしないでください)。そしてそれがとても安い理由です。

SendgridとMailgunsのIPアドレスは、すべてのスパムフィルターによって「問題ない」とマークされており、それがあなたがそれらを使って支払っているサービスです。彼らは、あなたが送信する電子メールの数が「スパム」としてマークされていることを監視することによって、それをそのように保ちます。それが5%-10%のようなものか、非常に低いものである場合、Sendgrid/Mailgunは、修正するまでアカウントをブロックします(長いプロセスを経て、カスタマーサービスに連絡し、1.000の呼びかけを行う必要があります-メアリーとすべての種類奇妙なものの)。

独自のサーバー(はるかに高価)を入手し、独自のメールサーバーをセットアップする場合は、スパムとしてマークされないように、細心の注意を払う必要があると聞きました。原因スパムフィルターは最近本当に厳しいです...

1
Zeth

1)通常、電子メールアドレスは簡単にブラックリストに登録されません。実際にそのアドレスをブラックリストに登録するには、スパマーとしてタグ付けするのに時間や多くの人がかかります。

2)はい。スパマーは通常[email protected]のようなランダムな電子メールアドレスを生成するため、ドメイン名全体をブラックリストに登録できます。

3)スパムボックスに何度アクセスしたかは関係ありません。基本的に、最近のスパムフィルターは強力です。スパマーは日々移動方法を改善しようとしているため、フィルターは毎日厳しくなっています。初めてスパムフォルダに入れられ、ユーザーが実際にスパムボックスに入れなかった場合、ユーザーがマークを外すか、問題を修正しない限り、スパムは続行されます。

スパムボックスを回避する方法は?

基本的に、いくつかの署名とDNSレコードへの多くのアクセスが必要です。これは、ほとんどのセットアップを実行する場所があるためです。

  • 逆引きDNSルックアップ:専用サーバーまたは一部のVPSでも、逆引きDNSレコードを設定できます。チケットを開くだけで、ITが設定することもあります。それができない場合は、ホスティングを変更するか、スパマーxDとしてタグ付けされ続けてください。これは、ヘッダーに偽造を防ぐためです。ヘッダーにメールがgmail.comから送信されるように設定できますが、これはメールサーバーがチェックする方法ではありません。

  • SPFも必須です、SPFを設定できない場合は、それ以上試さないでください。ホスティングを変更することを検討してください。ここでxDを読むのをほぼやめることができます。

  • DKIM /ドメインキー:できればDKIMは暗号化された署名であり、DNSに公開鍵を設定し、秘密鍵を電子メールサーバーに保存します。サーバーが電子メールを受信すると、秘密鍵が使用されます。ヘッダーに添付されたキー(DKIMを管理するメールサーバーソフトウェアが必要です。たとえば、Windowsの場合、それは私のために機能しましたhmailserver)およびメールサービス(gmail for例)は、公開鍵が一致するかどうかを確認するためにdnsレコードをチェックします。 これもほぼ必需品です


これらの3つが基本でした。DMARCとADSPを設定すると、SpamAssassinsのスコアが向上します。グーグルでいくつかのスパムキーワードリストのより良いスコア検索を得て、それらを避けようとするために、「Dear xxx」でメールを始めるようないくつかのものはあなたのスコアに有害です、(それがくだらないとしても、あなたが明確なリンクを提供するので)あなたも少し助けになります。

また:

  • (任意の)背景の上にずさんなhtmlと白いテキストを避けてください。一部のスパマーはそれを使用して隠しテキストに合わせます。これらのフィルターはあなたが思っているよりも賢いです。

  • 具体的な推奨事項をお読みください。ほとんどのメールサービスのウェブサイトにはFAQか何かがあり、メールを送信して迷惑メールに入らないようにするためのヒントがいくつかあります。一部のサービスでは、ホワイトリストへの登録を申請することもできます(少なくとも数年前、Gmailのようないくつかのサービスではもうそれをしていません)

  • まとめて送る場合は、時間をかけてください! 1秒あたりX通のメールがどこかに送信されている場合、ブラックリストに登録されたり、スクリプトなどを設定して1秒程度の遅延が発生したりする可能性があります。遅延は、ブラックリストに登録する宛先によって異なります。


これらのヒントがお役に立てば幸いです。最近いくつかのスパムフィルターに対処する必要がありましたが、それはお尻の痛みです。そのため、すべての情報を知っています。それが私の調査です。xDすべての署名と設定したものの後でさえ、いくつかの電子メールはまだスパムボックスに入ります(割合は少ないですが、それでも私を傷つけます)唯一の信頼できる方法は、ユーザーに連絡先リストにあなたを追加させることです(署名とヘッダーを正しく持っている間)ので、可能であればそうするようにユーザーに思い出させてください。

14
aleation

覚えておくべきことの1つは、GmailとYahoo!によってメールがブロックされるという問題が発生したことです。 Return-Pathヘッダーがfromと一致しなかったため、phpからメールを送信します。多くのサーバーでは、ヘッダーにReturn-Pathを明示的に設定すると、PHP Mailはそれを無視し、リターンパスをマシン名に設定します。 '追加パラメーターで強制する必要があります。 '-f'フラグを使用したメール関数の 'セクション。今までSwift Mailerを使用したことがないので、PHPのネイティブmail()関数に相当するものはわかりませんが、次のようになります。 mail();を使用するように見えます。

mail($to,$subject,$message,$headers,'-f [email protected]')

Swift mailerでこれに相当するものを見つけることができれば、問題が解決する可能性があります。

編集:

実際にはReturn-Pathをまったく設定していないようです。私はGMailが本当にそれが省略されるのを好まないことを知っています。 Swift_Mailerメッセージに明示的に設定してみてください(そして、Fromと一致することを確認してください)。

$message->setReturnPath('[email protected]');
3
LoneWolfPR

FROMとして使用しているメールアドレスが実際にはメールアドレスであることを確認してください。ホスト(one.com)からアカウント管理にアクセスし、メールの送信元となるアカウントを追加することで、同じ問題を解決しました。 「メーラー」というアカウントを追加し、パネルから「申し訳ありません。このメールアドレスはサーバー機能用に予約されています」という自動応答を設定することができました。

fromヘッダーで使用します([email protected]

その実際の電子メールアドレスと自動応答を持っていることはトリックをしました。 Gmailは、これまで使用されたことのないメールアドレスがスパムであることを知るのに十分賢いと思います。また、電子メールアドレスは、スクリプトが存在するドメインからのものである必要があります。これにより、スクリプトがFROMであると表示されたときに、嘘をつかないようになります。

共有ホスト(justhost.com)からメールを送信するときに使用するコードは次のとおりです。スパムにはなりません(これはWebフォームの投稿データを使用しています)。

<?php



// Contact subject

$subject = $_POST["subject"];



// Details

$message=$_POST["detail"];



// Email of sender

$mail_from=$_POST["customer_mail"]; 

//Name of sender

$name=$_POST["name"];
putenv("TZ=America/Phoenix");
$now = date("F j, Y, g:i a T");

$header="Reply-To: $name <$mail_from>";

$header .= "From: MyDomainName.com <[email protected]>";
$header .= "\r\n";
$header .= "Reply-To: $name <$mail_from>"; 
$introMSG= "Message From:".$name." <".$mail_from.">"."\r\n"
."Sent On:".$now."\r\n"."From a web form on MyDomaiNname.com"."\r\n"."-----------
-----------------------"."\r\n"."\r\n";


$to ='[email protected]'; // Domain Owners Email Address

$send_contact=mail($to,$subject,$introMSG.$message,$header);

$send_copy=mail($mail_from,"Copy Of:".$subject,$introMSG.$message,$header);

// Check if message sent


if($send_contact){

echo "<strong>Thanks! Your message has been sent to me.</strong>";

}

else {

echo "<strong>There was an error sending your message </strong>"; 

}



if($send_copy){
echo "<strong><br>A copy of this message was sent to your email.<br>If you do not
receive a copy please check your spam folder</strong>";

}

else{
echo "<strong> There was an error sending a copy of this message to your email
</strong>"; 

}



$send_reminder=mail("[email protected]","","You Have a new contact message from
".$name.", remember to check your spam folder.",$header);

if($send_reminder){

echo ".";

}

else {

echo "<br><strong>TXT Error</strong>";

}

?>
0
Eric Jones

メールヘッダーから飛び出す「スパム」のようなものが少なくとも2つあります。

Message-Id: <[email protected]>

SMTPIN_ADDED_MISSINGセクションに注意してください。適切なメーラーのように振る舞い、一意のメッセージIDを生成していません。 RFC5322を読むことは教育的であると感じるかもしれません。

Received: from localhost.localdomain (srv18.one.com [193.202.110.18])
by mail-out2.b-one.net (Postfix) with ESMTP id F3D0B10365
for <[email protected]>; Sun, 17 Mar 2013 01:32:53 +0100 (CET)

その最初に受信したヘッダーには、不正なHELOホスト名(localhost.localdomain)があります。メーラーアプリshouldは、それを有効な値に設定する方法を提供する必要があります。 PHPを実行しているマシンのホスト名を構成するのと同じくらい簡単かもしれません。 RFC 1035(ホスト名の有効性)、RFC 2821(SMTP)、およびRFC 5321(SMTP)を参照してください。

0
Matt Simerson