【问题标题】:aws: ses with attach filesaws:带有附加文件的 ses
【发布时间】:2018-07-20 10:22:22
【问题描述】:

我将 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);

我在 laravel 中查看了 AWS sdk,发现那里有 sendEmail 功能要求的数组,但没有附加文件的线索

'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(......

【问题讨论】:

    标签: php amazon-web-services laravel-4 amazon-ses


    【解决方案1】:

    我发现发送带附件的电子邮件的唯一方法(使用 SES SERVICE)是使用 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: \<77987_SOME_WEIRD_TOKEN_BUT_UNIQUE_SO_SOMETIMES_A_@domain.com_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);
    

    注意这一行:

    $message .= '内容处理:附件;文件名="file.png"';

    $message .= base64_encode($attachedFile);

    【讨论】:

    • 我收到此错误致命错误:在第 267 行的 /libraries/Simpleemailservice.php 中的非对象上调用成员函数 setParameter()
    【解决方案2】:

    在 AWS PHP 的 V3.x 中,base64_encode 不应用于整个消息,仅用于附件编码。所以在 V3.x 中,不要在下面对 $myMessage 进行 BASE64 编码:

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

    这是我使用 AWS PHP SDK V3.x 的 PHP 7 工作解决方案。 此解决方案将通过 AWS SES 发送带有一个附件的 HTML 电子邮件:

    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);
    
        }   
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 2019-12-07
      • 2014-05-27
      • 1970-01-01
      • 2017-11-23
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多