aws: ses с прикрепленными файлами


Я использую платформу Laravel 4 с AWS sdk для SES. Я могу отправлять обычные электронные письма с помощью функции SendEmail. Я хочу иметь возможность прикреплять файлы к электронным письмам, проблема в том, что я не могу найти, как это сделать.

Возможно ли вообще использовать функцию SendEmail для прикрепления файлов или я должен использовать функцию send_raw_email? (как это сделать?)

Вот как я использую SES:

$msg['Source'] = Config::get('mail.mailSource');
$msg['Destination']['ToAddresses'][] = $_GET['email'];
$msg['Message']['Subject']['Data']      = "bla bla";
$msg['Message']['Body']['Text']['Data'] = 'bla bla';
$msg['Message']['Body']['Html']['Data'] = 'bla bla';

$ses = AWS::get('ses');
$ses->sendEmail($msg);

Я посмотрел AWS sdk в laravel и нашел там массив с требованиями к функции отправки почты, но нет никаких подсказок для прикрепления файлов

'SendEmail' => array(
        'httpMethod' => 'POST',
        'uri' => '/',
        'class' => 'Aws\\Common\\Command\\QueryCommand',
        'responseClass' => 'SendEmailResponse',
        'responseType' => 'model',
        'parameters' => array(
            'Action' => array(
                'static' => true,
                'location' => 'aws.query',
                'default' => 'SendEmail',
            ),
            'Version' => array(......
Author: Gerald Schneider, 2014-05-23

2 answers

Единственный способ, который я нашел для отправки электронных писем с вложениями (с помощью СЛУЖБЫ SES), - это использовать метод SendRawEmail.

  $message = "To: ". $_GET['email'] ."\n";
            $message .= "From: ". $msg['Source'] ."\n";
            $message .= "Subject: Example SES mail (raw)\n";
            $message .= "MIME-Version: 1.0\n";
            $message .= 'Content-Type: multipart/mixed; boundary="aRandomString_with_signs_or_9879497q8w7r8number"';
            $message .= "\n\n";
            $message .= "--aRandomString_with_signs_or_9879497q8w7r8number\n";
            $message .= 'Content-Type: text/plain; charset="utf-8"';
            $message .= "\n";
            $message .= "Content-Transfer-Encoding: 7bit\n";
            $message .= "Content-Disposition: inline\n";
            $message .= "\n";
            $message .= "Dear new tester,\n\n";
            $message .= "Attached is the file you requested.\n";
            $message .= "\n\n";
            $message .= "--aRandomString_with_signs_or_9879497q8w7r8number\n";
            $message .= "Content-ID: \<[email protected]_IS_ADDED\>\n";
            $message .= 'Content-Type: application/zip; name="shell.zip"';
            $message .= "\n";
            $message .= "Content-Transfer-Encoding: base64\n";
            $message .= 'Content-Disposition: attachment; filename="file.png"';
            $message .= "\n";
            $message .= base64_encode( $attachedFile );
            $message .= "\n";
            $message .= "--aRandomString_with_signs_or_9879497q8w7r8number--\n";

            $sendMsg['RawMessage']['Data']         = (string)base64_encode($message);
            $sendMsg['RawMessage']['Source']       = $msg['Source'];
            $sendMsg['RawMessage']['Destinations'] = $_GET['email'];

            $ses->SendRawEmail($sendMsg);

Обратите внимание на эти строки:

$ сообщение.= 'Расположение содержимого: вложение; имя файла= "файл.png"';

$ сообщение.=base64_encode($вложенный файл );

 3
Author: Dennis, 2014-06-30 10:06:07

В версии 3.x PHP AWS код base64_encode не должен использоваться для всего сообщения, только для кодировки вложения. Поэтому в версии 3.x не кодируйте в BASE64 $MyMessage ниже:

    $myArraySES = [
        'Source'       => $myFromAdress,
        'Destinations' => $myArrayToAdresses,
        'RawMessage'   => [
            'Data' => $myMessage
        ]
    ];  

Вот мое рабочее решение для PHP 7 с версией V3.x AWS PHP SDK. Это решение отправит электронное письмо в формате HTML с одним вложением через AWS SES:

use Aws\Ses\SesClient;

$gAWS_SES_client = SesClient::factory(array(
    'version'=> 'latest',
    'region' => 'eu-west-1',
    'credentials' => array(
        'key' => 'my_secret_key',
        'secret'  => 'my_secret_pw'
  ) 
));

function sendRAWEmailViaSES($myArrayToAdresses, $myFromAdress, $mySubject, $myHTMLBody, $myFilePath){
    global $gAWS_SES_client;

    echo "\n<BR>Now in sendRAWEmailViaSES()<BR>\n";

    $myStringToAddresses = implode(",", $myArrayToAdresses);

    $myFileName = basename($myFilePath);;

    $myDataAttachedFile = file_get_contents($myFilePath);
    $myDataAttachedFile = chunk_split(base64_encode($myDataAttachedFile));  

    $myFileMimeInfo = finfo_open(FILEINFO_MIME_TYPE);
    $myFileMimeType = finfo_file($myFileMimeInfo, $myFilePath);     

    $mySeparator = md5(time());
    $mySeparator_multipart = md5($mySubject . time());      

    $myMessage = "";

    $myMessage .= "MIME-Version: 1.0\n";

    $myMessage .= "To: ".$myStringToAddresses."\n"; 
    $myMessage .= "From:".$myFromAdress."\n";   
    $myMessage .= "Subject:".$mySubject."\n";

    $myMessage .= "Content-Type: multipart/mixed; boundary=\"".$mySeparator_multipart."\"\n";
    $myMessage .= "\n--".$mySeparator_multipart."\n";

    $myMessage .= "Content-Type: multipart/alternative; boundary=\"".$mySeparator."\"\n";
    $myMessage .= "\n--".$mySeparator."\n";

    $myMessage .= "Content-Type: text/html; charset=\"UTF-8\"\n";
    $myMessage .= "\n".$myHTMLBody."\n";
    $myMessage .= "\n--".$mySeparator."--\n";

    $myMessage .= "--".$mySeparator_multipart."\n";
    $myMessage .= "Content-Type: ".$myFileMimeType."; name=\"".$myFileName."\"\n";
    $myMessage .= "Content-Disposition: attachment; filename=\"".$myFileName."\"\n";
    $myMessage .= "Content-Transfer-Encoding: base64\n\n";
    $myMessage .= $myDataAttachedFile."\n";
    $myMessage .= "--".$mySeparator_multipart."--";

    //echo "\n<BR>Message:<BR>\n";
    //print_r($myMessage);
    //echo "<BR>\n";        


    $myArraySES = [
        'Source'       => $myFromAdress,
        'Destinations' => $myArrayToAdresses,
        'RawMessage'   => [
            'Data' => $myMessage
        ]
    ];  

    echo "\n<HR>Trying to send mail via AWS SES <BR>\n";


    try{
        $myResult = true;
        $myAPIResult = $gAWS_SES_client->sendRawEmail($myArraySES);

        //save the MessageId which can be used to track the request
        //$myMessageArrayID = $myAPIResult->get('MessageId');
        //echo("MessageId: $msg_id");

        //view sample output
        echo "\n<BR>SES Result:<BR>\n";
        print_r($myAPIResult);
        echo "<BR>\n";

    } catch (Exception $myObjError) {
        //An error happened and the email did not get sent
        $myErrorInfo = $myObjError->getMessage();

        echo "\n<BR>*** SES ERROR:<BR>\n";
        print_r($myErrorInfo);
        echo "<BR>\n";      

        $myfile = fopen("ses_send_error.txt", "w");
        fwrite($myfile, $myErrorInfo);
        fclose($myfile);

    }   


}
 0
Author: ladhani, 2018-07-20 02:22:22