sendmail — проблема с php и электронной почтой

недавно я обнаружил, что больше не могу отправлять электронные письма из php, используя любую электронную почту, которую я выбрал в заголовке «От:», если только у этого доменного имени нет соответствующей записи TXT / SPF. в противном случае, несколько спам-агентств отметят ваш IP # как непослушный.

Итак, вот что я думаю — иметь функцию, которая проверяет, имеет ли доменное имя адреса электронной почты соответствующую запись TXT, которая имеет тот же IP-номер.

в основном, мы ищем эту запись TXT:

> v=spf1 include:_spf.google.com ip4:199.###.184.26 ~all

и пытается узнать, соответствует ли этот номер IP нашему.

поэтому результаты могут выглядеть так:

От: [email protected]

От: Марки Эдвардс \< [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;
}

любые мысли или предложения будут с благодарностью.

-1

Решение

Кажется, это работает нормально — очень хорошо работает с 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]

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]