我正在尝试使用 Amazon 的 SES 设置我的 CF 服务器,但我想我做错了什么......
这是我到目前为止所做的
• 从我的 AWS 控制台创建凭证
• 在我的 CF 管理员中添加了必要的设置(服务器、端口、用户/通行证)
• 创建了一个测试脚本
• 没有出现任何类型的错误
• 没有收到电子邮件并且基于我的 AWS SES 控制台没有任何内容送出。
任何曾经在 CF 上使用过此服务的人都可以为我指出正确的方向,我将不胜感激。
我正在尝试使用 Amazon 的 SES 设置我的 CF 服务器,但我想我做错了什么......
这是我到目前为止所做的
• 从我的 AWS 控制台创建凭证
• 在我的 CF 管理员中添加了必要的设置(服务器、端口、用户/通行证)
• 创建了一个测试脚本
• 没有出现任何类型的错误
• 没有收到电子邮件并且基于我的 AWS SES 控制台没有任何内容送出。
任何曾经在 CF 上使用过此服务的人都可以为我指出正确的方向,我将不胜感激。
下面的代码不使用CFMail 标签。它允许使用 CFHTTP POST 将原始格式的电子邮件、日历邀请等发送到 AWS SES,而不受 CFMAIL 标签的限制。如果您想使用 CFMail TAG,请参阅 AWS 配置 SMTP 服务器的说明。
在实现以下代码之前获取以下内容:
NOTE: in the V4 Signing cfc -- CF16 returns the AMZDate as +0000
for zulu. Find AMZDate (2 places) change to LEFT(AMZDate, 15) & "Z" to force
the to end in Z -- 20200930T222905+0000 -> 0200930T222905Z.
下面的示例代码假定 attributes.mail 是从 CFLove 的示例代码中格式化的,并且您正在使用 Sv4Util.cfc 进行签名。
<!--- This is sample code for send to AWS SES as Raw Data Send post --->
<!--- Init Signing CFC --->
<cfset LocalVar.s4 = CreateObject('component', 'Sv4Util.cfc').init(
accessKeyId = attributes.AWSKey
, secretAccessKey = attributes.AWSSecretKey
, defaultRegionName = attributes.AWSRegion
, defaultServiceName = "ses"
)>
<!---
Refer to https://docs.aws.amazon.com/ses/latest/DeveloperGuide/using-ses-api-requests.html
AWS Post Example Requirements
- Action
- Destinations.members.?
- Source
- RawMessage.Data
--->
<cfset PL = {}>
<cfset PL['Action'] = "SendRawEmail">
<!--- List of Email Addresses --->
<cfset count = 1>
<cfloop list="#attributes.deliverto#" index="i">
<cfset PL["Destinations.members.#count#"] = i>
<cfset count = count + 1>
</cfloop>
<!--- From --->
<cfset PL["Source"] = trim(attributes.from)>
<!--- The RAW MESSAGE -- Must be encoded due to BASE64 ending with an = --->
<cfset PL["RawMessage.Data"] = URLEncodedFormat(ToBase64(trim(ArrayToList(attributes.mail,chr(10)))))>
<!--- Build URL format string for posting the above struct (PLS) --->
<cfset PLS = ''>
<cfloop list="#ListSort(structKeyList(PL), 'text', 'asc')#" index="i" >
<cfset PLS = ListAppend(PLS, i & "=" & PL[i], "&")>
</cfloop>
<!--- Sign Request --->
<cfset LocalVar.Signing = LocalVar.s4.generateSignatureData(
requestMethod = 'POST' <!--- UPPER CASE --->
, hostName = 'email.#attributes.AWSRegion#.amazonaws.com'
, requestURI = ''
, requestBody = PLS
, requestHeaders = {"content-type":"application/x-www-form-urlencoded"}
, requestParams = {}
)>
<!--- Do POST to AWS --->
<!--- Required in POST
- x-amz-content-sha256
- Authorization
- x-amz-date
- content-type
- body
--->
<cfhttp url="https://email.#attributes.AWSRegion#.amazonaws.com" method="post" result="result">
<cfhttpparam type="header" name="x-amz-content-sha256" value="#LocalVar.Signing.RequestPayLoad#" />
<cfhttpparam type="header" name="Authorization" value="#LocalVar.Signing.authorizationHeader#" />
<cfhttpparam type="header" name="x-amz-date" value="#LocalVar.Signing.AMZDate#" />
<cfhttpparam type="header" name="content-type" value="application/x-www-form-urlencoded" />
<cfhttpparam type="body" value="#PLS#" />
</cfhttp>