使用 Coldfusion 处理来自 Mailgun 的传入邮件
Processing Incoming Mail from Mailgun with Coldfusion
我刚刚开始在我正在开发供内部使用的 Web 应用程序中使用 Mailgun 发送双向电子邮件。我设置了一条路由,用于将消息转发到我服务器上的 URL - 工作正常。
但是,我处理这些消息的代码抛出错误。 Malign 将数据作为 http post 发送,然后我可以使用表单变量引用它。最初我在某些字段(字段名称中带有连字符的字段)上收到 'not defined' 错误,但现在似乎已解决。代码现在在 CFQUERY 插入时遇到问题,错误说明我在 SQL 语法中有错误 - 但我看不出有什么问题!
这是我的页面代码,mailgun 将 post 发送至;
<cfset thebody = form["body-plain"]>
<cfset thesender = form["sender"]>
<cfset therecipient = form["sender"]>
<cfset thesubject = form["subject"]>
<cfquery name="addmail">
INSERT INTO mailmessages(from,sender,recipient,subject,body,msgdate)
VALUES('#thesender#','#thesender#','#therecipient#','#thesubject#','#thebody#',#CreateODBCDateTime(Now())#)
</cfquery>
错误消息指出;
Error Executing Database Query. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from,sender,recipient,subject,body,msgdate) VALUES('lee@mydomain.com','l' at line 1
可以在此处看到表单的 cfdump(这是通过 cfmail 在 cfcatch 语句中发送的 - 这是我能够看到任何错误的唯一方法);
如错误消息所示,插入查询中存在语法错误。
似乎您在传递的日期值周围缺少单引号 ('
)。应该这样写:
<cfquery name="addmail">
INSERT INTO mailmessages(from,sender,recipient,subject,body,msgdate)
VALUES('#thesender#','#thesender#','#therecipient#','#thesubject#','#thebody#','#CreateODBCDateTime(Now())#')
</cfquery>
要消除此类语法错误并防止 SQL 注入,请始终使用 cfqueryparams
,如下所示:
<cfquery name="addmail">
INSERT INTO mailmessages (from,sender,recipient,subject,body,msgdate)
VALUES (
<cfqueryparam value="#thesender#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#thesender#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#therecipient#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#thesubject#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#thebody#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#CreateODBCDateTime(Now())#" cfsqltype="CF_SQL_TIMESTAMP">
)
</cfquery>
您还可以根据您为列指定的数据库或数据类型使用 CF_SQL_DATE
而不是 CF_SQL_TIMESTAMP
。
我不能 select Jedihomer Townend 上面的评论作为答案,但他指出我的字段名包含保留字是正确的,这就是问题所在。改变那些修复它。
from 列名称是保留字,所以这就是 mySQL 所抱怨的。
如果您对列名称进行转义,应该可以解决这个问题。
与 cfqueryparam 一起,您的代码应该类似于:
<cfset thebody = form["body-plain"]>
<cfset thesender = form["sender"]>
<cfset therecipient = form["sender"]>
<cfset thesubject = form["subject"]>
<cfquery name="addmail">
INSERT INTO mailmessages (
"from",
sender,
recipient,
subject,
body,
msgdate
)
VALUES (
<cfqueryparam value="#thesender#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#thesender#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#therecipient#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#thesubject#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#thebody#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#CreateODBCDateTime(Now())#" cfsqltype="cf_sql_timestamp">
)
</cfquery>
我刚刚开始在我正在开发供内部使用的 Web 应用程序中使用 Mailgun 发送双向电子邮件。我设置了一条路由,用于将消息转发到我服务器上的 URL - 工作正常。
但是,我处理这些消息的代码抛出错误。 Malign 将数据作为 http post 发送,然后我可以使用表单变量引用它。最初我在某些字段(字段名称中带有连字符的字段)上收到 'not defined' 错误,但现在似乎已解决。代码现在在 CFQUERY 插入时遇到问题,错误说明我在 SQL 语法中有错误 - 但我看不出有什么问题!
这是我的页面代码,mailgun 将 post 发送至;
<cfset thebody = form["body-plain"]>
<cfset thesender = form["sender"]>
<cfset therecipient = form["sender"]>
<cfset thesubject = form["subject"]>
<cfquery name="addmail">
INSERT INTO mailmessages(from,sender,recipient,subject,body,msgdate)
VALUES('#thesender#','#thesender#','#therecipient#','#thesubject#','#thebody#',#CreateODBCDateTime(Now())#)
</cfquery>
错误消息指出;
Error Executing Database Query. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from,sender,recipient,subject,body,msgdate) VALUES('lee@mydomain.com','l' at line 1
可以在此处看到表单的 cfdump(这是通过 cfmail 在 cfcatch 语句中发送的 - 这是我能够看到任何错误的唯一方法);
如错误消息所示,插入查询中存在语法错误。
似乎您在传递的日期值周围缺少单引号 ('
)。应该这样写:
<cfquery name="addmail">
INSERT INTO mailmessages(from,sender,recipient,subject,body,msgdate)
VALUES('#thesender#','#thesender#','#therecipient#','#thesubject#','#thebody#','#CreateODBCDateTime(Now())#')
</cfquery>
要消除此类语法错误并防止 SQL 注入,请始终使用 cfqueryparams
,如下所示:
<cfquery name="addmail">
INSERT INTO mailmessages (from,sender,recipient,subject,body,msgdate)
VALUES (
<cfqueryparam value="#thesender#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#thesender#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#therecipient#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#thesubject#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#thebody#" cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value="#CreateODBCDateTime(Now())#" cfsqltype="CF_SQL_TIMESTAMP">
)
</cfquery>
您还可以根据您为列指定的数据库或数据类型使用 CF_SQL_DATE
而不是 CF_SQL_TIMESTAMP
。
我不能 select Jedihomer Townend 上面的评论作为答案,但他指出我的字段名包含保留字是正确的,这就是问题所在。改变那些修复它。
from 列名称是保留字,所以这就是 mySQL 所抱怨的。
如果您对列名称进行转义,应该可以解决这个问题。
与 cfqueryparam 一起,您的代码应该类似于:
<cfset thebody = form["body-plain"]>
<cfset thesender = form["sender"]>
<cfset therecipient = form["sender"]>
<cfset thesubject = form["subject"]>
<cfquery name="addmail">
INSERT INTO mailmessages (
"from",
sender,
recipient,
subject,
body,
msgdate
)
VALUES (
<cfqueryparam value="#thesender#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#thesender#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#therecipient#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#thesubject#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#thebody#" cfsqltype="cf_sql_varchar">,
<cfqueryparam value="#CreateODBCDateTime(Now())#" cfsqltype="cf_sql_timestamp">
)
</cfquery>