リレーサーバーというのか高速メール配信サーバーというのか迂回配信サーバーというのか、
複数IPアドレスを切り替えてキャリアブロックを回避しながらメール配信をする方法ついて解説します。
例えばメインのIPアドレスを 157.7.188.210 だとして、157.7.188.211~157.7.188.218 の8個のIPアドレスを追加します。
cd /etc/sysconfig/network-scripts vi ifcfg-eth0:001
DEVICE=eth0:001 ONBOOT=yes BOOTPROTO=none IPADDR=157.7.188.211 NETMASK=255.255.255.0 ARPCHECK=no
・
・
・
・
vi ifcfg-eth0:008
DEVICE=eth0:008 ONBOOT=yes BOOTPROTO=none IPADDR=157.7.188.218 NETMASK=255.255.255.0 ARPCHECK=no
service network restart ifconfig (eth0に加えてeth0:001~008の情報が出てくればIPアドレスの追加ができています)
IPアドレス切り替えの原理はこのソケット関数です。
PHP: ソケット 関数 - Manual
PHP: socket_create - Manual
PHP: socket_bind - Manual
// ソケットの作成 $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 157.7.188.211 にIPアドレスを切り替える socket_bind($sock,"157.7.188.211");
下記は一通のメール送るたびにローカルのIPアドレス、送信元ドメインを切り替える場合のプログラムです。
// IPアドレスと対応する送信元ドメインリスト $_ip_domain = array( "157.7.188.211" => "testdomain1.com", "157.7.188.212" => "testdomain2.com", "157.7.188.213" => "testdomain3.com", "157.7.188.214" => "testdomain4.com", "157.7.188.215" => "testdomain5.com", "157.7.188.216" => "testdomain6.com", "157.7.188.217" => "testdomain7.com", "157.7.188.218" => "testdomain8.com", ); // 宛先メールアドレスリスト $_mailto = array( "testest@hotmail.com", "testest@yahoo.co.jp", "testest@gmail.com", ); foreach($_mailto as $mailto){ // ローカルIPアドレスと対応するドメインをランダムに取得 $localip = array_rand($_ip_domain); $domain = $_ip_domain[$localip]; $mailfrom = "info@{$domain}"; $hostname = "www.{$domain}"; // mxレコードの取得 list($mailtouser,$mailtodomain) = explode("@",$mailto); if(!getmxrr($mailtodomain,$_mxhost)){ mb_send_mail($mailfrom,"mailer-daemon","mxレコードの取得に失敗しました。"); continue; } // mxレコードのhostのipアドレスを全て取得 $_mxip = array(); foreach($_mxhost as $mxhost){ $_mxrecord = dns_get_record($mxhost); foreach($_mxrecord as $mxrecord){ if(isset($mxrecord["ip"])) $_mxip[$mxrecord["ip"]] = $mxrecord["ip"]; } } if(!count($_mxip)){ mb_send_mail($mailfrom,"mailer-daemon","宛先サーバーが見つかりません。"); continue; } // ソケットの作成とローカルIPアドレスの切り替え $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($sock,$localip); // 取得したIPアドレスに接続 shuffle($_mxip); $connect_flag = false; foreach($_mxip as $mxip){ // 25番で接続を試みる if(@socket_connect($sock,$mxip,25)){ $connect_flag = true; break; // 465番で接続を試みる }elseif(@socket_connect($sock,"ssl://{$mxip}",465)){ $connect_flag = true; break; } } if(!$connect_flag){ // メールサーバーへの接続に失敗 mb_send_mail($mailfrom,"mailer-daemon","メールサーバーへの接続に失敗しました。"); @socket_close($sock); continue; } $msg = socket_read($sock,1024); if(strpos($msg,"220")===false and strpos($msg,"250")===false){ // メールサーバーへの接続に失敗 mb_send_mail($mailfrom,"mailer-daemon",$msg); @socket_close($sock); continue; } socket_write($sock,"ehlo {$hostname}\r\n"); $msg = socket_read($sock,1024); if(strpos($msg,"220")===false and strpos($msg,"250")===false){ // メールサーバーへの接続に失敗 mb_send_mail($mailfrom,"mailer-daemon",$msg); @socket_close($sock); continue; } // エンベロープfrom socket_write($sock,"mail from: <{$mailfrom}>\r\n"); $msg = socket_read($sock,1024); if(strpos($msg,"220")===false and strpos($msg,"250")===false){ // 送信失敗 mb_send_mail($mailfrom,"mailer-daemon",$msg); @socket_close($sock); continue; } // エンベロープto socket_write($sock,"rcpt to: <{$mailto}>\r\n"); $msg = socket_read($sock,1024); if(strpos($msg,"220")===false and strpos($msg,"250")===false){ // 送信失敗 mb_send_mail($mailfrom,"mailer-daemon",$msg); @socket_close($sock); continue; } // dataコマンド socket_write($sock,"data\r\n"); $msg = socket_read($sock,1024); if(strpos($msg,"354")===false and strpos($msg,"220")===false and strpos($msg,"250")===false){ // 送信失敗 mb_send_mail($mailfrom,"mailer-daemon",$msg); socket_close($sock); continue; } // 本文作成 $content = "from: {$mailfrom}\n"; $content .= "to: {$mailto}\n"; $content .= "subjetct: テスト\n"; $content .= "テスト"; // メール送信 socket_write($sock,"{$content}\r\n.\r\n"); $msg = socket_read($sock,1024); if(strpos($msg,"220")===false and strpos($msg,"250")===false){ // 送信失敗 mb_send_mail($mailfrom,"mailer-daemon",$msg); socket_close($sock); continue; } // 切断 @socket_write($sock,"quit\r\n"); @socket_read($sock,1024); @socket_close($sock); }
Copyright(C) systemexpress.co.jp All Rights Reserved. Author Takayuki Yukawa