1

我正在尝试使用 Amazon 的 SES 设置我的 CF 服务器,但我想我做错了什么......

这是我到目前为止所做的

• 从我的 AWS 控制台创建凭证
• 在我的 CF 管理员中添加了必要的设置(服务器、端口、用户/通行证)
• 创建了一个测试脚本
• 没有出现任何类型的错误
• 没有收到电子邮件并且基于我的 AWS SES 控制台没有任何内容送出。

任何曾经在 CF 上使用过此服务的人都可以为我指出正确的方向,我将不胜感激。

4

1 回答 1

2

下面的代码不使用CFMail 标签。它允许使用 CFHTTP POST 将原始格式的电子邮件、日历邀请等发送到 AWS SES,而不受 CFMAIL 标签的限制。如果您想使用 CFMail TAG,请参阅 AWS 配置 SMTP 服务器的说明。

在实现以下代码之前获取以下内容:

  1. 请参阅 <cfLove/> 在 ColdFusion 中使用 Amazon SES API SendRawEmail 发送电子邮件以构建原始电子邮件消息

  2. 参考 Leigh Sv4Util.cfc 进行 AWS v4 签名

 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.
  1. 有关示例 SES 帖子,请参阅 AWS

下面的示例代码假定 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>
于 2020-09-30T09:31:04.810 回答