Инструменты пользователя

Инструменты сайта


yii:yii2:swiftmailer

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
yii:yii2:swiftmailer [2021/07/28 16:21]
werwolf [Изменение диспозиции]
yii:yii2:swiftmailer [2023/01/12 12:18] (текущий)
Строка 1: Строка 1:
 +====== SwiftMailer ======
  
 +Создание сообщений в Swift Mailer выполняется с помощью различных объектов MIME, предоставляемых библиотекой. Сложные сообщения могут быть быстро созданы с очень небольшими усилиями.
 +
 +===== Краткая справка =====
 +
 +Вы можете думать о создании сообщения как о чем-то похожем на шаги, которые вы выполняете,​ когда нажимаете кнопку Создать в почтовом клиенте. Вы даете ему тему, указываете некоторых получателей,​ добавляете любые вложения и пишете свое сообщение:​
 +
 +
 +
 +<code php>
 +// Create the message
 +$message = (new Swift_Message())
 +
 +  // Give the message a subject
 +  ->​setSubject('​Your subject'​)
 +
 +  // Set the From address with an associative array
 +  ->​setFrom(['​john@doe.com'​ => 'John Doe'])
 +
 +  // Set the To addresses with an associative array (setTo/​setCc/​setBcc)
 +  ->​setTo(['​receiver@domain.org',​ '​other@domain.org'​ => 'A name'​])
 +
 +  // Give it a body
 +  ->​setBody('​Here is the message itself'​)
 +
 +  // And optionally an alternative body
 +  ->​addPart('<​q>​Here is the message itself</​q>',​ '​text/​html'​)
 +
 +  // Optionally add any attachments
 +  ->​attach(Swift_Attachment::​fromPath('​my-document.pdf'​));​
 +</​code>​
 +
 +===== Основы сообщений =====
 +
 +Сообщение - это контейнер для всего, что вы хотите отправить кому-то другому. Есть несколько основных аспектов сообщения,​ которые вы должны знать.
 +
 +Сообщение электронной почты состоит из нескольких относительно простых сущностей,​ которые объединяются различными способами для достижения различных результатов. Все эти сущности имеют один и тот же фундаментальный контур,​ но служат разным целям. Само Сообщение может быть определено как сущность MIME, Вложение-это сущность MIME, все части MIME-это сущности MIME-и так далее!
 +
 +Основными единицами каждой сущности MIME-будь то само сообщение или Вложение-являются ее заголовки и тело:
 +
 +
 +<code php>
 +Header-Name:​ A header value
 +Other-Header:​ Another value
 +
 +The body content itself
 +</​code>​
 +
 +Заголовки сущности MIME и ее тело должны соответствовать некоторым строгим стандартам,​ определенным различными документами RFC. Swift Mailer гарантирует,​ что эти спецификации выполняются с использованием различных типов объектов,​ включая Кодеры и различные типы заголовков для генерации сущности.
 +
 +==== Структура сообщения ====
 +
 +Из всех мимических сущностей сообщение-''​Swift_Message''​самое большое и сложное. Он имеет множество свойств,​ которые могут быть обновлены,​ и может содержать другие MIME-сущности-например,​ вложения-вложенные внутри него.
 +
 +Сообщение имеет много различных заголовков,​ которые существуют для представления информации о сообщении почтовому клиенту получателей. Большинство из этих заголовков будут знакомы большинству пользователей,​ но мы перечислим основные из них. Хотя можно работать непосредственно с заголовками сообщения (или другой сущностью MIME), стандартные заголовки имеют методы доступа,​ предоставляемые для абстрагирования сложных деталей для вас. Например,​ хотя дата в сообщении записана в строгом формате,​ вам нужно только передать экземпляр ''​setDate()''​DateTimeInterface .
 +
 +^Заголовок^Описание^Аксессоры|
 +|''​Message-ID''​|Идентифицирует это сообщение с помощью уникального идентификатора,​ обычно содержащего сгенерированное доменное имя и время|''​getId()''​ / ''​setId()''​|
 +|''​Return-Path''​|Указывает,​ куда должны идти отскоки (Swift Mailer читает это для других целей).|''​getReturnPath()''​ / ''​setReturnPath()''​|
 +|''​From''​|Указывает адрес человека,​ от которого пришло сообщение. Это может быть несколько адресов,​ если сообщение написали несколько человек.|''​getFrom()''​ / ''​setFrom()''​|
 +|''​Sender''​|Указывает адрес лица, физически отправившего сообщение (более высокий приоритет,​ чем''​From:''​).|''​getSender()''​ / ''​setSender()''​|
 +|''​To''​|Указывает адреса предполагаемых получателей|''​getTo()''​ / ''​setTo()''​|
 +|''​Cc''​|Указывает адреса получателей которые будут скопированы в сообщение|''​getCc()''​ / ''​setCc()''​|
 +|''​Bcc''​|Указывает адреса получателей,​ на которых будет скопировано сообщение вслепую. Другие получатели не будут знать об этих копиях.|''​getBcc()''​ / ''​setBcc()''​|
 +|''​Reply-To''​|Указывает адрес на который отправляются ответы|''​getReplyTo()''​ / ''​setReplyTo()''​|
 +|''​Subject''​|Задает строку темы, отображаемую в почтовом клиенте получателей|''​getSubject()''​ / ''​setSubject()''​|
 +|''​Date''​|Указывает дату отправки сообщения|''​getDate()''​ / ''​setDate()''​|
 +|''​Content-Type''​|Указывает формат сообщения (обычно ''​text/​plain''​или ''​text/​html''​).|''​getContentType()''​ / ''​setContentType()''​|
 +|''​Content-Transfer-Encoding''​|Указывает схему кодирования в сообщении|''​getEncoder()''​ / ''​setEncoder()''​|
 +
 +==== Работа с объектом сообщения ====
 +
 +Хотя существует много доступных методов для объекта сообщения,​ вам нужно использовать только небольшое их подмножество. Обычно вы будете использовать ''​setSubject()'',​ ''​setTo()''​и ''​setFrom()''​перед установкой тела вашего сообщения с''​setBody()'':​
 +
 +<code php>
 +$message = new Swift_Message();​
 +$message->​setSubject('​My subject'​);​
 +</​code>​
 +
 +Все сущности MIME (включая сообщение) имеют ''​toString()''​метод , который можно вызвать,​ если вы хотите взглянуть на то, что будет отправлено. Например,​ если ''​echo $message->​toString();''​бы вы увидели что-то подобное:​
 +
 +
 +<code powershell>​
 +Message-ID: ​
 +Date: Thu, 25 Dec 2008 13:54:38 +1100
 +Subject: Example subject
 +From: Chris Corbyn ​
 +To: Receiver Name 
 +MIME-Version:​ 1.0
 +Content-Type:​ text/plain; charset=utf-8
 +Content-Transfer-Encoding:​ quoted-printable
 +
 +Here is the message
 +</​code>​
 +
 +Мы рассмотрим более подробно методы,​ которые вы используете для создания своего сообщения,​ в следующих разделах.
 +
 +===== Добавление контента в Ваше сообщение =====
 +
 +Богатый контент может быть добавлен к сообщениям в Swift Mailer с относительной легкостью,​ вызвав такие методы , как''​setSubject()'',''​setBody()'',​ ''​addPart()''​и ''​attach()''​.
 +
 +==== Настройка темы ====
 +
 +Строка темы, отображаемая в почтовом клиенте получателей,​ может быть задана с ''​setSubject()''​помощью метода или в качестве параметра''​new Swift_Message()'':​
 +
 +
 +<code php>
 +// Pass it as a parameter when you create the message
 +$message = new Swift_Message('​My amazing subject'​);​
 +
 +// Or set it after like this
 +$message->​setSubject('​My amazing subject'​);​
 +</​code>​
 +
 +==== Настройка содержимого тела ====
 +
 +Тело сообщения-видимое,​ когда пользователь открывает сообщение-определяется вызовом ''​setBody()''​метода. Если необходимо включить альтернативное тело, ''​addPart()''​его можно использовать.
 +
 +Тело сообщения - это основная часть, которую читает пользователь. Часто люди хотят отправить сообщение в формате HTML (''​text/​html''​),​ в других случаях люди хотят отправить в обычном тексте (''​text/​plain''​),​ или иногда люди хотят отправить обе версии и позволить получателю выбрать,​ как они видят сообщение.
 +
 +Как правило,​ если вы собираетесь отправить электронное письмо в формате HTML, всегда включайте в него обычный текстовый эквивалент того же контента,​ чтобы пользователи,​ предпочитающие читать обычный текст, могли это сделать.
 +
 +Если почтовый клиент получателя предлагает предпочтения для отображения текста,​ то HTML, то почтовый клиент представит эту часть пользователю там, где она доступна. В других случаях почтовый клиент будет отображать "​лучшую"​ часть, которую он может - обычно HTML, если вы включили HTML:
 +
 +
 +
 +<code php>
 +// Pass it as a parameter when you create the message
 +$message = new Swift_Message('​Subject here', 'My amazing body'​);​
 +
 +// Or set it after like this
 +$message->​setBody('​My <​em>​amazing</​em>​ body', '​text/​html'​);​
 +
 +// Add alternative parts with addPart()
 +$message->​addPart('​My amazing body in plain text', '​text/​plain'​);​
 +</​code>​
 +
 +===== Прикрепление Файлов =====
 +
 +Вложения являются загружаемыми частями сообщения и могут быть добавлены путем вызова ''​attach()''​метода для сообщения. Вы можете добавлять вложения,​ которые существуют на диске, или создавать вложения на лету.
 +
 +Хотя мы называем файлы, отправленные по электронной почте, "​вложениями"​-потому что они прикреплены к сообщению,​ - многие другие части сообщения на самом деле "​прикреплены",​ даже если мы не называем эти части вложениями.
 +
 +Файловые вложения создаются ''​Swift_Attachment''​классом и затем присоединяются к сообщению с помощью ''​attach()''​метода на нем. Для всех типов MIME "​каждый день",​ таких как все графические форматы,​ документы word, PDF-файлы и электронные таблицы,​ вам не нужно явно устанавливать тип содержимого вложения,​ хотя это не повредит. Для менее распространенных форматов вы должны установить тип контента,​ который мы рассмотрим чуть позже.
 +
 +==== Прикрепление Существующих Файлов ====
 +
 +Файлы, которые уже существуют либо на диске, либо по URL-адресу,​ могут быть прикреплены к сообщению всего одной строкой кода, используя ''​Swift_Attachment::​fromPath()''​.
 +
 +Вы можете прикреплять файлы, которые существуют локально,​ или, если ваша установка PHP ''​allow_url_fopen''​включена,​ вы можете прикреплять файлы с других веб-сайтов.
 +
 +Вложение будет представлено получателю в виде загружаемого файла с тем же именем,​ что и прикрепленный:​
 +
 +
 +<code php>
 +// Create the attachment
 +// * Note that you can technically leave the content-type parameter out
 +$attachment = Swift_Attachment::​fromPath('/​path/​to/​image.jpg',​ '​image/​jpeg'​);​
 +
 +// Attach it to the message
 +$message->​attach($attachment);​
 +
 +// The two statements above could be written in one line instead
 +$message->​attach(Swift_Attachment::​fromPath('/​path/​to/​image.jpg'​));​
 +
 +// You can attach files from a URL if allow_url_fopen is on in php.ini
 +$message->​attach(Swift_Attachment::​fromPath('​http://​site.tld/​logo.png'​));​
 +</​code>​
 +
 +==== Установка имени файла ====
 +
 +Обычно вам не нужно явно устанавливать имя файла вложения,​ потому что имя вложенного файла будет использоваться по умолчанию,​ но если вы хотите установить имя файла, вы используете ''​setFilename()''​метод вложения.
 +
 +Вложение будет прикреплено обычным способом,​ но метаданные,​ отправленные внутри письма,​ переименуют файл во что-то другое:​
 +
 +
 +<code php>
 +// Create the attachment and call its setFilename() method
 +$attachment = Swift_Attachment::​fromPath('/​path/​to/​image.jpg'​)
 +  ->​setFilename('​cool.jpg'​);​
 +
 +// Because there'​s a fluid interface, you can do this in one statement
 +$message->​attach(
 +  Swift_Attachment::​fromPath('/​path/​to/​image.jpg'​)->​setFilename('​cool.jpg'​)
 +);
 +</​code>​
 +
 +==== Прикрепление Динамического Контента ====
 +
 +Файлы, созданные во время выполнения,​ такие как PDF-документы или изображения,​ созданные с помощью GD, могут быть прикреплены непосредственно к сообщению,​ не записывая их на диск. Используйте ''​Swift_Attachment''​непосредственно.
 +
 +Вложение будет представлено получателю в виде загружаемого файла с указанным именем и типом содержимого:​
 +
 +
 +<code php>
 +// Create your file contents in the normal way, but don't write them to disk
 +$data = create_my_pdf_data();​
 +
 +// Create the attachment with your data
 +$attachment = new Swift_Attachment($data,​ '​my-file.pdf',​ '​application/​pdf'​);​
 +
 +// Attach it to the message
 +$message->​attach($attachment);​
 +
 +
 +// You can alternatively use method chaining to build the attachment
 +$attachment = (new Swift_Attachment())
 +  ->​setFilename('​my-file.pdf'​)
 +  ->​setContentType('​application/​pdf'​)
 +  ->​setBody($data);​
 +</​code>​
 +
 +<​note>​
 +Если вы обычно записываете файл на диск в любом случае,​ вы должны просто прикрепить его, ''​Swift_Attachment::​fromPath()''​так как это будет использовать меньше памяти.
 +</​note>​
 +==== Изменение диспозиции ====
 +
 +Вложения просто появляются в виде файлов,​ которые при желании можно сохранить на рабочем столе. Вы можете сделать так, чтобы вложение отображалось встроенным,​ где это возможно,​ с помощью ''​setDisposition()''​метода вложения.
 +
 +Вложение будет отображаться в окне просмотра электронной почты если почтовый клиент знает как его отобразить:​
 +
 +<code php>
 +// Create the attachment and call its setDisposition() method
 +$attachment = Swift_Attachment::​fromPath('/​path/​to/​image.jpg'​)
 +  ->​setDisposition('​inline'​);​
 +
 +
 +// Because there'​s a fluid interface, you can do this in one statement
 +$message->​attach(
 +  Swift_Attachment::​fromPath('/​path/​to/​image.jpg'​)->​setDisposition('​inline'​));​
 +</​code>​
 +
 +<​note>​
 +
 +Если вы попытаетесь создать встроенное вложение для не отображаемого типа файла, такого как ZIP-файл,​ почтовый клиент должен просто представить вложение как обычное.
 +</​note>​
 +==== Встраивание Встроенных медиафайлов ====
 +
 +Часто люди хотят включить изображение или другой контент в HTML-сообщение. Это легко сделать с помощью HTML-ссылок на удаленные ресурсы,​ но этот подход обычно блокируется почтовыми клиентами. Swift Mailer позволяет вам вставлять ваши носители непосредственно в сообщение.
 +
 +Почтовые клиенты обычно блокируют загрузку с удаленных ресурсов,​ потому что этот метод часто использовался как средство отслеживания того, кто открыл электронное письмо. Если вы отправляете HTML-письмо и хотите включить изображение в сообщение,​ другой подход,​ который вы можете использовать,​ - это встроить изображение непосредственно.
 +
 +Swift Mailer делает встраивание файлов в сообщения чрезвычайно упрощенным. Вы вставляете файл, вызывая ''​embed()''​метод сообщения,​ который возвращает значение,​ которое вы можете использовать в ''​src''''​href''​атрибуте a или в вашем HTML.
 +
 +Как и в случае с вложениями,​ можно вставлять динамически генерируемый контент без наличия существующего файла.
 +
 +Встроенные файлы отправляются по электронной почте в виде специального типа вложений с уникальным идентификатором,​ используемым для ссылки на них в ваших HTML-атрибутах. В почтовых клиентах,​ которые не поддерживают встроенные файлы, они могут отображаться как вложения.
 +
 +Хотя это обычно делается для изображений,​ теоретически это будет работать для любого отображаемого (или воспроизводимого) типа носителей. Однако поддержка других типов носителей (например,​ видео) зависит от почтового клиента.
 +
 +=== Встраивание Существующих Файлов ===
 +
 +Файлы, которые уже существуют либо на диске, либо по URL-адресу,​ могут быть встроены в сообщение всего одной строкой кода, используя ''​Swift_EmbeddedFile::​fromPath()''​.
 +
 +Вы можете вставлять файлы, существующие локально,​ или, если ваша установка PHP ''​allow_url_fopen''​включена,​ вы можете вставлять файлы с других веб-сайтов.
 +
 +Файл будет отображаться с сообщением встроенным в HTML код везде где его идентификатор используется в качестве ''​src''​атрибута:​
 +
 +
 +<code php>
 +// Create the message
 +$message = new Swift_Message('​My subject'​);​
 +
 +// Set the body
 +$message->​setBody(
 +'<​html>'​ .
 +' <​body>'​ .
 +' ​ Here is an image <img src="'​ . // Embed the file
 +     ​$message->​embed(Swift_Image::​fromPath('​image.png'​)) .
 +   '"​ alt="​Image"​ />' .
 +' ​ Rest of message'​ .
 +' </​body>'​ .
 +'</​html>',​
 +  '​text/​html'​ // Mark the content-type as HTML
 +);
 +
 +// You can embed files from a URL if allow_url_fopen is on in php.ini
 +$message->​setBody(
 +'<​html>'​ .
 +' <​body>'​ .
 +' ​ Here is an image <img src="'​ .
 +     ​$message->​embed(Swift_Image::​fromPath('​http://​site.tld/​logo.png'​)) .
 +   '"​ alt="​Image"​ />' .
 +' ​ Rest of message'​ .
 +' </​body>'​ .
 +'</​html>',​
 +  '​text/​html'​
 +);
 +</​code>​
 +
 +
 +<note tip>
 +''​Swift_Image''​ и ''​Swift_EmbeddedFile''​являются просто псевдонимами друг друга. ''​Swift_Image''​ существует для семантических целей.
 +</​note>​
 +
 +
 +<​note>​
 +Вы можете вставлять файлы в два этапа, если хотите. Просто захватите возвращаемое значение ''​embed()''​переменной in и используйте его в качестве ''​src''​атрибута:​
 +</​note>​
 +
 +
 +<code php>
 +// If placing the embed() code inline becomes cumbersome
 +// it's easy to do this in two steps
 +$cid = $message->​embed(Swift_Image::​fromPath('​image.png'​));​
 +
 +$message->​setBody(
 +'<​html>'​ .
 +' <​body>'​ .
 +' ​ Here is an image <img src="'​ . $cid . '"​ alt="​Image"​ />' .
 +' ​ Rest of message'​ .
 +' </​body>'​ .
 +'</​html>',​
 +  '​text/​html'​ // Mark the content-type as HTML
 +);
 +</​code>​
 +
 +=== Встраивание Динамического контента ===
 +
 +Образы,​ созданные во время выполнения,​ например образы,​ созданные с помощью GD, могут быть встроены непосредственно в сообщение без записи их на диск. Используйте стандартный ''​new Swift_Image()''​метод.
 +
 +Файл будет отображаться с сообщением встроенным в HTML везде где его идентификатор используется в качестве ''​src''​атрибута:​
 +
 +
 +
 +<code php>
 +// Create your file contents in the normal way, but don't write them to disk
 +$img_data = create_my_image_data();​
 +
 +// Create the message
 +$message = new Swift_Message('​My subject'​);​
 +
 +// Set the body
 +$message->​setBody(
 +'<​html>'​ .
 +' <​body>'​ .
 +' ​ Here is an image <img src="'​ . // Embed the file
 +     ​$message->​embed(new Swift_Image($img_data,​ '​image.jpg',​ '​image/​jpeg'​)) .
 +   '"​ alt="​Image"​ />' .
 +' ​ Rest of message'​ .
 +' </​body>'​ .
 +'</​html>',​
 +  '​text/​html'​ // Mark the content-type as HTML
 +);
 +</​code>​
 +
 +<note tip>
 +''​Swift_Image''​ и ''​Swift_EmbeddedFile''​являются просто псевдонимами друг друга. ''​Swift_Image''​ существует для семантических целей.
 +</​note>​
 +
 +
 +<​note>​
 +Вы можете вставлять файлы в два этапа, если хотите. Просто захватите возвращаемое значение ''​embed()''​переменной in и используйте его в качестве ''​src''​атрибута:​
 +</​note>​
 +
 +<code php>
 +// If placing the embed() code inline becomes cumbersome
 +// it's easy to do this in two steps
 +$cid = $message->​embed(new Swift_Image($img_data,​ '​image.jpg',​ '​image/​jpeg'​));​
 +
 +$message->​setBody(
 +'<​html>'​ .
 +' <​body>'​ .
 +' ​ Here is an image <img src="'​ . $cid . '"​ alt="​Image"​ />' .
 +' ​ Rest of message'​ .
 +' </​body>'​ .
 +'</​html>',​
 +  '​text/​html'​ // Mark the content-type as HTML
 +);
 +</​code>​
 +
 +===== Добавление получателей к Вашему сообщению =====
 +
 +Получатели указываются в самом сообщении через ''​setTo()'',​ ''​setCc()''​и ''​setBcc()''​. Swift Mailer считывает этих получателей из сообщения,​ когда оно отправляется,​ чтобы знать, куда его отправить.
 +
 +Получатели сообщений бывают трех типов:
 +
 +  * ''​To:''​ получатели - первичные получатели (обязательно)
 +  * ''​Cc:''​ получатели - получают копию сообщения (необязательно).
 +  * ''​Bcc:''​ получатели -- скрыты от других получателей (необязательно)
 +
 +Каждый тип может содержать один или несколько адресов. Можно перечислить только адреса получателей или персонализировать адрес, указав настоящее имя получателя.
 +
 +Обязательно добавьте в качестве получателей только действительные адреса электронной почты. Если вы попытаетесь добавить недопустимый адрес электронной почты с ''​setTo()''''​setCc()''​помощью или ''​setBcc()'',​ Swift Mailer выдаст a ''​Swift_RfcComplianceException''​.
 +
 +Если вы добавляете получателей автоматически на основе источника данных,​ который может содержать недопустимые адреса электронной почты, вы можете предотвратить возможные исключения,​ проверив эти адреса с помощью:​
 +
 +<code php>
 +use Egulias\EmailValidator\EmailValidator;​
 +use Egulias\EmailValidator\Validation\RFCValidation;​
 +
 +$validator = new EmailValidator();​
 +$validator->​isValid("​example@example.com",​ new RFCValidation());​ //true
 +</​code>​
 +
 +и только добавляя адреса,​ которые проверяют. Другой способ-обернуть ваш ''​setTo()''''​setCc()''​и ''​setBcc()''​вызывает блок try-catch и обрабатывать ''​Swift_RfcComplianceException''​его в блоке catch.
 +
 +Синтаксис для адресов
 +
 +Если вы хотите ссылаться только на один адрес электронной почты (например,​ ваш ''​From:''​адрес),​ вы можете просто использовать строку:​
 +
 +
 +<code php>
 +$message->​setFrom('​some@address.tld'​);​
 +</​code>​
 +
 +Если вы хотите включить имя, то вы должны использовать ассоциативный массив:​
 +
 +
 +<code php>
 +$message->​setFrom(['​some@address.tld'​ => 'The Name'​]);​
 +</​code>​
 +
 +Если вы хотите включить несколько адресов,​ то вы должны использовать массив:​
 +
 +<code php>
 +$message->​setTo(['​some@address.tld',​ '​other@address.tld'​]);​
 +</​code>​
 +
 +Вы можете смешивать персонализированные (адреса с именем) и неперсонифицированные адреса в одном списке,​ смешивая использование ассоциативного и неассоциативного синтаксиса массива:​
 +
 +<code php>
 +$message->​setTo([
 +  '​recipient-with-name@example.org'​ => '​Recipient Name One',
 +  '​no-name@example.org',​ // Note that this is not a key-value pair
 +  '​named-recipient@example.org'​ => '​Recipient Name Two'
 +]);
 +</​code>​
 +
 +==== Настройка To:​получателей ====
 +
 +''​To:''​ получатели требуются в сообщении и задаются с ''​setTo()''''​addTo()''​помощью методов или сообщения.
 +
 +Чтобы задать ''​To:''​получателей,​ создайте объект сообщения с помощью либо ''​new Swift_Message( ... )'',​ затем вызовите ''​setTo()''​метод с полным массивом адресов,​ либо используйте ''​addTo()''​метод для итеративного добавления получателей.
 +
 +''​setTo()''​Метод принимает входные данные в различных форматах,​ как описано ранее в этой главе. ''​addTo()''​Метод принимает один или два параметра. Первый-адрес электронной почты, а второй необязательный параметр-имя получателя.
 +
 +''​To:''​ получатели видны в заголовках сообщений и будут видны другим получателям:​
 +
 +
 +<code php>
 +// Using setTo() to set all recipients in one go
 +$message->​setTo([
 +  '​person1@example.org',​
 +  '​person2@otherdomain.org'​ => '​Person 2 Name',
 +  '​person3@example.org',​
 +  '​person4@example.org',​
 +  '​person5@example.org'​ => '​Person 5 Name'
 +]);
 +</​code>​
 +
 +<​note>​
 +Многократные вызовы ''​setTo()''​не добавят новых получателей-каждый вызов переопределяет предыдущие вызовы. Если вы хотите итеративно добавлять получателей,​ используйте этот ''​addTo()''​метод:​
 +</​note>​
 +
 +<code php>
 +// Using addTo() to add recipients iteratively
 +$message->​addTo('​person1@example.org'​);​
 +$message->​addTo('​person2@example.org',​ '​Person 2 Name'​);​
 +</​code>​
 +
 +==== Настройка Cc:​получателей ====
 +
 +''​Cc:''​ получатели задаются с ''​setCc()''''​addCc()''​помощью методов или сообщения.
 +
 +Чтобы задать ''​Cc:''​получателей,​ создайте объект сообщения с помощью либо ''​new Swift_Message( ... )'',​ затем вызовите ''​setCc()''​метод с полным массивом адресов,​ либо используйте ''​addCc()''​метод для итеративного добавления получателей.
 +
 +''​setCc()''​Метод принимает входные данные в различных форматах,​ как описано ранее в этой главе. ''​addCc()''​Метод принимает один или два параметра. Первый-адрес электронной почты, а второй необязательный параметр-имя получателя.
 +
 +''​Cc:''​ получатели видны в заголовках сообщений и будут видны другим получателям:​
 +
 +
 +<code php>
 +// Using setTo() to set all recipients in one go
 +$message->​setTo([
 +  '​person1@example.org',​
 +  '​person2@otherdomain.org'​ => '​Person 2 Name',
 +  '​person3@example.org',​
 +  '​person4@example.org',​
 +  '​person5@example.org'​ => '​Person 5 Name'
 +]);
 +</​code>​
 +
 +<​note>​
 +Многократные вызовы ''​setCc()''​не добавят новых получателей-каждый вызов переопределяет предыдущие вызовы. Если вы хотите итеративно добавить Cc: recipients, используйте этот ''​addCc()''​метод:​
 +</​note>​
 +
 +<code php>
 +// Using addCc() to add recipients iteratively
 +$message->​addCc('​person1@example.org'​);​
 +$message->​addCc('​person2@example.org',​ '​Person 2 Name'​);​
 +</​code>​
 +
 +==== Настройка Bcc:​получателей ====
 +
 +''​Bcc:''​ получатели получают копию сообщения так, чтобы никто другой об этом не знал, и им задаются методы ''​setBcc()''​или ''​addBcc()''​этого сообщения.
 +
 +Чтобы задать ''​Bcc:''​получателей,​ создайте объект message с помощью любого ''​new Swift_Message( ... )''​из них , затем вызовите ''​setBcc()''​метод с полным массивом адресов или используйте этот ''​addBcc()''​метод для итеративного добавления получателей.
 +
 +Этот ''​setBcc()''​метод принимает входные данные в различных форматах,​ как описано ранее в этой главе. ''​addBcc()''​Метод принимает один или два параметра. Первый - это адрес электронной почты, а второй необязательный параметр - имя получателя.
 +
 +Только отдельный ''​Bcc:''​получатель будет видеть свой адрес в заголовках сообщений. Другие получатели (включая других ''​Bcc:''​получателей) не увидят этот адрес:
 +
 +
 +<code php>
 +// Using setBcc() to set all recipients in one go
 +$message->​setBcc([
 +  '​person1@example.org',​
 +  '​person2@otherdomain.org'​ => '​Person 2 Name',
 +  '​person3@example.org',​
 +  '​person4@example.org',​
 +  '​person5@example.org'​ => '​Person 5 Name'
 +]);
 +</​code>​
 +
 +<​note>​
 +Многократные вызовы ''​setBcc()''​не добавят новых получателей-каждый вызов переопределяет предыдущие вызовы. Если вы хотите итеративно добавить Bcc: recipients, используйте этот ''​addBcc()''​метод:​
 +</​note>​
 +
 +<code php>
 +// Using addBcc() to add recipients iteratively
 +$message->​addBcc('​person1@example.org'​);​
 +$message->​addBcc('​person2@example.org',​ '​Person 2 Name'​);​
 +</​code>​
 +
 +
 +<note important>​
 +Интернационализированные Адреса Электронной Почты
 +
 +Традиционно в адресах электронной почты разрешались только символы ASCII. С введением интернационализированных доменных имен (IDN) в доменном имени могут появиться символы,​ отличные от ASCII. По умолчанию Swiftmailer кодирует такие доменные имена в Punycode (например,​ xn--xample-ova.invalid). Это совместимо со всеми почтовыми серверами.
 +
 +RFC 6531 ввел расширение SMTP, SMTPUTF8, которое позволяет использовать символы,​ отличные от ASCII, в адресах электронной почты с обеих сторон знака@. Для отправки на такие адреса ваш исходящий SMTP-сервер должен поддерживать расширение SMTPUTF8. Вы должны использовать кодировщик ''​Swift_AddressEncoder_Utf8AddressEncoder''​адресов и включить обработчик ''​Swift_Transport_Esmtp_SmtpUtf8Handler''​расширений SMTP:
 +</​note>​
 +<code php>
 +$smtpUtf8 = new Swift_Transport_Esmtp_SmtpUtf8Handler();​
 +$transport->​setExtensionHandlers([$smtpUtf8]);​
 +$utf8Encoder = new Swift_AddressEncoder_Utf8AddressEncoder();​
 +$transport->​setAddressEncoder($utf8Encoder);​
 +</​code>​
 +
 +===== Указание сведений об отправителе =====
 +
 +Электронное письмо должно содержать информацию о том, кто его отправил. Обычно это управляется ''​From:''​адресом,​ однако есть и другие варианты.
 +
 +Информация об отправителе содержится в трех возможных местах:​
 +
 +  * ''​From:''​ -- адрес(адреса) автора сообщения (обязательно)
 +  * ''​Sender:''​ -- адрес одного человека,​ отправившего сообщение (необязательно)
 +  * ''​Return-Path:''​ -- адрес, куда должны идти отскоки (необязательно)
 +
 +Вы всегда должны включать ''​From:''''​setFrom()''​в сообщение адрес. Swift Mailer будет использовать это значение по умолчанию''​Return-Path:'',​ если не указано иное.
 +
 +''​Sender:''​Адрес существует потому,​ что человек,​ который действительно отправил электронное письмо,​ может быть не тем человеком,​ который его написал. Он имеет более высокий приоритет,​ чем ''​From:''​адрес,​ и будет использоваться в качестве ''​Return-Path:''​адреса,​ если не указано иное.
 +
 +==== Установка From:​адреса ====
 +
 +''​From:''​Адрес является обязательным и устанавливается с ''​setFrom()''​помощью метода сообщения. ''​From:''​ адреса указывают,​ кто на самом деле написал письмо и, как правило,​ кто его отправил.
 +
 +Большинство людей, вероятно,​ не понимают,​ что у вас может быть более одного ''​From:''​адреса,​ если письмо написал более одного человека-например,​ если письмо было составлено комитетом.
 +
 +''​From:''​Адреса видны в заголовках сообщений и будут видны получателям.
 +
 +<​note>​
 +Если вы установили несколько ''​From:''​адресов,​ то вы абсолютно должны установить ''​Sender:''​адрес,​ чтобы указать,​ кто физически отправил сообщение.
 +</​note>​
 +
 +<code php>
 +// Set a single From: address
 +$message->​setFrom('​your@address.tld'​);​
 +
 +// Set a From: address including a name
 +$message->​setFrom(['​your@address.tld'​ => 'Your Name'​]);​
 +
 +// Set multiple From: addresses if multiple people wrote the email
 +$message->​setFrom([
 +  '​person1@example.org'​ => '​Sender One',
 +  '​person2@example.org'​ => '​Sender Two'
 +]);
 +</​code>​
 +
 +==== Установка Sender:​адреса ====
 +
 +''​Sender:''​Адрес указывает,​ кто отправил сообщение,​ и устанавливается с ''​setSender()''​помощью метода сообщения.
 +
 +''​Sender:''​Адрес виден в заголовках сообщений и будет виден получателям.
 +
 +Этот адрес будет использоваться,​ ''​Return-Path:''​если не указано иное.
 +
 +<​note>​
 +Если вы установили несколько ''​From:''​адресов,​ то вы абсолютно должны установить ''​Sender:''​адрес,​ чтобы указать,​ кто физически отправил сообщение.
 +</​note>​
 +
 +Вы не должны устанавливать более одного адреса отправителя на сообщение,​ потому что это не возможно для более чем одного человека,​ чтобы отправить одно сообщение:​
 +
 +
 +<code php>
 +$message->​setSender('​your@address.tld'​);​
 +</​code>​
 +
 +==== Установка Return-Path:​(отскок) Адрес ====
 +
 +''​Return-Path:''​Адрес указывает,​ куда должны быть отправлены уведомления об отказе,​ и устанавливается с ''​setReturnPath()''​помощью метода сообщения.
 +
 +Вы можете иметь только один''​Return-Path:'',​ и он не должен включать личное имя.
 +
 +Уведомления об отказе будут отправлены на этот адрес:
 +
 +
 +<code php>
 +$message->​setReturnPath('​bounces@address.tld'​);​
 +</​code>​
 +
 +===== Подписанное/​Зашифрованное сообщение =====
 +
 +Для повышения целостности/​безопасности сообщения можно подписать и/или зашифровать сообщение с помощью одного или нескольких подписывающих устройств.
 +
 +==== S/MIME ====
 +
 +S/MIME может подписывать и/или шифровать сообщение с помощью расширения OpenSSL.
 +
 +Подписывая сообщение,​ подписчик создает подпись всего содержимого сообщения (включая вложения).
 +
 +Сертификат и закрытый ключ должны быть закодированы PEM и могут быть либо созданы с использованием,​ например,​ OpenSSL, либо получены в официальном Центре сертификации (CA).
 +
 +**Для проверки подписи получатель должен иметь сертификат ЦС в списке доверенных эмитентов.**
 +
 +**Убедитесь,​ что сертификат поддерживает защиту электронной почты.**
 +
 +При использовании OpenSSL это можно сделать с помощью параметра-addtrust emailProtection при создании сертификата:​
 +
 +
 +<code php>
 +$message = new Swift_Message();​
 +
 +$smimeSigner = new Swift_Signers_SMimeSigner();​
 +$smimeSigner->​setSignCertificate('/​path/​to/​certificate.pem',​ '/​path/​to/​private-key.pem'​);​
 +$message->​attachSigner($smimeSigner);​
 +</​code>​
 +
 +Когда закрытый ключ защищен с помощью парольной фразы, используйте вместо этого следующее:​
 +
 +
 +<code php>
 +$message = new Swift_Message();​
 +
 +$smimeSigner = new Swift_Signers_SMimeSigner();​
 +$smimeSigner->​setSignCertificate('/​path/​to/​certificate.pem',​ ['/​path/​to/​private-key.pem',​ '​passphrase'​]);​
 +$message->​attachSigner($smimeSigner);​
 +</​code>​
 +
 +По умолчанию подпись добавляется как вложение,​ делая сообщение все еще читаемым для почтовых агентов,​ не поддерживающих подписанные сообщения.
 +
 +Хранение сообщения в двоичном виде также возможно,​ но не рекомендуется:​
 +
 +
 +<code php>
 +$smimeSigner->​setSignCertificate('/​path/​to/​certificate.pem',​ '/​path/​to/​private-key.pem',​ PKCS7_BINARY);​
 +</​code>​
 +
 +При шифровании сообщения (также известном как обертывание) все сообщение (включая вложения) шифруется с помощью сертификата,​ и получатель может затем расшифровать сообщение с помощью соответствующего закрытого ключа.
 +
 +Шифрование гарантирует,​ что никто не сможет прочитать содержимое сообщения без закрытого ключа.
 +
 +Обычно получатель предоставляет сертификат для шифрования и сохранения ключа дешифрования в тайне.
 +
 +Также возможно использование как подписи,​ так и шифрования:​
 +
 +
 +<code php>
 +$message = new Swift_Message();​
 +
 +$smimeSigner = new Swift_Signers_SMimeSigner();​
 +$smimeSigner->​setSignCertificate('/​path/​to/​sign-certificate.pem',​ '/​path/​to/​private-key.pem'​);​
 +$smimeSigner->​setEncryptCertificate('/​path/​to/​encrypt-certificate.pem'​);​
 +$message->​attachSigner($smimeSigner);​
 +</​code>​
 +
 +Используемый шифр шифрования может быть установлен в качестве второго параметра setEncryptCertificate ().
 +
 +Видишь [[https://​z5h64q92x9.net/​proxy_u/​en-ru.ru.c8e08476-610154fe-59489edd-74722d776562/​https/​secure.php.net/​manual/​openssl.ciphers|https://​secure.php.net/​manual/​openssl.ciphers]] список поддерживаемых шифров.
 +
 +По умолчанию сообщение сначала подписывается,​ а затем шифруется,​ это можно изменить,​ добавив:​
 +
 +
 +<code php>
 +$smimeSigner->​setSignThenEncrypt(false);​
 +</​code>​
 +
 +**Изменять это не рекомендуется,​ так как большинство почтовых агентов не поддерживают этот нестандартный способ.**
 +
 +Только если у вас возникли проблемы с методом sign then encrypt, это должно быть изменено.
 +
 +===== Запрос квитанции на чтение =====
 +
 +При открытии электронной почты можно запросить отправку квитанции на чтение на указанный адрес. Чтобы запросить квитанцию на чтение,​ установите адрес с помощью''​setReadReceiptTo()'':​
 +
 +<code php>
 +$message->​setReadReceiptTo('​your@address.tld'​);​
 +</​code>​
 +
 +При открытии письма,​ если почтовый клиент его поддерживает , на этот адрес будет отправлено уведомление.
 +
 +<note tip>
 +Чтение квитанций не будет работать для большинства получателей,​ так как многие почтовые клиенты автоматически отключают их. Те клиенты,​ которые отправят квитанцию на чтение,​ сообщат пользователю,​ что она была запрошена.
 +</​note>​
 +===== Настройка набора символов =====
 +
 +Набор символов сообщения (и его частей MIME) устанавливается с ''​setCharset()''​помощью метода. Вы также можете изменить глобальное значение по умолчанию UTF-8, работая с ''​Swift_Preferences''​классом.
 +
 +Swift Mailer будет по умолчанию использовать набор символов UTF-8, если не переопределено иное. UTF-8 будет работать в большинстве случаев,​ так как он включает в себя все стандартные символы клавиатуры США в дополнение к большинству международных символов.
 +
 +Это абсолютно жизненно важно, однако,​ что вы знаете,​ какой набор символов ваше сообщение (или это части MIME) написаны в противном случае ваше сообщение может быть получено полностью искаженным.
 +
 +В Swift Mailer есть два места, где вы можете изменить набор символов:​
 +
 +  * В ''​Swift_Preferences''​классе
 +  * На каждом отдельном сообщении и/или части MIME
 +
 +Чтобы установить набор символов вашего сообщения:​
 +
 +  * Измените глобальную настройку UTF-8, позвонив по телефону ''​Swift_Preferences::​setCharset()'';​ или
 +  * Вызовите ''​setCharset()''​метод для сообщения или части MIME: 1
 +
 +<code php>
 +// Approach 1: Change the global setting (suggested)
 +Swift_Preferences::​getInstance()->​setCharset('​iso-8859-2'​);​
 +
 +// Approach 2: Call the setCharset() method of the message
 +$message = (new Swift_Message())
 +  ->​setCharset('​iso-8859-2'​);​
 +
 +// Approach 3: Specify the charset when setting the body
 +$message->​setBody('​My body', '​text/​html',​ '​iso-8859-2'​);​
 +
 +// Approach 4: Specify the charset for each part added
 +$message->​addPart('​My part', '​text/​plain',​ '​iso-8859-2'​);​
 +</​code>​
 +
 +===== Настройка кодировки =====
 +
 +Тело каждой части пантомимы должно быть закодировано. Двоичные вложения кодируются в base64 с помощью ''​Swift_Mime_ContentEncoder_Base64ContentEncoder''​. Текстовые части традиционно кодируются в кавычках с помощью ''​Swift_Mime_ContentEncoder_QpContentEncoder''​or ''​Swift_Mime_ContentEncoder_NativeQpContentEncoder''​.
 +
 +Кодер сообщения или MIME-части устанавливается с помощью этого ''​setEncoder()''​метода.
 +
 +Quoted-printable-это безопасный выбор, потому что он преобразует 8-битный текст в 7-битный. Большинство современных SMTP-серверов поддерживают 8-битный текст. Это объявляется через расширение SMTP 8BITMIME. Если ваш исходящий SMTP-сервер поддерживает это расширение SMTP и поддерживает понижение уровня сообщения (например,​ преобразование в кавычки для печати на лету) при доставке на нисходящий сервер,​ который не поддерживает это расширение,​ вы можете использовать ''​Swift_Mime_ContentEncoder_PlainContentEncoder''​вместо ''​8bit''​него режим in. Это имеет то преимущество,​ что исходные данные немного более читабельны и компактны,​ особенно для незападных языков.
 +
 +<code php>
 +$eightBitMime = new Swift_Transport_Esmtp_EightBitMimeHandler();​ $transport->​setExtensionHandlers%%([%%$eightBitMime]);​ $plainEncoder = new Swift_Mime_ContentEncoder_PlainContentEncoder%%('​%%8bit'​);​ $message->>​setEncoder($plainEncoder); ​
 +</​code>​
 +
 +===== Установка длины линии =====
 +
 +Длина строк в сообщении может быть изменена с помощью ''​setMaxLineLength()''​метода на сообщении:​
 +
 +
 +<​code>​
 +$message->​setMaxLineLength(1000);​
 +</​code>​
 +
 +Swift Mailer по умолчанию использует 78 символов в строке сообщения. Это делается по историческим причинам и для того, чтобы сообщение можно было легко просмотреть в обычных текстовых терминалах
 +
 +Строки,​ длина которых превышает указанную длину строки,​ будут заключены между словами.
 +
 +
 +<note important>​
 +Вы никогда не должны устанавливать максимальную длину более 1000 символов в соответствии с RFC 2822. Это может привести к неопределенным побочным эффектам,​ таким как усечение частей вашего сообщения при его передаче между SMTP-серверами.
 +</​note>​
 +===== Установка приоритета сообщения =====
 +
 +Вы можете изменить приоритет сообщения с ''​setPriority()''​помощью кнопки . Установка приоритета не изменит способ отправки вашей электронной почты-это чисто ориентировочная настройка для получателя:​
 +
 +
 +<code php>
 +// Indicate "​High"​ priority
 +$message->​setPriority(2);​
 +</​code>​
 +
 +Приоритет сообщения - это указание получателю,​ какое значение оно имеет. Swift Mailer позволяет установить приоритет,​ вызвав ''​setPriority''​метод. Этот метод принимает целочисленное значение от 1 до 5:
 +
 +  * ''​Swift_Mime_SimpleMessage::​PRIORITY_HIGHEST'':​ 1
 +  * ''​Swift_Mime_SimpleMessage::​PRIORITY_HIGH'':​ 2
 +  * ''​Swift_Mime_SimpleMessage::​PRIORITY_NORMAL'':​ 3
 +  * ''​Swift_Mime_SimpleMessage::​PRIORITY_LOW'':​ 4
 +  * ''​Swift_Mime_SimpleMessage::​PRIORITY_LOWEST'':​ 5
 +
 +<code php>
 +// Or use the constant to be more explicit
 +$message->​setPriority(Swift_Mime_SimpleMessage::​PRIORITY_HIGH);​
 +</​code>​
 +
 +====передать переменную в шаблон====
 +
 +<code php>
 +Yii::​$app->​mail
 +    ->​compose(['​html'​ => '​layouts/​html2'​],​ ['​content'​ => $content])
 +    ->​setFrom(['​noreply@mailer.com'​ => '​Mailer'​])
 +</​code>​
 +
 +<code html>
 +<​body>​
 +    <?php $this->​beginBody() ?>
 +    <?= $content ?>
 +    <?php $this->​endBody() ?>
 +</​body>​
 +</​code>​
yii/yii2/swiftmailer.1627478519.txt.gz · Последние изменения: 2023/01/12 12:16 (внешнее изменение)