156 lines
3.6 KiB
PHP
156 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace Illuminate\Mail;
|
|
|
|
use Closure;
|
|
use Illuminate\Container\Container;
|
|
use Illuminate\Contracts\Filesystem\Factory as FilesystemFactory;
|
|
use Illuminate\Support\Traits\Macroable;
|
|
|
|
class Attachment
|
|
{
|
|
use Macroable;
|
|
|
|
/**
|
|
* The attached file's filename.
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $as;
|
|
|
|
/**
|
|
* The attached file's mime type.
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $mime;
|
|
|
|
/**
|
|
* A callback that attaches the attachment to the mail message.
|
|
*
|
|
* @var \Closure
|
|
*/
|
|
protected $resolver;
|
|
|
|
/**
|
|
* Create a mail attachment.
|
|
*
|
|
* @param \Closure $resolver
|
|
* @return void
|
|
*/
|
|
private function __construct(Closure $resolver)
|
|
{
|
|
$this->resolver = $resolver;
|
|
}
|
|
|
|
/**
|
|
* Create a mail attachment from a path.
|
|
*
|
|
* @param string $path
|
|
* @return static
|
|
*/
|
|
public static function fromPath($path)
|
|
{
|
|
return new static(fn ($attachment, $pathStrategy) => $pathStrategy($path, $attachment));
|
|
}
|
|
|
|
/**
|
|
* Create a mail attachment from in-memory data.
|
|
*
|
|
* @param \Closure $data
|
|
* @param string $name
|
|
* @return static
|
|
*/
|
|
public static function fromData(Closure $data, $name)
|
|
{
|
|
return (new static(
|
|
fn ($attachment, $pathStrategy, $dataStrategy) => $dataStrategy($data, $attachment)
|
|
))->as($name);
|
|
}
|
|
|
|
/**
|
|
* Create a mail attachment from a file in the default storage disk.
|
|
*
|
|
* @param string $path
|
|
* @return static
|
|
*/
|
|
public static function fromStorage($path)
|
|
{
|
|
return static::fromStorageDisk(null, $path);
|
|
}
|
|
|
|
/**
|
|
* Create a mail attachment from a file in the specified storage disk.
|
|
*
|
|
* @param string|null $disk
|
|
* @param string $path
|
|
* @return static
|
|
*/
|
|
public static function fromStorageDisk($disk, $path)
|
|
{
|
|
return new static(function ($attachment, $pathStrategy, $dataStrategy) use ($disk, $path) {
|
|
$storage = Container::getInstance()->make(
|
|
FilesystemFactory::class
|
|
)->disk($disk);
|
|
|
|
$attachment
|
|
->as($attachment->as ?? basename($path))
|
|
->withMime($attachment->mime ?? $storage->mimeType($path));
|
|
|
|
return $dataStrategy(fn () => $storage->get($path), $attachment);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Set the attached file's filename.
|
|
*
|
|
* @param string $name
|
|
* @return $this
|
|
*/
|
|
public function as($name)
|
|
{
|
|
$this->as = $name;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the attached file's mime type.
|
|
*
|
|
* @param string $mime
|
|
* @return $this
|
|
*/
|
|
public function withMime($mime)
|
|
{
|
|
$this->mime = $mime;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Attach the attachment with the given strategies.
|
|
*
|
|
* @param \Closure $pathStrategy
|
|
* @param \Closure $dataStrategy
|
|
* @return mixed
|
|
*/
|
|
public function attachWith(Closure $pathStrategy, Closure $dataStrategy)
|
|
{
|
|
return ($this->resolver)($this, $pathStrategy, $dataStrategy);
|
|
}
|
|
|
|
/**
|
|
* Attach the attachment to a built-in mail type.
|
|
*
|
|
* @param \Illuminate\Mail\Mailable|\Illuminate\Mail\Message|\Illuminate\Notifications\Messages\MailMessage $mail
|
|
* @return mixed
|
|
*/
|
|
public function attachTo($mail)
|
|
{
|
|
return $this->attachWith(
|
|
fn ($path) => $mail->attach($path, ['as' => $this->as, 'mime' => $this->mime]),
|
|
fn ($data) => $mail->attachData($data(), $this->as, ['mime' => $this->mime])
|
|
);
|
|
}
|
|
}
|