Edited at

PHPでAWS SESから(添付ファイル付き)メッセージ送信をしようとしたらハマった

More than 1 year has passed since last update.

まず、 この記事にめっちゃめちゃお世話になりました。。。。多謝でございます!

https://qiita.com/kitanoow/items/2a81d9c4571656a31a2f

その上で、自分がハマった点をメモ。


前提


  • CakePHPを利用して、To/BCC指定でファイル添付メールを送りたい

  • 「受取人名」「差出人名」を指定したい

  • 事情があり、 EmailTransport1は利用しない

  • sendRawEmail()を直接的に利用する


何にハマったの


  • SES APIのパラメータ Destination を指定するだけだとうまく行かなかった

  • APIパラメータとしてDestination と Destinations がそれぞれ別に存在し、使い方が違うことに気づいていなかった


Destination を指定するだけだとうまく行かなかった

RawMessage.Dataに、ヘッダー情報を含める必要がある。


  • subject

  • to

  • cc

  • bcc

など。

MIME-Typeなどを指定したのみで2、 宛先情報や差出人情報といった(SDK的には別の箇所からも指定される)内容の記述を忘れており、そのために期待通りの動作をしていなかった。

最終的には、

$content = $headersToString($email->getHeaders()) .

"\r\n\r\n" .
$encodedContent .
"\r\n\r\n\r\n";
$this->client->sendRawEmail([
'Source' => 'hogehoge<example@email.com>';
'RawMessage' => ['Data' => $content]
]);

みたいな感じになるイメージ。

DestinationとDestinations

これらは別物。

前者は、Amazon風に言えば "フォーマット済みの"パラメータ指定方法となるだろうか。後者は「生のアドレスリスト」となる。

image.png

(https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-email-2010-12-01.html#sendemail)

image.png

(https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-email-2010-12-01.html#sendrawemail)

すなわち、以下のsendの書き方は2つとも同じような働きとなる。

$headers = [

'To' => ["main-no-atesaki<{$toAddress1}>", "sub-no-atesaki<{$toAddress2}>"],
'Bcc' => [$bccAddress],
];
// いい感じに $encodedContentを組み立てる

$this->client->sendRawEmail([
'Source' => $from,
'Destinations' => [
$toAddress1,
$toAddress2,
$bccAddress,
],
'RawMessage' => ['Data' => $encodedContent]
]);
$this->client->sendRawEmail([
'Source' => $from,
'Destination' => [
'ToAddresses' => [$toAddress1, $toAddress2],
'BccAddresses' => [$bccAddress],
],
'RawMessage' => ['Data' => $encodedContent]
]);

ただ、

'Destinations' => [

'ToAddresses' => 'email@example.com',
]

みたいな書き方も許容らしい。

'Destinations' => [

'ToAddresses' => ['email@example.com'],
]

がだめで、コチラは


Found 1 error while validating the input provided for the SendRawEmail operation:[Destinations][ToAddresses] must be a string or an object that implements __toString(). Found array(1)


というエラーを吐き出された。

最初にこの書き方をしていてハマってしまい、パラメータ名が(それ自体は適格ということで)違っていることに気づかなかった・・・

みたいな話のメモでした!