Sending email with attachment using amazon SES

前端 未结 4 801
星月不相逢
星月不相逢 2020-12-06 08:16

I am trying to send an email that contains an attachment (a pdf file) using the amazon SES API.

I am using Symfony2 so I included the AmazonWebServiceBundle in my pr

4条回答
  •  -上瘾入骨i
    2020-12-06 08:32

    Yes, it is a pain to send emails with attachments using SES. Maybe this will help someone else out who is still struggling with it. I've written a simple class that helps simplify the call to sendRawEmail.

    Usage:

    $subject_str = "Some Subject";
    $body_str = "Some email body";
    $attachment_str = file_get_contents("/htdocs/test/sample.pdf");
    
    //send the email
    $result = SESUtils::deliver_mail_with_attachment(
        array('email1@gmail.com', 'email2@lutz-engr.com'),       
        $subject_str, $body_str, 'sender@verifiedbyaws', 
        $attachment_str);
    
    //now handle the $result if you wish
    

    Class:

    success to check if it was successful
         * use $result->message_id to check later with Amazon for further processing
         * use $result->result_text to look for error text if the task was not successful
         * 
         * @param type $to - individual address or array of email addresses
         * @param type $subject - UTF-8 text for the subject line
         * @param type $body - Text for the email
         * @param type $from - email address of the sender (Note: must be validated with AWS as a sender)
         * @return \ResultHelper
         */
        public static function deliver_mail_with_attachment($to, $subject, $body, $from, &$attachment = "", $attachment_name = "doc.pdf", $attachment_type = "Application/pdf", $is_file = false, $encoding = "base64", $file_arr = null) {
            $result = new ResultHelper();
            //get the client ready
            $client = SesClient::factory(array(
                        'key' => self::AWS_KEY,
                        'secret' => self::AWS_SEC,
                        'region' => self::AWS_REGION
            ));
            //build the message
            if (is_array($to)) {
                $to_str = rtrim(implode(',', $to), ',');
            } else {
                $to_str = $to;
            }
            $msg = "To: $to_str".self::LINEBR;
            $msg .="From: $from".self::LINEBR;
            //in case you have funny characters in the subject
            $subject = mb_encode_mimeheader($subject, 'UTF-8');
            $msg .="Subject: $subject".self::LINEBR;
            $msg .="MIME-Version: 1.0".self::LINEBR;
            $msg .="Content-Type: multipart/alternative;".self::LINEBR;
            $boundary = uniqid("_Part_".time(), true); //random unique string
            $msg .=" boundary=\"$boundary\"".self::LINEBR;
            $msg .=self::LINEBR;
            //now the actual message
            $msg .="--$boundary".self::LINEBR;
            //first, the plain text
            $msg .="Content-Type: text/plain; charset=utf-8".self::LINEBR;
            $msg .="Content-Transfer-Encoding: 7bit".self::LINEBR;
            $msg .=self::LINEBR;
            $msg .=strip_tags($body);
            $msg .=self::LINEBR;
            //now, the html text
            $msg .="--$boundary".self::LINEBR;
            $msg .="Content-Type: text/html; charset=utf-8".self::LINEBR;
            $msg .="Content-Transfer-Encoding: 7bit".self::LINEBR;
            $msg .=self::LINEBR;
            $msg .=$body;
            $msg .=self::LINEBR;
            //add attachments
            if (!empty($attachment)) {
                $msg .="--$boundary".self::LINEBR;
                $msg .="Content-Transfer-Encoding: base64".self::LINEBR;
                $clean_filename = mb_substr($attachment_name, 0, self::MAX_ATTACHMENT_NAME_LEN);
                $msg .="Content-Type: $attachment_type; name=$clean_filename;".self::LINEBR;
                $msg .="Content-Disposition: attachment; filename=$clean_filename;".self::LINEBR;
                $msg .=self::LINEBR;
                $msg .=base64_encode($attachment);
                //only put this mark on the last entry
                if (!empty($file_arr))
                    $msg .="==".self::LINEBR;
                $msg .="--$boundary";
            }
            if (!empty($file_arr) && is_array($file_arr)) {
                foreach ($file_arr as $file) {
                    $msg .="Content-Transfer-Encoding: base64".self::LINEBR;
                    $clean_filename = mb_substr($attachment_name, 0, self::MAX_ATTACHMENT_NAME_LEN);
                    $msg .="Content-Type: application/octet-stream; name=$clean_filename;".self::LINEBR;
                    $msg .="Content-Disposition: attachment; filename=$clean_filename;".self::LINEBR;
                    $msg .=self::LINEBR;
                    $msg .=base64_encode($attachment);
                    //only put this mark on the last entry
                    if (!empty($file_arr))
                        $msg .="==".self::LINEBR;
                    $msg .="--$boundary";
                }
            }
            //close email
            $msg .="--".self::LINEBR;
    
            //now send the email out
            try {
                $ses_result = $client->sendRawEmail(array(
                    'RawMessage' => array('Data' => base64_encode($msg))), array('Source' => $from, 'Destinations' => $to_str));
                if ($ses_result) {
                    $result->message_id = $ses_result->get('MessageId');
                } else {
                    $result->success = false;
                    $result->result_text = "Amazon SES did not return a MessageId";
                }
            } catch (Exception $e) {
                $result->success = false;
                $result->result_text = $e->getMessage()." - To: $to_str, Sender: $from, Subject: $subject";
            }
            return $result;
        }
    
    }
    
    
    class ResultHelper {
    
        public $success = true;
        public $result_text = "";
        public $message_id = "";
    
    }
    
    ?>
    

    I've written a blog post that addresses this, maybe it will be useful to you or others: http://righthandedmonkey.com/2013/06/how-to-use-amazon-ses-to-send-email-php.html

提交回复
热议问题