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

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

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

Студворк — интернет-сервис помощи студентам
Добрый день, други!
От 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2022, 16:50
Ответы с готовыми решениями:

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

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

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

4
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
09.05.2022, 16:58
Лучший ответ Сообщение было отмечено Мамелюк как решение

Решение

Цитата Сообщение от Мамелюк Посмотреть сообщение
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  [ТС]
Цитата Сообщение от 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
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
09.05.2022, 17:54
Цитата Сообщение от Мамелюк Посмотреть сообщение
Просто у меня старый 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  [ТС]
crautcher, спасибо, всё работает!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.05.2022, 19:08
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru