Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2000 Forums
 Transact-SQL (2000)
 big nasty mail-reading sp

Author  Topic 

spudhead
Starting Member

34 Posts

Posted - 2002-10-24 : 06:51:25
Hey,

The following sp has two problems. One is that I intermittently get a "xp_readmail failed with operating system 80" - I can't find anything that would indicate what that means. If I send several emails to the mailbox it's supposed to be reading, and run the sp via query analyser, it seems to crop up randomly in amongst the list of "1 rows affected, mail sent" statements.

The second problem is with the IF statement right at the beginning that is supposed to delete any "undeliverable" notifications that the system throws at it. It doesn't - I have no idea why.

Code below; any help hugely appreciated.


Declare @hMessage varchar(255),@msg_id varchar(255),@MessageText varchar(8000),@message varchar(8000),@MessageSubject varchar(8000),@subject varchar(8000),@Origin varchar (8000),@originator_address varchar(8000)
EXEC master.dbo.xp_findnextmsg @unread_only='true',@msg_id=@hMessage OUT

WHILE @hMessage IS NOT NULL BEGIN
exec master.dbo.xp_readmail @peek='true',@msg_id=@hMessage,@message=@MessageText OUT,@subject=@MessageSubject OUT,@originator_address=@Origin OUT
IF (CHARINDEX('Undeliverable', @MessageSubject)>0) BEGIN
exec master.dbo.xp_deletemail @msg_id=@hMessage
END
ELSE IF ((SELECT COUNT(*) FROM forum_users WHERE email=@Origin)=1) BEGIN
IF (CHARINDEX('(ThreadID=', @MessageSubject)>0) BEGIN -- IF REPLYING TO EXISTING THREAD
DECLARE @existingID int, @em1 varchar(100), @bdy1 varchar(8000), @sbj1 varchar(500), @usr1 int, @mySubject varchar(500)
SELECT @existingID=CAST(SUBSTRING(@MessageSubject, (CHARINDEX('=', @MessageSubject)+1), (CHARINDEX(')', @MessageSubject)-(CHARINDEX('=', @MessageSubject)+1))) AS int)
SELECT @mySubject=subject FROM forum_threads WHERE id=@existingID
SELECT @usr1=id FROM forum_users WHERE email=@Origin

--INSERT POST
INSERT INTO forum_posts (body, thread_id, user_id) VALUES (REPLACE(@MessageText, CHAR(13)+CHAR(10), '<br>'), @existingID, @usr1)

--GET EMAIL LIST
declare @emList varchar(8000)
select @emList=''

declare em_cursor1 cursor for
SELECT email FROM forum_users WHERE email_option='yes'
open em_cursor1
fetch next from em_cursor1 into @em1

while @@FETCH_STATUS=0
begin
SELECT @emList=@emList+@em1+';'
fetch next from em_cursor1 into @em1
end
close em_cursor1
deallocate em_cursor1

select @emList=Left(@emList, Len(@emList)-1)
select @sbj1=@Origin+': '+@mySubject+' (ThreadID='+cast(@existingID as varchar)+')'
select @bdy1='User '+@Origin+' has replied to a thread on the test forum. The post reads:'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+@MessageText
exec master.dbo.xp_sendmail
@recipients='Forum members <email@email.co.uk>',
@blind_copy_recipients=@emList,
@message=@bdy1,
@subject=@sbj1

exec master.dbo.xp_deletemail @msg_id=@hMessage
END
ELSE BEGIN -- IF NEW THREAD
DECLARE @newID int, @em2 varchar(100), @bdy2 varchar(8000), @sbj2 varchar(500), @usr2 int
SELECT @usr2=id from forum_users WHERE email=@Origin

-- INSERT INTO FORUM_THREADS & FORUM POSTS
INSERT INTO forum_threads (subject) VALUES (@MessageSubject)
SELECT @newID=@@IDENTITY
INSERT INTO forum_posts (body, thread_id, user_id) VALUES (REPLACE(@MessageText, CHAR(13)+CHAR(10), '<br>'), @newID, @usr2)

--GET EMAIL LIST
declare @emList2 varchar(8000)
select @emList=''

declare em_cursor2 cursor for
SELECT email FROM forum_users WHERE email_option='yes'
open em_cursor2
fetch next from em_cursor2
into @em2

while @@FETCH_STATUS=0
begin
select @emList2=@emList2+@em2+';'
fetch next from em_cursor2 into @em2
end
close em_cursor2
deallocate em_cursor2

select @emList2=Left(@emList2, Len(@emList2)-1)
select @sbj2=@Origin+': '+@MessageSubject+' (ThreadID='+cast(@newID as varchar)+')'
select @bdy2='User '+@Origin+' has started a new thread on the test forum. The post reads:'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+@MessageText
exec master.dbo.xp_sendmail
@recipients='Forum members <email@email.co.uk>',
@blind_copy_recipients=@emList2,
@message=@bdy2,
@subject=@sbj2
exec master.dbo.xp_deletemail @msg_id=@hMessage
END
END
SET @hMessage = NULL
EXEC master.dbo.xp_findnextmsg @unread_only='true',@msg_id=@hMessage OUT
END


AjarnMark
SQL Slashing Gunting Master

3246 Posts

Posted - 2002-10-25 : 20:08:36
For Question 1, try using SET NOCOUNT ON and see if that helps.

For Question 2, refer to your other posting here: [url]http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=20992[/url]

Go to Top of Page
   

- Advertisement -