Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Mail/Transport/SesTransport.php
Строк: 192
<?php

namespace IlluminateMailTransport;

use 
AwsExceptionAwsException;
use 
AwsSesSesClient;
use 
IlluminateSupportCollection;
use 
Stringable;
use 
SymfonyComponentMailerExceptionTransportException;
use 
SymfonyComponentMailerHeaderMetadataHeader;
use 
SymfonyComponentMailerSentMessage;
use 
SymfonyComponentMailerTransportAbstractTransport;
use 
SymfonyComponentMimeMessage;

class 
SesTransport extends AbstractTransport implements Stringable
{
    
/**
     * The Amazon SES instance.
     *
     * @var AwsSesSesClient
     */
    
protected $ses;

    
/**
     * The Amazon SES transmission options.
     *
     * @var array
     */
    
protected $options = [];

    
/**
     * Create a new SES transport instance.
     *
     * @param  AwsSesSesClient  $ses
     * @param  array  $options
     */
    
public function __construct(SesClient $ses$options = [])
    {
        
$this->ses $ses;
        
$this->options $options;

        
parent::__construct();
    }

    
/**
     * {@inheritDoc}
     *
     * @throws SymfonyComponentMailerExceptionTransportException
     */
    
protected function doSend(SentMessage $message): void
    
{
        
$options $this->options;

        if (
$message->getOriginalMessage() instanceof Message) {
            if (
$listManagementOptions $this->listManagementOptions($message)) {
                
$options['ListManagementOptions'] = $listManagementOptions;
            }

            foreach (
$message->getOriginalMessage()->getHeaders()->all() as $header) {
                if (
$header instanceof MetadataHeader) {
                    
$options['Tags'][] = ['Name' => $header->getKey(), 'Value' => $header->getValue()];
                }
            }
        }

        try {
            
$result $this->ses->sendRawEmail(
                
array_merge(
                    
$options, [
                        
'Source' => $message->getEnvelope()->getSender()->toString(),
                        
'Destinations' => (new Collection($message->getEnvelope()->getRecipients()))
                            ->
map
                            
->toString()
                            ->
values()
                            ->
all(),
                        
'RawMessage' => [
                            
'Data' => $message->toString(),
                        ],
                    ]
                )
            );
        } catch (
AwsException $e) {
            
$reason $e->getAwsErrorMessage() ?? $e->getMessage();

            throw new 
TransportException(
                
sprintf('Request to AWS SES API failed. Reason: %s.'$reason),
                
is_int($e->getCode()) ? $e->getCode() : 0,
                
$e
            
);
        }

        
$messageId $result->get('MessageId');

        
$message->getOriginalMessage()->getHeaders()->addHeader('X-Message-ID'$messageId);
        
$message->getOriginalMessage()->getHeaders()->addHeader('X-SES-Message-ID'$messageId);
    }

    
/**
     * Extract the SES list management options, if applicable.
     *
     * @param  SymfonyComponentMailerSentMessage  $message
     * @return array|null
     */
    
protected function listManagementOptions(SentMessage $message)
    {
        if (
$header $message->getOriginalMessage()->getHeaders()->get('X-SES-LIST-MANAGEMENT-OPTIONS')) {
            if (
preg_match("/^(contactListName=)*(?<ContactListName>[^;]+)(;s?topicName=(?<TopicName>.+))?$/ix"$header->getBodyAsString(), $listManagementOptions)) {
                return 
array_filter($listManagementOptionsfn ($e) => in_array($e, ['ContactListName''TopicName']), ARRAY_FILTER_USE_KEY);
            }
        }
    }

    
/**
     * Get the Amazon SES client for the SesTransport instance.
     *
     * @return AwsSesSesClient
     */
    
public function ses()
    {
        return 
$this->ses;
    }

    
/**
     * Get the transmission options being used by the transport.
     *
     * @return array
     */
    
public function getOptions()
    {
        return 
$this->options;
    }

    
/**
     * Set the transmission options being used by the transport.
     *
     * @param  array  $options
     * @return array
     */
    
public function setOptions(array $options)
    {
        return 
$this->options $options;
    }

    
/**
     * Get the string representation of the transport.
     *
     * @return string
     */
    
public function __toString(): string
    
{
        return 
'ses';
    }
}
Онлайн: 0
Реклама