

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 SES 中处理电子邮件附件
<a name="attachments"></a>

SES 中的电子邮件附件是您在使用 SES API v2 `SendEmail` 和 `SendBulkEmail` 操作时可以随电子邮件消息一起包含的文件。此功能使您能够通过包含文档（如 PDF、Word 文件、图像或其他符合 SES 支持的 MIME 类型的文件类型）来丰富电子邮件内容。您还可以包含内联图像，这些图像直接在电子邮件内容中呈现，无需收件人单独下载。每封电子邮件可以包含多个附件，总消息大小限制为 40MB。

**注意**  
具有 `Raw` 内容类型的 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html) SES API v2、SMTP 接口和 SES API v1 继续通过[原始电子邮件 MIME 消息构建](send-email-raw.md#send-email-raw-mime)处理附件。

## 附件在 SES 中的工作原理
<a name="how-attachments-work"></a>

在发送带有附件的电子邮件时，在不同的阶段会发生两种不同的编码：

第 1 阶段：向 SES 发送数据：
+ 当您想要向 SES 发送附件时，二进制数据（如 PDF 或图像）需要转换为可以安全传输的格式。
+ 这就是 base64 编码的用武之地——它是必需的，因为您不能在 JSON 请求中发送原始二进制数据。
+ 如果你使用的是 AWS SDK，它会自动处理这种编码。
+ 如果您使用的是 AWS CLI，则需要在发送附件之前自己对其进行 base64 编码。

第 2 阶段：SES 创建电子邮件：
+ SES 收到您的数据后，需要创建一封带有附件的实际电子邮件。
+ 这就是[ContentTransferEncoding](#attachment-structure)设置的用武之地。
+ SES 将使用您指定的任何编码 ContentTransferEncoding 方法自动格式化最后一封电子邮件中的附件。

可以这样理解——这类似于通过邮件发送包裹。首先，您需要将包裹送到邮局（第 1 阶段—— Base64-encoding 必填），然后邮局会对其进行适当的包装以进行最终交付（第 2 阶段- ContentTransferEncoding）。

## 附件对象结构
<a name="attachment-structure"></a>

当您通过 SES 发送带附件的电子邮件时，该服务会自动处理复杂的 MIME 消息构建。您只需通过以下 SES API v2 [https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Attachment.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_Attachment.html) 对象结构提供附件内容和元数据：
+ `FileName`（必填）：向收件人显示的文件名（必须包含文件扩展名）。如果未提供，SES 将从 `ContentType` 的扩展名中派生一个 `FileName`。
+ `ContentType`（可选）-[IANA-compliant 媒体类型标识符](https://www.iana.org/assignments/media-types/media-types.xhtml)。
+ `ContentDisposition`（可选）：指定应如何呈现附件：`ATTACHMENT`*（默认）*或 `INLINE`。
+ `ContentDescription`（可选）：内容的简短描述。
+ `RawContent`（必填）：附件的实际内容。
+ `ContentTransferEncoding`（可选）：指定在将附件有效载荷组装到电子邮件的 mime 消息中时如何编码：`SEVEN_BIT`*（默认）*、`BASE64` 或 `QUOTED_PRINTABLE`。

所有附加内容在传输到 SES 端点进行发送之前必须编码为 base64。如果您使用 AWS SDK 客户端进行 API 调用，则会自动为您处理。如果你使用的是客户端 AWS CLI，或者已经实现了自己的客户端，则必须自己进行编码，例如：
+ 纯文本内容：`Text attachment sample content.`
+ Base64 编码：`VGV4dCBhdHRhY2htZW50IHNhbXBsZSBjb250ZW50Lg==`

以下示例说明了在使用 SES API v2 指定附件时如何使用附件对象结构，[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendEmail.html)以及如何使用 AWS CLI 引用包含附件对象元素的 JSON 文件进行[https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html](https://docs.aws.amazon.com/ses/latest/APIReference-V2/API_SendBulkEmail.html)操作。

**Example — SendEmail 内容简单**  

```
aws sesv2 send-email --cli-input-json file://request-send-email-simple.json
```
**request-send-email-simple.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "Destination": {
        "ToAddresses": [
            "recipient@example.com"
        ]
    },
    "Content": {
        "Simple": {
            "Subject": {
                "Data": "Email with attachment"
            },
            "Body": {
                "Text": {
                    "Data": "Please see attached document."
                },
                "Html": {
                    "Data": "Please see attached <b>document</b>."
                }
            },
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "ATTACHMENT",
                    "FileName": "document.pdf",
                    "ContentDescription": "PDF Document Attachment",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    }
}
```

**Example — SendEmail 带有简单内容和内联附件**  

```
aws sesv2 send-email --cli-input-json file://request-send-email-simple-inline-attachment.json
```
**request-send-email-simple-inline-attachment.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "Destination": {
        "ToAddresses": [
            "recipient@example.com"
        ]
    },
    "Content": {
        "Simple": {
            "Subject": {
                "Data": "Email with attachment"
            },
            "Body": {
                "Html": {
                    "Data": "<html><body>Our logo:<br><img src=\"cid:logo123\" alt=\"Company Logo\"></body></html>"
                }
            },
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "INLINE",
                    "FileName": "logo.png",
                    "ContentId": "logo123",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    }
}
```

**Example — SendEmail 包含模板内容**  

```
aws sesv2 send-email --cli-input-json file://request-send-email-template.json
```
**request-send-email-template.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "Destination": {
        "ToAddresses": [
            "recipient@example.com"
        ]
    },
    "Content": {
        "Template": {
            "TemplateName": "MyTemplate",
            "TemplateData": "{\"name\":\"John\"}",
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "ATTACHMENT",
                    "FileName": "document.pdf",
                    "ContentDescription": "PDF Document Attachment",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    }
}
```

**Example — 附 SendBulkEmail 带附件内容**  

```
aws sesv2 send-bulk-email --cli-input-json file://request-send-bulk-email.json
```
**request-send-bulk-email.json**  

```
{
    "FromEmailAddress": "sender@example.com",
    "DefaultContent": {
        "Template": {
            "TemplateName": "MyTemplate",
            "TemplateData": "{}",
            "Attachments": [
                {
                    "RawContent": "<base64-encoded-content>",
                    "ContentDisposition": "ATTACHMENT",
                    "FileName": "document.pdf",
                    "ContentDescription": "PDF Document Attachment",
                    "ContentTransferEncoding": "BASE64"
                }
            ]
        }
    },
    "BulkEmailEntries": [
        {
            "Destination": {
                "ToAddresses": [
                    "recipient@example.com"
                ]
            },
            "ReplacementEmailContent": {
                "ReplacementTemplate": {
                    "ReplacementTemplateData": "{\"name\":\"John\"}"
                }
            }
        }
    ]
}
```

## 最佳实践
<a name="attachments-best-practices"></a>
+ 保持总消息大小（包括附件）在 40MB 以下。
+ 在可能的情况下，让 SES 根据文件扩展名自动检测内容类型。
+ 仅当内容类型超出[常见 MIME 类型](https://developer.mozilla.org/en-US/docs/Web/HTTP/MIME_types/Common_types)时才显式指定内容类型。
+ 考虑使用内联图像以获得更好的电子邮件渲染效果。
+ SES 支持广泛的附件 MIME 类型，除了 [不支持的附件类型](#mime-types) 中列出的那些。

## SES 不支持的附件类型
<a name="mime-types"></a>

您可以使用多用途 Internet 邮件扩展（MIME）标准，通过 Amazon SES 发送带附件的电子邮件。Amazon SES 接受所有文件附件类型，带有以下列表中的文件扩展名的附件*除外*。


|  |  |  |  |  | 
| --- |--- |--- |--- |--- |
| .ade<br />.adp<br />.app<br />.asp<br />.bas<br />.bat<br />.cer<br />.chm<br />.cmd<br />.com<br />.cpl<br />.crt<br />.csh<br />.der<br />.exe<br />.fxp<br />.gadget<br />.hlp | .hta<br />.inf<br />.ins<br />.isp<br />.its<br />.js<br />.jse<br />.ksh<br />.lib<br />.lnk<br />.mad<br />.maf<br />.mag<br />.mam<br />.maq<br />.mar<br />.mas<br />.mat | .mau<br />.mav<br />.maw<br />.mda<br />.mdb<br />.mde<br />.mdt<br />.mdw<br />.mdz<br />.msc<br />.msh<br />.msh1<br />.msh2<br />.mshxml<br />.msh1xml<br />.msh2xml<br />.msi<br />.msp | .mst<br />.ops<br />.pcd<br />.pif<br />.plg<br />.prf<br />.prg<br />.reg<br />.scf<br />.scr<br />.sct<br />.shb<br />.shs<br />.sys<br />.ps1<br />.ps1xml<br />.ps2<br />.ps2xml | .psc1<br />.psc2<br />.tmp<br />.url<br />.vb<br />.vbe<br />.vbs<br />.vps<br />.vsmacros<br />.vss<br />.vst<br />.vsw<br />.vxd<br />.ws<br />.wsc<br />.wsf<br />.wsh<br />.xnk | 

有些 ISP 有其他限制（如对于存档附件的限制），因此，我们建议您在发送生产电子邮件之前，先通过主要 ISP 测试电子邮件发送。