Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 21.06.2015
Сообщений: 74
1

Добавить свои служебные заголовки в письма (CMS, Zend framework)

09.05.2022, 16:50. Показов 659. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день, други!
От PHP далёк, но нужно добавить свои служебные заголовки в письма почты.

Есть сайт с CMS, отправка почты работает с пом. старой версии Zend framework от 2011 года.

В /Zend/Mail.php имеем такое:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    /**
     * Add a custom header to the message
     *
     * @param  string              $name
     * @param  string              $value
     * @param  boolean             $append
     * @return Zend_Mail           Provides fluent interface
     * @throws Zend_Mail_Exception on attempts to create standard headers
     */
    public function addHeader($name, $value, $append = false)
    {
        $prohibit = array('to', 'cc', 'bcc', 'from', 'subject',
                          'reply-to', 'return-path',
                          'date', 'message-id',
                         );
        if (in_array(strtolower($name), $prohibit)) {
            /**
             * @see Zend_Mail_Exception
             */
            require_once 'Zend/Mail/Exception.php';
            throw new Zend_Mail_Exception('Cannot set standard header from addHeader()');
        }
 
        $value = $this->_filterOther($value);
        $value = $this->_encodeHeader($value);
        $this->_storeHeader($name, $value, $append);
 
        return $this;
    }
Определение функции SendMail указано в одном из файлов CMS (server.class.php) и выглядит вот так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public function SendMail( $to, $from, $subject, $text, $headerfrom = "" )
    {
        $mails = getSettingsByKey( "mails" );
        $from = $mails['method'] == 1 ? $mails['login'] : $from;
        
        $headerfrom= $this->GetMailNameFix($from);
        
        if ( !file_exists( dirname(__FILE__)."/Zend/Mail.php" ) )
        {
            return false;
        }
        include_once( dirname(__FILE__)."/Zend/Mail.php" );
        $mail = new Zend_Mail( "UTF-8" );
        $mail->setHeaderEncoding( Zend_Mime::ENCODING_BASE64 );
        $mail->addTo( $to );
        empty( $headerfrom ) ? $mail->setFrom( $from ) : $mail->setFrom( $from, $headerfrom );
        $mail->setSubject( stripslashes( $subject ) );
        $mail->setBodyHtml( stripslashes( $text ) );
        
        try
        {
            return $mail->send( ) instanceof Zend_Mail;
        }
        catch ( Exception $e )
        {
            writelog( "/send_emails_errors.log", $e );
            return false;
        }
    }
В нескольких файлах CMS встречается код отправки почты (регистрация, восст. пароля, рассылка по подписчикам и т.д.). Код везде немного разный, но в целом выглядит примерно так:
PHP
1
$server->SendMail( $user['email'], $ms['admin_email'], $title, $message,'Имя отправителя' )
И вот в каждую такую отправку мне нужно добавить свои служебные заголовки для почты. В каждой отправке разные.

Я попробовал сделать это вот так

Изменил функцию SendMail, добавив $headerletter в двух местах

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    public function SendMail( $to, $from, $subject, $text, $headerfrom = "", $headerletter )
    {
        $mails = getSettingsByKey( "mails" );
        $from = $mails['method'] == 1 ? $mails['login'] : $from;
        
        $headerfrom= $this->GetMailNameFix($from);
        
        if ( !file_exists( dirname(__FILE__)."/Zend/Mail.php" ) )
        {
            return false;
        }
        include_once( dirname(__FILE__)."/Zend/Mail.php" );
        $mail = new Zend_Mail( "UTF-8" );
        $mail->setHeaderEncoding( Zend_Mime::ENCODING_BASE64 );
        $mail->addTo( $to );
        empty( $headerfrom ) ? $mail->setFrom( $from ) : $mail->setFrom( $from, $headerfrom );
        $mail->setSubject( stripslashes( $subject ) );
        $mail->setBodyHtml( stripslashes( $text ) );
        $mail->addHeader( $headerletter );
        
        try
        {
            return $mail->send( ) instanceof Zend_Mail;
        }
        catch ( Exception $e )
        {
            writelog( "/send_emails_errors.log", $e );
            return false;
        }
    }
Ну в файлах CMS добавил такой код (на примере одного файла):
PHP
1
2
3
4
5
$headerletter_admin = "Заголовок1: значение";
$headerletter_admin .= "\nЗаголовок2: значение";
$headerletter_admin .= "\nЗаголовок3: значение\n";
 
$server->SendMail( $user['email'], $ms['admin_email'], $title, $message,'Имя отправителя', $headerletter_admin )
И вроде как всё даже заработало, заголовки появились, но я понимаю, что делаю это неправильно, и что я добавил заголовки как это делается в mail(), а добавление в Zend вроде должно делаться как-то так:
$mail->addHeader('Заголовок1', 'значение');
$mail->addHeader('Заголовок2', 'значение');

Да и в логах PHP имеется ошибка:

PHP Warning: Missing argument 2 for Zend_Mail::addHeader(), called in server.class.php on line 90 and defined in Zend\Mail.php on line 1132

Строка 90 это вот это: $mail->addHeader( $headerletter );
Строка 1132 это вот это: public function addHeader($name, $value, $append = false)

Я понимаю на что "матерится" PHP в логах. Но что-то не получается у меня грамотно добавить это дело. Подскажете?

Добавлено через 3 часа 23 минуты
Получилось пока вот что сделать, изменив
PHP
1
$mail->addHeader( $headerletter );
на
PHP
1
$headerletter = $mail->addHeader( 'Заголовок1', 'значение' );
В итоге получаем такое:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    public function SendMail( $to, $from, $subject, $text, $headerfrom = "", $headerletter )
    {
        $mails = getSettingsByKey( "mails" );
        $from = $mails['method'] == 1 ? $mails['login'] : $from;
        
        $headerfrom= $this->GetMailNameFix($from);
        
        if ( !file_exists( dirname(__FILE__)."/Zend/Mail.php" ) )
        {
            return false;
        }
        include_once( dirname(__FILE__)."/Zend/Mail.php" );
        $mail = new Zend_Mail( "UTF-8" );
        $mail->setHeaderEncoding( Zend_Mime::ENCODING_BASE64 );
        $mail->addTo( $to );
        empty( $headerfrom ) ? $mail->setFrom( $from ) : $mail->setFrom( $from, $headerfrom );
        $mail->setSubject( stripslashes( $subject ) );
        $mail->setBodyHtml( stripslashes( $text ) );
        $headerletter = $mail->addHeader( 'Заголовок1', 'значение' );
        
        try
        {
            return $mail->send( ) instanceof Zend_Mail;
        }
        catch ( Exception $e )
        {
            writelog( "/send_emails_errors.log", $e );
            return false;
        }
    }
Но тогда новый заголовок добавляется во все письма, отправляемые через CMS, а мне надо чтобы этот заголовок добавлялся только в одном конкретном виде писем, то есть указывать его нужно в коде именно того PHP-файла, откуда идёт отправка, а вот как это сделать - не пойму пока...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2022, 16:50
Ответы с готовыми решениями:

Zend После установки Zend Framework + NetBeans не попадаю в Zend skeleton application
Установлена связка Apache+PHP+MySQL Установил Zend Framework который хорошо привязался к...

Получить контент другого сайта и добавить свои заголовки
Как получить страницу другого сайта и добавив свои заголовки выдать пользователю. Например: ...

Zend Как установить ZFDebug к Zend Framework 2 или XCode к Netbeans?
ZFDebug в виде плагина. http://fritool.ru/2009/12/zfdebug-debug-zend-framework/ Там инструкция...

Zend Как в Zend Framework 2 включить сторонные библиотеки. Например PHPExcel
Всем привет. Zend только начал изучать и ворос такой как подключить другие библиотеки например...

4
2434 / 2286 / 594
Регистрация: 27.05.2011
Сообщений: 7,810
09.05.2022, 16:58 2
Лучший ответ Сообщение было отмечено Мамелюк как решение

Решение

Цитата Сообщение от Мамелюк Посмотреть сообщение
PHP
1
public function addHeader($name, $value, $append = false)
Так тут 2 аргумента, почему в коде 1 подаете?

Нужно массивом принять и в цикле просетить
PHP
1
2
3
4
5
public function SendMail( $to, $from, $subject, $text, $headerfrom = "", array $headers = [])
...
foreach ($headers as $headerkey => $headerValue) {
    $mail->addHeader($headerkey, $headerValue);
}
PHP
1
2
3
4
5
6
7
8
$server->SendMail(
    $user['email'], $ms['admin_email'], $title, $message, 'Имя отправителя',
    [
        'Заголовок1' => 'значение',
        'Заголовок2' => 'значение',
        ...
    ]
);
1
1 / 1 / 0
Регистрация: 21.06.2015
Сообщений: 74
09.05.2022, 17:40  [ТС] 3
Цитата Сообщение от crautcher Посмотреть сообщение
Так тут 2 аргумента, почему в коде 1 подаете?
Да я понял уже, позже...)

Цитата Сообщение от crautcher Посмотреть сообщение
Нужно массивом принять и в цикле просетить
Что-то у меня php в логи ошибку пишет на вот это:
PHP
1
public function SendMail( $to, $from, $subject, $text, $headerfrom = "", array $headers = [])
PHP Parse error: syntax error, unexpected '[' in server.class.php on line 72

Может он не понимает такую конструкцию? Просто у меня старый php 5.3.29, более новый CMS не поддерживает.
0
2434 / 2286 / 594
Регистрация: 27.05.2011
Сообщений: 7,810
09.05.2022, 17:54 4
Цитата Сообщение от Мамелюк Посмотреть сообщение
Просто у меня старый php 5.3.29
Цитата Сообщение от Мамелюк Посмотреть сообщение
PHP
1
array $headers = []
В старом php вместо [] было array()
PHP
1
array $headers = array()
Добавлено через 47 секунд
И в SendMail() доже скобки на array() заменить
1
1 / 1 / 0
Регистрация: 21.06.2015
Сообщений: 74
09.05.2022, 19:08  [ТС] 5
crautcher, спасибо, всё работает!
0
09.05.2022, 19:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2022, 19:08
Помогаю со студенческими работами здесь

Zend Не работают формы после переноса проекта на хостинг. Zend Framework
Доброго времени суток! Есть маленький тестовый проект! С помощю него в можна добавлять,...

Zend В ходе установки Zend Framework в wamp выводит ошибку
Привет, друзя, в ходе установка Zend Framework, в WAMP выводить такую ошибку

Zend Объясните а то немного не пойму [Сервис локаторы] [zend framework 2]
Доброго времени суток. Осваиваю zf2 и возник вопрос, там есть такая штука как сервис локаторы...

Zend Перевод сайта на https и относительные ссылки zend framework
Добрый день! Есть сайт на zend'e framework, первом. Стоит задача в переводе сайта на протокол...

Zend Как создать проект Zend Framework 2 без интернета
Поясните пожалуйста, можно ли создать проект (работать) с ZF2 без использования связки с сайтами...

Zend Можно ли запустить Zend Framework без командной строки
Всем привет! Я хочу создать приложение с использованием zend framework, но у меня нет доступа к...

Zend Для разных модулей разный layout (Zend framework 1.x)
Конструкция: /application/layouts/scripts/layout.phtml (для всего проекта)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru