<?php
namespace Illuminate\Mail\Mailables;
use Closure;
use Illuminate\Support\Arr;
use Illuminate\Support\Traits\Conditionable;
class Envelope
{
use Conditionable;
/**
* The address sending the message.
*
* @var \Illuminate\Mail\Mailables\Address|string|null
*/
public $from;
/**
* The recipients of the message.
*
* @var array
*/
public $to;
/**
* The recipients receiving a copy of the message.
*
* @var array
*/
public $cc;
/**
* The recipients receiving a blind copy of the message.
*
* @var array
*/
public $bcc;
/**
* The recipients that should be replied to.
*
* @var array
*/
public $replyTo;
/**
* The subject of the message.
*
* @var string|null
*/
public $subject;
/**
* The message's tags.
*
* @var array
*/
public $tags = [];
/**
* The message's meta data.
*
* @var array
*/
public $metadata = [];
/**
* The message's Symfony Message customization callbacks.
*
* @var array
*/
public $using = [];
/**
* Create a new message envelope instance.
*
* @param \Illuminate\Mail\Mailables\Address|string|null $from
* @param array $to
* @param array $cc
* @param array $bcc
* @param array $replyTo
* @param string|null $subject
* @param array $tags
* @param array $metadata
* @param \Closure|array $using
* @return void
*
* @named-arguments-supported
*/
public function __construct(Address|string $from = null, $to = [], $cc = [], $bcc = [], $replyTo = [], string $subject = null, array $tags = [], array $metadata = [], Closure|array $using = [])
{
$this->from = is_string($from) ? new Address($from) : $from;
$this->to = $this->normalizeAddresses($to);
$this->cc = $this->normalizeAddresses($cc);
$this->bcc = $this->normalizeAddresses($bcc);
$this->replyTo = $this->normalizeAddresses($replyTo);
$this->subject = $subject;
$this->tags = $tags;
$this->metadata = $metadata;
$this->using = Arr::wrap($using);
}
/**
* Normalize the given array of addresses.
*
* @param array $addresses
* @return array
*/
protected function normalizeAddresses($addresses)
{
return collect($addresses)->map(function ($address) {
return is_string($address) ? new Address($address) : $address;
})->all();
}
/**
* Specify who the message will be "from".
*
* @param \Illuminate\Mail\Mailables\Address|string $address
* @param string|null $name
* @return $this
*/
public function from(Address|string $address, $name = null)
{
$this->from = is_string($address) ? new Address($address, $name) : $address;
return $this;
}
/**
* Add a "to" recipient to the message envelope.
*
* @param \Illuminate\Mail\Mailables\Address|array|string $address
* @param string|null $name
* @return $this
*/
public function to(Address|array|string $address, $name = null)
{
$this->to = array_merge($this->to, $this->normalizeAddresses(
is_string($name) ? [new Address($address, $name)] : Arr::wrap($address),
));
return $this;
}
/**
* Add a "cc" recipient to the message envelope.
*
* @param \Illuminate\Mail\Mailables\Address|array|string $address
* @param string|null $name
* @return $this
*/
public function cc(Address|array|string $address, $name = null)
{
$this->cc = array_merge($this->cc, $this->normalizeAddresses(
is_string($name) ? [new Address($address, $name)] : Arr::wrap($address),
));
return $this;
}
/**
* Add a "bcc" recipient to the message envelope.
*
* @param \Illuminate\Mail\Mailables\Address|array|string $address
* @param string|null $name
* @return $this
*/
public function bcc(Address|array|string $address, $name = null)
{
$this->bcc = array_merge($this->bcc, $this->normalizeAddresses(
is_string($name) ? [new Address($address, $name)] : Arr::wrap($address),
));
return $this;
}
/**
* Add a "reply to" recipient to the message envelope.
*
* @param \Illuminate\Mail\Mailables\Address|array|string $address
* @param string|null $name
* @return $this
*/
public function replyTo(Address|array|string $address, $name = null)
{
$this->replyTo = array_merge($this->replyTo, $this->normalizeAddresses(
is_string($name) ? [new Address($address, $name)] : Arr::wrap($address),
));
return $this;
}
/**
* Set the subject of the message.
*
* @param string $subject
* @return $this
*/
public function subject(string $subject)
{
$this->subject = $subject;
return $this;
}
/**
* Add "tags" to the message.
*
* @param array $tags
* @return $this
*/
public function tags(array $tags)
{
$this->tags = array_merge($this->tags, $tags);
return $this;
}
/**
* Add a "tag" to the message.
*
* @param string $tag
* @return $this
*/
public function tag(string $tag)
{
$this->tags[] = $tag;
return $this;
}
/**
* Add metadata to the message.
*
* @param string $key
* @param string|int $value
* @return $this
*/
public function metadata(string $key, string|int $value)
{
$this->metadata[$key] = $value;
return $this;
}
/**
* Add a Symfony Message customization callback to the message.
*
* @param \Closure $callback
* @return $this
*/
public function using(Closure $callback)
{
$this->using[] = $callback;
return $this;
}
/**
* Determine if the message is from the given address.
*
* @param string $address
* @param string|null $name
* @return bool
*/
public function isFrom(string $address, string $name = null)
{
if (is_null($name)) {
return $this->from->address === $address;
}
return $this->from->address === $address &&
$this->from->name === $name;
}
/**
* Determine if the message has the given address as a recipient.
*
* @param string $address
* @param string|null $name
* @return bool
*/
public function hasTo(string $address, string $name = null)
{
return $this->hasRecipient($this->to, $address, $name);
}
/**
* Determine if the message has the given address as a "cc" recipient.
*
* @param string $address
* @param string|null $name
* @return bool
*/
public function hasCc(string $address, string $name = null)
{
return $this->hasRecipient($this->cc, $address, $name);
}
/**
* Determine if the message has the given address as a "bcc" recipient.
*
* @param string $address
* @param string|null $name
* @return bool
*/
public function hasBcc(string $address, string $name = null)
{
return $this->hasRecipient($this->bcc, $address, $name);
}
/**
* Determine if the message has the given address as a "reply to" recipient.
*
* @param string $address
* @param string|null $name
* @return bool
*/
public function hasReplyTo(string $address, string $name = null)
{
return $this->hasRecipient($this->replyTo, $address, $name);
}
/**
* Determine if the message has the given recipient.
*
* @param array $recipients
* @param string $address
* @param string|null $name
* @return bool
*/
protected function hasRecipient(array $recipients, string $address, ?string $name = null)
{
return collect($recipients)->contains(function ($recipient) use ($address, $name) {
if (is_null($name)) {
return $recipient->address === $address;
}
return $recipient->address === $address &&
$recipient->name === $name;
});
}
/**
* Determine if the message has the given subject.
*
* @param string $subject
* @return bool
*/
public function hasSubject(string $subject)
{
return $this->subject === $subject;
}
/**
* Determine if the message has the given metadata.
*
* @param string $key
* @param string $value
* @return bool
*/
public function hasMetadata(string $key, string $value)
{
return isset($this->metadata[$key]) && (string) $this->metadata[$key] === $value;
}
}