🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 邮件发送 ### [](https://octobercms.com/docs/services/mail#sending-mail)发送邮件 要发送消息,请使用外观`send`上的方法,该方法`Mail`接受三个参数。第一个参数是用于查找[邮件视图](https://octobercms.com/docs/services/mail#mail-views)或[邮件模板](https://octobercms.com/docs/services/mail#mail-templates)的唯一*邮件代码*。第二个参数是您希望传递给视图的数据数组。第三个参数是一个回调,它接收消息实例,使您可以自定义邮件的收件人,主题和其他方面:[](https://octobercms.com/docs/services/mail#mail-views)[](https://octobercms.com/docs/services/mail#mail-templates)`Closure` ~~~ // These variables are available inside the message as Twig $vars = ['name' => 'Joe', 'user' => 'Mary']; Mail::send('acme.blog::mail.message', $vars, function($message) { $message->to('admin@domain.tld', 'Admin Person'); $message->subject('This is a reminder'); }); ~~~ 由于`name`在上面的示例中传递了包含键的数组,因此可以使用以下Twig标记在电子邮件视图中显示值: ~~~ {{ name }} ~~~ > **注意:**您应该避免`message`在邮件中传递变量,该变量始终会传递并允许[附件](https://octobercms.com/docs/services/mail#attachments)的[内联嵌入](https://octobercms.com/docs/services/mail#attachments)。 #### 快速发送 十月还包括一个称为的替代方法`sendTo`,可以简化邮件的发送: ~~~ // Send to address using no name Mail::sendTo('admin@domain.tld', 'acme.blog::mail.message', $params); // Send using an object's properties Mail::sendTo($user, 'acme.blog::mail.message', $params); // Send to multiple addresses Mail::sendTo(['admin@domain.tld' => 'Admin Person'], 'acme.blog::mail.message', $params); // Alternatively send a raw message without parameters Mail::rawTo('admin@domain.tld', 'Hello friend'); ~~~ 中的第一个参数`sendTo`用于收件人可以采用不同的值类型: | 类型 | 描述 | | --- | --- | | 串 | 单个收件人地址,未定义名称。 | | 数组 | 多个收件人,其中数组键是地址,值是名称。 | | 目的 | 单个收件人对象,其中*email*属性用于地址,*名称*可选用于名称。 | | 采集 | 如上所述,收件人对象的集合。 | 的完整签名`sendTo`如下: ~~~ Mail::sendTo($recipient, $message, $params, $callback, $options); ~~~ * `$recipient`如上定义。 * `$message`是原始发送的模板名称或消息内容。 * `$params`模板内部提供的变量数组。 * `$callback`会使用一个参数`send`(方法描述的消息生成器)被调用(可选,默认为null)。如果不是可调用的值,则代替下一个options参数。 * `$options`作为数组传递的自定义发送选项(可选) `$options`支持以下自定义发送 * **queue**指定是对消息进行排队还是直接发送(可选,默认为false)。 * **BCC**指定是否添加收件人作为密件抄送或经常要地址(默认为false)。 #### 建立讯息 如前所述,该`send`方法的第三个参数是`Closure`允许您在电子邮件本身上指定各种选项。使用此闭包,您可以指定消息的其他属性,例如复本,盲目复本等: ~~~ Mail::send('acme.blog::mail.welcome', $vars, function($message) { $message->from('us@example.com', 'October'); $message->to('foo@example.com')->cc('bar@example.com'); }); ~~~ 这是`$message`消息生成器实例上可用方法的列表: ~~~ $message->from($address, $name = null); $message->sender($address, $name = null); $message->to($address, $name = null); $message->cc($address, $name = null); $message->bcc($address, $name = null); $message->replyTo($address, $name = null); $message->subject($subject); $message->priority($level); $message->attach($pathToFile, array $options = []); // Attach a file from a raw $data string... $message->attachData($data, $name, array $options = []); // Get the underlying SwiftMailer message instance... $message->getSwiftMessage(); ~~~ > **注意:**传递给`Mail::send`Closure的消息实例扩展了[SwiftMailer](http://swiftmailer.org/)消息类,使您可以调用该类上的任何方法来构建电子邮件。 #### 邮寄纯文本 默认情况下,`send`假定提供给该方法的视图包含HTML。但是,通过将数组作为方法的第一个参数`send`传递,除了HTML视图外,您还可以指定要发送的纯文本视图: ~~~ Mail::send(['acme.blog::mail.html', 'acme.blog::mail.text'], $data, $callback); ~~~ 或者,如果只需要发送纯文本电子邮件,则可以使用`text`数组中的键进行指定: ~~~ Mail::send(['text' => 'acme.blog::mail.text'], $data, $callback); ~~~ #### 邮寄已解析的原始字符串 `raw`如果您希望直接通过电子邮件发送原始字符串,则可以使用该方法。Markdown将解析此内容。 ~~~ Mail::raw('Text to e-mail', function ($message) { // }); ~~~ 此外,Twig将解析此字符串,如果您希望将变量传递到此环境,请改用`send`方法,将内容作为`raw`键。 ~~~ Mail::send(['raw' => 'Text to email'], $vars, function ($message) { // }); ~~~ #### 邮寄原始字符串 如果传递包含`text`或`html`键的数组,这将是发送邮件的显式请求。不使用布局或降价解析。 ~~~ Mail::raw([ 'text' => 'This is plain text', 'html' => '<strong>This is HTML</strong>' ], function ($message) { // }); ~~~ ### [](https://octobercms.com/docs/services/mail#attachments)附件 要将附件添加到电子邮件中,请使用传递给Closure`attach`的`$message`对象上的方法。该`attach`方法接受文件的完整路径作为其第一个参数: ~~~ Mail::send('acme.blog::mail.welcome', $data, function ($message) { // $message->attach($pathToFile); }); ~~~ 在将文件附加到消息时,您还可以通过将an`array`作为第二个参数传递给`attach`方法来指定显示名称和/或MIME类型: ~~~ $message->attach($pathToFile, ['as' => $display, 'mime' => $mime]); ~~~ ### [](https://octobercms.com/docs/services/mail#inline-attachments)内联附件 #### 将图像嵌入邮件内容 将嵌入式图像嵌入到电子邮件中通常很麻烦;但是,有一种简便的方法可以将图像附加到电子邮件并检索适当的CID。若要嵌入嵌入式图像,请在电子邮件视图中`embed`的`message`变量上使用方法。请记住,该`message`变量可用于所有邮件视图: ~~~ <body> Here is an image: <img src="{{ message.embed(pathToFile) }}"> </body> ~~~ 如果您打算使用排队的电子邮件,请确保文件的路径是绝对路径。为此,您可以简单地使用[应用过滤器](https://octobercms.com/docs/markup/filter-app): ~~~ <body> Here is an image: {% set pathToFile = 'storage/app/media/path/to/file.jpg' | app %} <img src="{{ message.embed(pathToFile) }}"> </body> ~~~ #### 将原始数据嵌入邮件内容 如果您已经有想要嵌入到电子邮件中的原始数据字符串,则可以`embedData`对`message`变量使用方法: ~~~ <body> Here is an image from raw data: <img src="{{ message.embedData(data, name) }}"> </body> ~~~ ### [](https://octobercms.com/docs/services/mail#queueing-mail)排队邮件 #### 排队邮件 由于发送邮件消息会大大延长应用程序的响应时间,因此许多开发人员选择将消息排队等待后台发送。使用内置的[统一队列API](https://octobercms.com/docs/services/queues)可以轻松实现。要使邮件排队,请使用外观`queue`上的方法`Mail`: ~~~ Mail::queue('acme.blog::mail.welcome', $data, function ($message) { // }); ~~~ 此方法将自动处理将作业推入队列以在后台发送邮件的情况。当然,在使用此功能之前,您将需要[配置队列](https://octobercms.com/docs/services/queues)。 #### 延迟的消息排队 如果您希望延迟发送排队的电子邮件,则可以使用该`later`方法。首先,只需将您希望延迟发送消息的秒数作为方法的第一个参数传递: ~~~ Mail::later(5, 'acme.blog::mail.welcome', $data, function ($message) { // }); ~~~ #### 推送到特定队列 如果希望指定要在其上推送消息的特定队列,则可以使用`queueOn`和`laterOn`方法来这样做: ~~~ Mail::queueOn('queue-name', 'acme.blog::mail.welcome', $data, function ($message) { // }); Mail::laterOn('queue-name', 5, 'acme.blog::mail.welcome', $data, function ($message) { // }); ~~~