jeudi 29 janvier 2015

how to send attachments in emails using AWS SES

I'm trying to send an email programmatically using amazon's SES library using the code from here. After tweaking I have the following pieces of code.


SESUtils.php



<?php

require_once('aws.phar');

use Aws\Ses\SesClient;

/**
* SESUtils is a tool to make it easier to work with Amazon Simple Email Service
* Features:
* A client to prepare emails for use with sending attachments or not
*
* There is no warranty - use this code at your own risk.
* @author sbossen
* http://ift.tt/1uFRinE
*
* Update: Error checking and new params input array provided by Michael Deal
*/
class SESUtils {

const version = "1.0";
const AWS_KEY = SES_KEY;
const AWS_SEC = SES_SECRET;
const AWS_REGION = "us-east-1";
const MAX_ATTACHMENT_NAME_LEN = 60;

/**
* Usage:
$params = array(
"to" => "email1@gmail.com",
"subject" => "Some subject",
"message" => "<strong>Some email body</strong>",
"from" => "sender@verifiedbyaws",
//OPTIONAL
"replyTo" => "reply_to@gmail.com",
//OPTIONAL
"files" => array(
1 => array(
"name" => "filename1",
"filepath" => "/path/to/file1.txt",
"mime" => "application/octet-stream"
),
2 => array(
"name" => "filename2",
"filepath" => "/path/to/file2.txt",
"mime" => "application/octet-stream"
),
)
);

$res = SESUtils::sendMail($params);

* NOTE: When sending a single file, omit the key (ie. the '1 =>')
* or use 0 => array(...) - otherwise the file will come out garbled
*
* use $res->success to check if it was successful
* use $res->message_id to check later with Amazon for further processing
* use $res->result_text to look for error text if the task was not successful
*
* @param array $params - array of parameters for the email
* @return \ResultHelper
*/
public static function sendMail($params) {

$to = self::getParam($params, 'to', true);
$subject = self::getParam($params, 'subject', true);
$body = self::getParam($params, 'message', true);
$from = self::getParam($params, 'from', true);
$replyTo = self::getParam($params, 'replyTo');
$files = self::getParam($params, 'files');

$res = 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\n";
$msg .= "From: $from\n";

if ($replyTo) {
$msg .= "Reply-To: $replyTo\n";
}

// in case you have funny characters in the subject
$subject = mb_encode_mimeheader($subject, 'UTF-8');
$msg .= "Subject: $subject\n";
$msg .= "MIME-Version: 1.0\n";
$msg .= "Content-Type: multipart/alternative;\n";
$boundary = uniqid("_Part_".time(), true); //random unique string
$msg .= " boundary=\"$boundary\"\n";
$msg .= "\n";

// now the actual message
$msg .= "--$boundary\n";

// first, the plain text
$msg .= "Content-Type: text/plain; charset=utf-8\n";
$msg .= "Content-Transfer-Encoding: 7bit\n";
$msg .= "\n";
$msg .= strip_tags($body);
$msg .= "\n";

// now, the html text
$msg .= "--$boundary\n";
$msg .= "Content-Type: text/html; charset=utf-8\n";
$msg .= "Content-Transfer-Encoding: 7bit\n";
$msg .= "\n";
$msg .= $body;
$msg .= "\n";

// add attachments
if (is_array($files)) {
$count = count($files);
foreach ($files as $idx => $file) {
if ($idx !== 0)
$msg .= "\n";
$msg .= "--$boundary\n";
$msg .= "Content-Transfer-Encoding: base64\n";
$clean_filename = mb_substr($file["name"], 0, self::MAX_ATTACHMENT_NAME_LEN);
$msg .= "Content-Type: {$file['mime']}; name=$clean_filename;\n";
$msg .= "Content-Disposition: attachment; filename=$clean_filename;\n";
$msg .= "\n";
$msg .= base64_encode(file_get_contents($file['filepath']));
if (($idx + 1) === $count)
$msg .= "==\n";
$msg .= "--$boundary";
}
// close email
$msg .= "--\n";
}

// now send the email out
try {
file_put_contents("log.txt", $msg);
$ses_result = $client->sendRawEmail(
array(
'RawMessage' => array(
'Data' => base64_encode($msg)
)
), array(
'Source' => $from,
'Destinations' => $to_str
)
);
if ($ses_result) {
$res->message_id = $ses_result->get('MessageId');
} else {
$res->success = false;
$res->result_text = "Amazon SES did not return a MessageId";
}
} catch (Exception $e) {
$res->success = false;
$res->result_text = $e->getMessage().
" - To: $to_str, Sender: $from, Subject: $subject";
}
return $res;
}

private static function getParam($params, $param, $required = false) {
$value = isset($params[$param]) ? $params[$param] : null;
if ($required && empty($value)) {
throw new Exception('"'.$param.'" parameter is required.');
} else {
return $value;
}
}

}

class ResultHelper {

public $success = true;
public $result_text = "";
public $message_id = "";

}

?>


And the function I'm using to send the actual email



function sendAttachmentEmail($from, $to, $subject, $message, $attachmentPaths=array()){
client = SesClient::factor(array('key' => SES_KEY, 'secret' => SES_SECRET, 'region' => 'us-east-1'));
$attachments = array();
foreach($attachmentPaths as $path){
$fileName = explode("/",, $path);
$fileName = $fileName[count($fileName)-1];
$extension = explode(".", $fileName);
$extension = strtoupper($extension[count($extension)-1]);
$mimeType = "";
if($extension == 'PDF') $mimeType = 'application/pdf';
elseif($extension == 'CSV') $mimeType = 'test/csv';
elseif($extension == 'XLS') $mimeType = 'application/vnd.ms-excel';
array_push($attachments, array("name" => $fileName, "filepath" => $path, "mime" => $mimeType));
}
$params = array(
"from" => $from,
"to" => $to,
"subject" => $subject,
"message" => $message,
"replyTo" => $from,
"files" => $attachments
);
$res = SESUtils::sendMail($params);
return $res;
}

sendAttachmentEmail("jesse@aol.com", "jesse@aol.com", 'test', 'test', array("/path/to/file.pdf"));


When I run this the message returned is an error saying "Expected ';', got "Reports" - To: jesse@aol.com, Sender: jesse@aol.com, Subject: test". Anyone know what I might be missing? The contents of the msg being sent is



To: jesse@aol.com
From: jesse@aol.com
Reply-To: jesse@aol.com
Subject: test
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="_Part_142255491754ca7725b0bf89.40746157"

--_Part_142255491754ca7725b0bf89.40746157
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

test
--_Part_142255491754ca7725b0bf89.40746157
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 7bit

test
--_Part_142255491754ca7725b0bf89.40746157
Content-Transfer-Encoding: base64
Content-Type: application/pdf; name=file.pdf;
Content-Disposition: attachment; filename=file.pdf;




Aucun commentaire:

Enregistrer un commentaire