如何通过PowerShell发送带附件的AWS SES RawEmail?
通过AWS SES发送带CSV附件的RawEmail(PowerShell)
问题分析
你直接将CSV文件路径传给Send-SES2Email的-Raw_Data参数,导致收到空邮件。原因是-Raw_Data要求传入完整的MIME格式邮件内容,而非单独的文件路径或原始文件内容。CSV本身不是合法的MIME邮件结构,SES无法解析为带附件的邮件,因此显示为空。
解决步骤
要发送带附件的邮件,必须手动构建包含邮件头、正文、附件的MIME多部分邮件,再将其传入-Raw_Data。
1. 读取并编码CSV文件
先把CSV文件内容转为Base64编码(符合MIME附件的传输要求):
$csvFilePath = ".\Inventory.csv" # 读取文件字节并转为带换行的Base64字符串 $csvBytes = [System.IO.File]::ReadAllBytes($csvFilePath) $csvBase64 = [System.Convert]::ToBase64String($csvBytes, [System.Base64FormattingOptions]::InsertLineBreaks)
2. 生成唯一MIME边界符
边界符用于分隔邮件的正文和附件部分,必须唯一:
$mimeBoundary = "----=`$([System.Guid]::NewGuid().ToString())"
3. 构建完整MIME邮件内容
按照MIME标准拼接邮件头、正文和附件:
$mimeEmail = @" From: jsmith@schwarma.com To: jsmith@schwarma.com Subject: 库存清单附件 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="$mimeBoundary" --$mimeBoundary Content-Type: text/plain; charset="UTF-8" 这是库存清单的CSV附件,请查收。 --$mimeBoundary Content-Type: text/csv; name="Inventory.csv" Content-Disposition: attachment; filename="Inventory.csv" Content-Transfer-Encoding: base64 $csvBase64 --$mimeBoundary-- "@
4. 发送MIME格式邮件
将MIME内容转为字节数组后传入Send-SES2Email:
$rawEmailBytes = [System.Text.Encoding]::UTF8.GetBytes($mimeEmail) Send-SES2Email -FromEmailAddress jsmith@schwarma.com -Destination_ToAddress jsmith@schwarma.com -Raw_Data $rawEmailBytes
关键注意事项
- 如果
Send-SES2Email的-Raw_Data仅支持文件路径,可先将$mimeEmail写入临时文件,再传入临时文件路径。 - 边界符不能出现在邮件正文或附件内容中,用GUID生成可避免冲突。
- 附件的
Content-Type需匹配文件类型(CSV对应text/csv),Content-Disposition明确标记为附件并指定文件名。 - 用Base64编码附件内容,防止特殊字符或二进制数据导致邮件解析异常。
内容的提问来源于stack exchange,提问作者TheNateTrain
相关产品推荐
相关产品推荐

