Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 sp_send_cdosysmail глюк ???  [new]
vovan_r
Member

Откуда: Vilnius
Сообщений: 6
Привет всем.

Широко известная проц sp_send_cdosysmail (из MS native примера как послать почту из MSSQL), проработав пару недель, вдруг перестала функционировать.
На всякий случай ее текст:

/************/
CREATE PROCEDURE [dbo].[sp_send_cdosysmail]
@From varchar(100),
@To varchar(100),
@Subject varchar(100),
@Body varchar(4000)
AS
Declare @iMsg int
Declare @hr int

EXEC @hr = sp_OACreate 'CDO.Message', @iMsg OUT
EXEC @hr = sp_OASetProperty @iMsg, 'Configuration(cdoSendUsingMethod)', 2 -- use remote SMTP server
EXEC @hr = sp_OASetProperty @iMsg, 'Configuration(cdoSMTPServerName)', '192.168.2.2' -- name of your SMTP mail server
EXEC @hr = sp_OASetProperty @iMsg, 'Configuration(cdoSMTPConnectionTimeout)', 10
EXEC @hr = sp_OAMethod @iMsg, 'Configuration.Fields.Update', null
EXEC @hr = sp_OASetProperty @iMsg, 'To', @To
EXEC @hr = sp_OASetProperty @iMsg, 'From', @From
EXEC @hr = sp_OASetProperty @iMsg, 'Subject', @Subject
EXEC @hr = sp_OASetProperty @iMsg, 'HTMLBody', @Body
EXEC @hr = sp_OAMethod @iMsg, 'Send', NULL
EXEC @hr = sp_OADestroy @iMsg
/************/

Зато в c:\InetPub\mailroot\queue накапливаются посланные письма

Причем этот же механизм использующий ASP-script работает как ни в чем ни бывало (на том же компе):
'----------------------------
on error resume next
err.Clear

if trim(request.form("to")) <> "" and _
trim(request.form("subject")) <> "" and _
trim(request.form("body")) <> "" then

' Send by connecting to port 25 of the SMTP server.
Dim iMsg
Dim iConf
Dim Flds
Dim strHTML

Const cdoSendUsingPort = 2

set iMsg = Server.CreateObject("CDO.Message")
set iConf = Server.CreateObject("CDO.Configuration")

Set Flds = iConf.Fields

' Set the CDOSYS configuration fields to use port 25 on the SMTP server.

With Flds
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort
'ToDo: Enter name or IP address of remote SMTP server.
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.2.2"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
.Update
End With

' Apply the settings to the message.
With iMsg
Set .Configuration = iConf
.To = Request.Form("to") 'ToDo: Enter a valid email address.
.From = "client@creditreform.lt" 'ToDo: Enter a valid email address.
.Subject = Request.Form("subject")
.HTMLBody = "<html><head></head><body>" & _
Request.Form("body") & _
"</body></html>"
End With

if err.number = 0 then iMsg.Send

' Clean up variables.
Set iMsg = Nothing
Set iConf = Nothing
Set Flds = Nothing

end if
'-------------------------------

Народ, есть какие-нить идеи?
7 ноя 04, 22:41    [1089314]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_cdosysmail глюк ???  [new]
Glory
Member

Откуда:
Сообщений: 104760
Народ, есть какие-нить идеи?
Есть идея что вы для начала сообщите нам полную версию вашего MSSQL.
А потом расскажите что есть "вдруг перестала функционировать."
Можете также в означенном скрипте поставить после каждой процедуры sp_OA* обработку ошибок. Чтобы контролировать ход выполенения.
8 ноя 04, 10:22    [1089490]     Ответить | Цитировать Сообщить модератору
 Re: sp_send_cdosysmail глюк ???  [new]
vovan_r
Member

Откуда: Vilnius
Сообщений: 6
Платформа W2KServer SP4, MSSQL7SP4:
Microsoft SQL Server 7.00 - 7.00.1077 (Intel X86)
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

Пересоздавал процедуру многократно в разных вариантах.
Окончательный вариант с проверкой ошибок и выводом диагностики такой:

use master
go

/***********************************************/
CREATE PROCEDURE [dbo].[sp_send_cdosysmail3]
@From varchar(100),
@To varchar(100),
@Subject varchar(100),
@Body varchar(4000)
AS
Declare @iMsg int
Declare @hr int

EXEC @hr = sp_OACreate 'CDO.Message', @iMsg OUT

select '@iMsg:', @iMsg, '@hr:', @hr

IF @hr = 0
EXEC @hr = sp_OASetProperty @iMsg, 'Configuration(cdoSendUsingMethod)', 2 -- use remote SMTP server

IF @hr = 0
EXEC @hr = sp_OASetProperty @iMsg, 'Configuration(cdoSMTPServerName)', '192.168.2.2' -- name of your SMTP mail server

IF @hr = 0
EXEC @hr = sp_OASetProperty @iMsg, 'Configuration(cdoSMTPConnectionTimeout)', 60

IF @hr = 0
EXEC @hr = sp_OAMethod @iMsg, 'Configuration.Fields.Update', null


declare @intProperty int, @hr2 int
set @intProperty=0

EXEC @hr2 = sp_OAGetProperty @iMsg, 'Configuration(cdoSendUsingMethod)', @intProperty OUT
select '@hr2:',@hr2, 'Configuration(cdoSendUsingMethod):', @intProperty

EXEC @hr2 = sp_OAGetProperty @iMsg, 'Configuration(cdoSMTPServerName)', @intProperty OUT
select '@hr2:',@hr2, 'Configuration(cdoSMTPServerName):', @intProperty

EXEC @hr2 = sp_OAGetProperty @iMsg, 'Configuration(cdoSMTPConnectionTimeout)', @intProperty OUT
select '@hr2:',@hr2, 'Configuration(cdoSMTPConnectionTimeout):', @intProperty


IF @hr = 0
EXEC @hr = sp_OASetProperty @iMsg, 'To', @To

IF @hr = 0
EXEC @hr = sp_OASetProperty @iMsg, 'From', @From

IF @hr = 0
EXEC @hr = sp_OASetProperty @iMsg, 'Subject', @Subject

IF @hr = 0
EXEC @hr = sp_OASetProperty @iMsg, 'HTMLBody', @Body

IF @hr = 0
EXEC @hr = sp_OAMethod @iMsg, 'Send', NULL

IF @hr <> 0
begin
print 'error'
EXEC sp_displayoaerrorinfo @iMsg, @hr
end

EXEC @hr = sp_OADestroy @iMsg

/***********************************************/


Теперь о том, что такое "перестала функционировать":
процедура (в голом виде без всяких проверок, так, как она дана в примере от Microsoft) исправно работала некоторое время: по расписанию слала мне уведомления, используя удаленный SMTP-сервер. И именно "вдруг" письма перестали приходить. Стал рыться в сервере - оказалось, "посланные" процедурой письма стали накапливаться в c:\InetPub\Pickup, вроде как она пытается отправить через локальный SMTP-сервис !!! (которым я сроду не пользовался, не настроен и выключен по жизни; включенный SMTP забрал их в c:\InetPub\Queue, там и валяются, но сейчас не об этом).

Т.о. установка свойств cdoSendUsingMethod=2 и cdoSMTPServerName игнорируется.

Проверка установленных свойств возвращает немыслимые значения,
вот вывод последней версии процедуры sp_send_cdosysmail3:
/***********************************************/
------ ----------- ---- -----------
@iMsg: 798585184 @hr: 0

(1 row(s) affected)


----- ----------- ---------------------------------- -----------
@hr2: 0 Configuration(cdoSendUsingMethod): 798199120

(1 row(s) affected)


----- ----------- --------------------------------- -----------
@hr2: 0 Configuration(cdoSMTPServerName): 798196552

(1 row(s) affected)


----- ----------- ---------------------------------------- -----------
@hr2: 0 Configuration(cdoSMTPConnectionTimeout): 798197968

(1 row(s) affected)


/***********************************************/

пробовал получить свойство Configuration(cdoSMTPServerName) как char:
sp_OAGetProperty ругается, что оно должно быть integer ???

При том что @hr всегда равен нулю - никаких ошибок!!!

Прикол в том, что и на другом сервере (те же версии W2K и SQL) та же байда.

Рестарты Windows и SQL не помогают.

Но еще больший прикол, что на обоих серверах аналогичный sql-ному asp-скрипт (см. выше первое сообщение) работает без запинки.

Откликнитесь, у кого есть какие-нибудь соображения по поводу.
8 ноя 04, 13:25    [1089696]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить