Сообщение CDO не отправляется при запросе уведомления о доставке

Я пишу приложение на классическом 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 = "[email protected]"
ObjSendMail.From = "[email protected]"
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» — действительный адрес электронной почты. Любая помощь будет оценена по достоинству.


person Sparafusile    schedule 24.09.2010    source источник


Ответы (2)


Вероятно, это не работает, потому что Gmail не хочет, чтобы вы это делали. Подобные вещи часто используются спамерами.

person AnthonyWJones    schedule 28.09.2010
comment
Я получаю уведомление об ошибке доставки, но не уведомление об успешной доставке. Я не уверен, как одно может привести к эксплойту, но не другое. - person Sparafusile; 28.09.2010
comment
@Sparafusile: целевой SMTP-сервер нередко игнорирует запрос уведомления об успешной доставке. Если вы посмотрите на спецификацию, DSN запрашивает только эту функцию, SMTP-серверы не обязаны ее соблюдать. В реальном мире представьте себе дополнительную нагрузку, которую представляет собой весь потенциальный обмен сообщениями. - person AnthonyWJones; 28.09.2010
comment
Итак, SMTP решает не отправлять уведомление о доставке, хорошо. Почему приведенный выше код даже не отправляет электронное письмо? Есть ли в коде ошибка, которая мешает ему работать, даже если я никогда не получу желаемого результата? - person Sparafusile; 29.09.2010

Я знаю, что прошло несколько лет с тех пор, как это было активно, но я только что нашел решение, поэтому я собираюсь опубликовать его на случай, если у кого-то еще возникнет эта проблема.

Если вы используете сторонний SMTP-сервер, такой как Gmail или даже виртуальный хостинг, и у вас нет доступа к конфигурации этого сервера, вы ничего не можете сделать. Почтовый сервер просто не будет ретранслировать электронную почту с установленным параметром DSNOptions. Это определенно для того, чтобы сократить количество спама и злоупотреблений.

Однако, если у вас есть доступ к WHM или вы размещаетесь в компании, которая изменит настройки для вас (или у вас есть собственный SMTP-сервер), вы можете указать хост, для которого вы будете рекламировать поддержку DSN. Теперь этот параметр может быть недоступен на разных платформах почтовых серверов, так как у меня пока есть опыт работы только с Exim/WHM:

Скриншот этого в диспетчере конфигурации Exim

Теперь это позволит вам получать уведомления об успешной доставке, а также позволит получать уведомления о прочтении успешных электронных писем. Обратите внимание, что параметры уведомления о доставке, кроме успешного, больше не поддерживаются, поскольку любое задержанное или недоставленное электронное письмо все равно возвращается отправителю; кажется, что только DSNOptions = 14 (Все) или DSNOptions = 4 (Успех) ничего не делают на этом этапе. Отказ от ответственности: я не знаю, какие негативные последствия это может иметь для спамеров, нацеленных на вашу почтовую систему, используйте на свой страх и риск.

Кроме того, еще один небольшой трюк: скажем, вас не интересуют успешные письма, вы просто хотите, чтобы недоставленная почта предупреждала вас по адресу, отличному от адреса отправителя. Здесь вы избавитесь от DSNOptions и конфигурации диспозиции и просто поместите нужный адрес электронной почты в objCDO.Sender следующим образом:

objCDO.Sender = "[email protected]"

Успешные электронные письма по-прежнему будут отправляться от с предварительно запрограммированного адреса в вашей конфигурации (objCDO.From), однако недоставленные электронные письма будут возвращаться на адрес objCDO.Sender!

Надеюсь, это поможет всем, кто все еще использует Classic ASP с почтой CDO и всегда задавался вопросом, почему они больше не могут заставить это работать.

person Carmen Nuccio    schedule 05.10.2019