【问题标题】:CDO message wont send when delivery receipt requested请求交货收据时不会发送 CDO 消息
【发布时间】:2011-04-17 00:40:59
【问题描述】:

我正在用经典的 ASP(是的,请原谅我)编写一个使用 Google Mail 发送电子邮件的应用程序。我让它像这样工作得很好:

Dim ObjSendMail
Set ObjSendMail = CreateObject("CDO.Message") 

ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = 1
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = SendUsername
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = SendPassword
ObjSendMail.Configuration.Fields.Update

ObjSendMail.To = "x@x.x"
ObjSendMail.From = "x@x.x"
ObjSendMail.Subject = "subject here..."
ObjSendMail.HTMLBody = "body here..."

'ObjSendMail.Fields("urn:schemas:mailheader:disposition-notification-to") = SendUsername
'ObjSendMail.Fields("urn:schemas:mailheader:return-receipt-to") = SendUsername
'ObjSendMail.Fields.Update
'ObjSendMail.DSNOptions = 14
ObjSendMail.Send
Set ObjSendMail = Nothing

当我取消注释以下行时:

'ObjSendMail.Fields("urn:schemas:mailheader:disposition-notification-to") = SendUsername
'ObjSendMail.Fields("urn:schemas:mailheader:return-receipt-to") = SendUsername
'ObjSendMail.Fields.Update
'ObjSendMail.DSNOptions = 14

电子邮件发送失败。没有错误,只是没有电子邮件,也没有交货收据。我一生都无法弄清楚如何使这项工作。 “SendUsername”是一个有效的电子邮件地址。任何帮助将不胜感激。

【问题讨论】:

    标签: asp-classic cdo.message


    【解决方案1】:

    我知道这已经有几年了,但我刚刚找到了一个解决方案,所以我将发布它以防其他人遇到这个问题。

    如果您使用的是第 3 方 SMTP 服务器,例如 gmail 甚至共享主机,并且您无权访问该服务器配置,那么您真的无能为力。邮件服务器根本不会中继任何设置了 DSNOptions 的电子邮件。这绝对是为了减少垃圾邮件和滥用行为。

    但是,如果您有权访问 WHM 或托管在可以为您更改设置的公司(或您运行自己的 SMTP 服务器),您可能可以设置要宣传 DSN 支持的主机。现在这个设置可能在不同的邮件服务器平台上不可用,因为我目前只有 Exim/WHM 的经验:

    这将允许您接收成功的送达通知,并且还应该允许成功电子邮件的已读回执。请注意,由于任何延迟或无法送达的电子邮件无论如何都会返回给发件人,因此不再支持成功以外的 DSN 选项;似乎只有 DSNOptions = 14 (All) 或 DSNOptions = 4 (Success) 在这一点上做任何事情。 免责声明:我不知道这会对针对您的邮件系统的垃圾邮件发送者产生什么不良影响,使用风险自负。

    另外,另一个小技巧是说您对成功的邮件不感兴趣,您只是希望无法投递的邮件在与发送地址不同的地址提醒您。在这里,您将摆脱 DSNOptions 和处置配置,只需将所需的电子邮件地址放入 objCDO.Sender 中,如下所示:

    objCDO.Sender = "returnedmail@domain.com"
    

    成功的电子邮件仍将来自您配置中的预编程地址 (objCDO.From),但是无法投递的电子邮件将返回到 objCDO.Sender 地址!

    希望这将帮助那些仍在使用带有 CDO 邮件的经典 ASP 并且一直想知道为什么他们不能让它继续工作的人。

    【讨论】:

      【解决方案2】:

      它可能不起作用,因为 Gmail 不希望您这样做。这种事情经常被垃圾邮件发送者利用。

      【讨论】:

      • 收到发货失败通知,但没有发货成功通知。我不确定一个如何导致漏洞利用,但另一个则不然。
      • @Sparafusile:目标 SMTP 服务器忽略传递成功通知请求的情况并不少见。如果您查看规范 DSN 仅请求此功能,则 SMTP 服务器没有义务遵守它。在现实世界中,想象一下所有潜在的消息传递所代表的额外负载。
      • 好的,所以 SMTP 决定不发送送达收据,很好。为什么上面的代码甚至不首先发送电子邮件?代码中是否存在阻止它工作的错误,即使我永远不会得到想要的结果?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多