使用 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>