Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
yii:yii2:swiftmailer [2021/07/28 16:30] werwolf [Установка From:адреса] |
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> | ||