aws发送邮件只能发送不带附件的,可以直接调方法sendEmail,但是发送带附件的邮件,用sendRawEmail必须自己写MIME邮件格式的邮件,不像sendEmail那样方便
/**
* 发送带附件的邮件
* @param array $toEmailList 目标邮箱组
* @param string $sendContent 邮件正文
* @param string $appName 应用名
* @param string $sender 发送人
* @param string $attachment 附件文件内容
* @param string $attachmentName 附件文件名
* @param string $attachmentType 附件类型
* @return integer
* @throws \Exception
*/
public static function sendRawEmail($toEmailList, $sendContent, $appName, $sender, &$attachment = "", $attachmentName = "", $attachmentType = "Application/xlsx") {
$emailConfig = [
'key' => '替换自己的',
'secret' => '替换自己的',
'region' => 'us-east-1',
'sender' => '默认的发送人',
];
$fromEmail = $sender ?: $emailConfig["sender"];
preg_match('/<title>(.*)<\/title>/', $sendContent, $match);
$subject = $match[1];
$credentials = new Credentials($emailConfig['key'], $emailConfig['secret']);
$SesClient = new SesClient([
'version' => 'latest',
'region' => $emailConfig['region'],
'credentials' => $credentials,
]);
//build the message
if (is_array($toEmailList)) {
$toEmailStr = rtrim(implode(',', $toEmailList), ',');
} else {
$toEmailStr = $toEmailList;
}
$boundary = uniqid("_Part_" . time(), true); //random unique string
$msg =
"To: $toEmailStr\n" .
"From: $fromEmail\n" .
"Subject: $subject\n" .
"MIME-Version: 1.0\n" .
"Content-Type: multipart/alternative;\n" .
" boundary=\"$boundary\"\n" .
"Content-Transfer-Encoding: 8bit\n" .
"\n" .
"This is a multi-part message in MIME format.\n" .
"\n" .
"--$boundary\n" .
"Content-Type: text/plain; charset=utf-8\n" .
"\n" .
strip_tags($sendContent) . "\n" .
"\n" .
"\n" .
"--$boundary\n" .
"Content-Type: text/html; charset=utf-8\n" .
"\n" .
"$sendContent\n" .
"\n" .
"\n" .
"\n" .
"--$boundary";
//add attachments
if (!empty($attachment)) {
$msg .= "\n";
$msg .= "Content-Transfer-Encoding: base64;" . "\n";
$msg .= "Content-Type: $attachmentType; name=$attachmentName;" . "\n";
$msg .= "Content-Disposition: attachment; filename=$attachmentName;" . "\n";
$msg .= base64_encode($attachment);
$msg .= "\n";
$msg .= "--$boundary";
}
//close email
$msg .= "--" . "\n";
//now send the email out
try {
$result = $SesClient->sendRawEmail([
'RawMessage' => [
'Data' => $msg
]
]);
$messageId = $result['MessageId'];
} catch (AwsException $e) {
throw new UserException($e->getMessage());
}
return $messageId;
}