[QUOTE]
vip6 написал:
[QUOTE] Андрей Дьякон написал:
to [URL=http://dev.1c-bitrix.ru/community/webdev/user/47598/]Дмитрий Данилов[/URL]
Спасибо, этот вариант работает отлично!
Так же добавлю, если необходима рассылка с одного сайта, сразу с нескольких почтовых аккаунтов, то их по аналогии можно перечислить, в той же строке, в главном модуле, через запятую:
--account=mailbox1 --from= [URL=mailto:info@site2.ru]info1@site.ru[/URL] , --account=mailbox2 --from= [URL=mailto:info@site2.ru]info2@site.ru[/URL] , --account=mailbox3 --from= [URL=mailto:info@site2.ru]info3@site.ru[/URL] [/QUOTE]
Если раньше это работало, то сейчас нет. При отправки с любой почты Битрикс будет подставлять почту последнюю в списке.
Решили это следующим образом:
1. Настроили аккаунты таким образом:
/home/bitrix/.msmtprc
[CODE] # Defaults for all accounts
defaults
keepbcc on
auth on
tls on
tls_starttls off
tls_certcheck off
port 465
host smtp.yandex.ru
logfile /home/bitrix/msmtp_default.log
account defaultsiteru
from default @site .ru
user default @site .ru
password ***
account acc1siteru
logfile /home/bitrix/msmtp_acc1_site_ru.log
from acc1 @site .ru
user acc1 @site .ru
password ***
account acc2siteru
logfile /home/bitrix/msmtp_acc2_site_ru.log
from acc2 @site .ru
user acc2 @site .ru
password ***
# Set a default account
account default : defaultsiteru [/CODE]
2. Добавили функцию custom_mail(для удобства разбил на несколько функций) в init.php:
/home/bitrix/www/bitrix/php_interface/init.php
[CODE] // Отправка почты
function custom_mail ( $to , $subject , $body , $headers ) {
$arHeaders = cdek_email_parse_headers( $headers );
$fromHeader = $arHeaders [ 'sender' ][ 0 ] ?? $arHeaders [ 'from' ][ 0 ];
$fromAddress = explode( ',' , $fromHeader )[ 0 ];
if (preg_match( '/<([^>]+)>/' , $fromAddress , $matches )) {
$fromAddress = $matches [ 1 ];
}
$accounts = getMsmtpAccounts();
if ( $accounts && $param = array_search( $fromAddress , $accounts )) {
$params = '-a ' . $param ;
}
return mail( $to , $subject , $body , $headers , $params );
}
// Получение хедеров письма
function cdek_email_parse_headers ( $headersStr ) {
$headers = [];
$currentHeader = null ;
foreach (explode( "\n" , $headersStr ) as $line ) {
$line .= "\n" ;
if (preg_match( '/^([\w-]+):(.*)$/' , $line , $matches )) {
if ( $currentHeader ) {
$currentHeader [ 'value' ] = rtrim( $currentHeader [ 'value' ], "\r\n" );
$headers [ $currentHeader [ 'name' ]][] = $currentHeader [ 'value' ];
}
$currentHeader = [ 'name' => strtolower( $matches [ 1 ]), 'value' => ltrim( $matches [ 2 ])];
} else {
$currentHeader [ 'value' ] .= $line ;
}
}
if ( $currentHeader ) {
$currentHeader [ 'value' ] = rtrim( $currentHeader [ 'value' ], "\r\n" );
$headers [ $currentHeader [ 'name' ]][] = $currentHeader [ 'value' ];
}
return $headers ;
}
// Получение аккаунтов msmtp
function getMsmtpAccounts () {
$msmtpConfig = file_get_contents( "/home/bitrix/.msmtprc" );
$accounts = null ;
$accountName = "" ;
foreach (explode( "\n" , $msmtpConfig ) as $line ) {
$line .= "\n" ;
if (preg_match( '/^([\w-]+)\s*\t*(.*)$/' , $line , $matches )) {
if ( $matches [ 1 ] == "account" ) {
if (trim(explode( ":" , $matches [ 2 ])[ 0 ]) == "default" ) {
//$defaultAccountName = trim(explode(":",$matches[2])[1], " \t\r\n");
continue ;
}
$accountName = $matches [ 2 ];
} else if ( $matches [ 1 ] == "from" ) {
$accounts [ $accountName ] = rtrim( $matches [ 2 ], "\r\n" );
}
}
}
return $accounts ;
}
[/CODE]
В итоге если функция находит почтовый ящик в аккаунтах, то отправляет с него, если не находит, то отправка идет с ящика по умолчанию, а поле From заголовка письма подменяется почтой пользователя в Битрикс.[/QUOTE]
Большое спасибо за это решение, все работает прекрасно)