недавно я обнаружил, что больше не могу отправлять электронные письма из php, используя любую электронную почту, которую я выбрал в заголовке «От:», если только у этого доменного имени нет соответствующей записи TXT / SPF. в противном случае, несколько спам-агентств отметят ваш IP # как непослушный.
Итак, вот что я думаю — иметь функцию, которая проверяет, имеет ли доменное имя адреса электронной почты соответствующую запись TXT, которая имеет тот же IP-номер.
в основном, мы ищем эту запись TXT:
> v=spf1 include:_spf.google.com ip4:199.###.184.26 ~all
и пытается узнать, соответствует ли этот номер IP нашему.
поэтому результаты могут выглядеть так:
От: Марки Эдвардс \< [email protected]>
От: [email protected] \ r \ n ReplyTo: [email protected]
От: Марки Эдвардс \< [email protected]> \ r \ n Ответить: Марки Эдвардс
\< [email protected]>
мой вопрос: кто-нибудь еще сталкивался с этим, и если так, как это было решено?
Вот PHP-функция, которую я рассматриваю для решения этой проблемы:
function checkForDomainEmailMatch() {
/* usage: emailAddress
emailAddress name(s)
returns:
From: [email protected]
-- or --
From: Marky Edwards <[email protected]>
ReplyTo: <[email protected]
*/
$input = func_get_args();
$emailAddr = null ;
$personName = null ;
$ipNbr = null ;
$returnResult = 'From: ' ;
// did we get one parameter or several ?
if ( is_array($input) ) {
$emailAddr = array_shift($input);
$personName = trim(implode (' ', $input));
} else {
$emailAddr = $input ;
}
// get the IP number
if ( array_key_exists('SERVER_ADDR', $_SERVER) ) {
// are we running locally or through apache?
$ipNbr = $_SERVER['SERVER_ADDR'];
} else {
$ipNbr = gethostbyname(gethostname());
}
$domain = preg_replace('/^.*@/','',$emailAddr);
// strip out email prefix, just use domain name
$ipNbrMatch = '/' . $ipNbr . '/' ;
$dnsRecords = dns_get_record($domain, DNS_TXT) ;
// EXAMPLE: v=spf1 include:_spf.google.com ip4:199.231.184.26 ~all
$dnsRecordIpNbr = null;
foreach ( $dnsRecords as $dnsRecord ) {
if ( array_key_exists('txt', $dnsRecord )) {
$dnsRecordIpNbr = $dnsRecord['txt'] ;
break;
}
}if ( $personName )
$returnResult .= $personName
. '<'
;
if ( $dnsRecordIpNbr && preg_match($ipNbrMatch, $dnsRecordIpNbr)) {
// our TXT IP number matches our server
$returnResult .= $emailAddr ;
if ( $personName )
$returnResult .= '>';
} else {
// our TXT IP number does not match our server
$domainName = null;
// looking for edwardsmarkf.info ;-)
$pattern[] = $ipNbrMatch;
$pattern[] = '/ /';
$domainName = preg_replace($pattern, '', exec('head -1 /etc/hosts')) ;
// default email address
$returnResult .= get_current_user()
. '@'
. $domainName
;
if ( $personName )
$returnResult .= '>';
$returnResult .= "\r\n". 'ReplyTo: '
;
if ( $personName ) {
$returnResult .= $personName
. '<'
;
}$returnResult .= $emailAddr ;
if ( $personName )
$returnResult .= '>';
$returnResult .= "\r\n" ;
}
return $returnResult;
}
любые мысли или предложения будут с благодарностью.
Кажется, это работает нормально — очень хорошо работает с Gmail.
function checkForDomainEmailMatch() {
/* checkForDomainEmailMatch 2014-10-27
usage: emailAddress
emailAddress name(s)
returns:
From: [email protected]
-- or --
From: Marky Edwards <[email protected]>
Reply-To: <[email protected]
*/
define('DEFAULT_EMAIL' , '[email protected]' );
$input = func_get_args();
$emailAddr = null ;
$personName = null ;
$ipNbr = null ;
$returnResult = 'From: ' ;
// did we get one parameter or several ?
if ( is_array($input) ) {
$emailAddr = array_shift($input);
$personName = trim(implode (' ', $input));
} else {
$emailAddr = $input ;
}
// get the IP number
if ( array_key_exists('SERVER_ADDR', $_SERVER) ) {
// are we running locally or through apache?
$ipNbr = $_SERVER['SERVER_ADDR'];
} else {
$ipNbr = gethostbyname(gethostname());
}
$domain = preg_replace('/^.*@/','',$emailAddr);
// strip out email prefix, just use domain name
$dnsRecords = dns_get_record($domain, DNS_TXT) ;
// EXAMPLE: v=spf1 include:_spf.google.com ip4:199.231.184.26 ~all
$dnsRecordIpNbr = null;
foreach ( $dnsRecords as $dnsRecord ) {
if ( array_key_exists('txt', $dnsRecord )) {
$dnsRecordIpNbr = $dnsRecord['txt'] ;
break;
}
}
$ipNbrMatch = '/' . $ipNbr . '/' ;
if ( $dnsRecordIpNbr && preg_match($ipNbrMatch, $dnsRecordIpNbr)) {
// our TXT IP number matches our server
if ( $personName )
$returnResult .= $personName
. ' <'
;
$returnResult .= $emailAddr ;
if ( $personName )
$returnResult .= '>' ;
} else {
if ( $personName ) {
$returnResult .= $personName ;
} else {
$returnResult .= $emailAddr ;
}
$returnResult .= ' <' ;
// our TXT IP number does not match our server
$domainName = null;
// looking for edwardsmarkf.info ;-)
$pattern[] = $ipNbrMatch;
$pattern[] = '/ /';
$domainName = preg_replace($pattern, '', exec('head -1 /etc/hosts')) ;
// default email address
if ( constant('DEFAULT_EMAIL') ) {
$returnResult .= constant('DEFAULT_EMAIL') ;
} else {
$returnResult .= get_current_user()
. '@'
. $domainName
;
}
$returnResult .= '>';$returnResult .= "\r\n". 'Reply-To: '
;
$returnResult .= $emailAddr ;
$returnResult .= "\r\n" ;
}
return $returnResult;
}
обратите внимание, что я только что попытался отправить мне счет PayPal в качестве теста, и вот что я вижу:
Кому: пометить Эдвардса \< [email protected]>
От: «marksPaypalAccount.com LLC через PayPal» \< [email protected]>
Ответить: [email protected]
Других решений пока нет …