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 OUTWHILE @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 OUTEND