۱۳۸۸/۰۲/۰۷

sp_send_dbmail و ارسال ايميل فارسي


نكته‌ي كوچكي در مورد ارسال ايميل فارسي توسط رويه ذخيره شده سيستمي sp_send_dbmail اس كيوال سرور وجود دارد كه شبيه به insert داده‌هاي فارسي در ديتابيسي است كه پس از ثبت، به صورت ؟؟؟ ذخيره مي‌شوند. (اين مورد با تنظيم collation تقريبا قابل حل است)
اگر هنگام ثبت، collation عربي يا فارسي (در اس كيوال سرور 2008) انتخاب شود، مشكلي در ثبت نخواهد بود.
اگر به collation اهميت نمي‌دهيد بايد اس كيوال سرور را مجبور كرد كه داده را يونيكد ذخيره كند و اينكار با اضافه كردن يك N به ابتداي رشته صورت مي‌گيرد و همچنين انتخاب نوع داده‌هاي n دار مانند nvarchar و امثال آن (n در اينجا به معناي national و اجبار آن مي‌باشد):

Insert into tblTest(f1,f2) values(1,N'متن فارسي')
دقيقا همين نكته هم درباره‌ي ارسال ايميل از طريق اس كيوال سرور صادق است. اگر N به ابتداي رشته اضافه نشود، رشته ارسالي را با فرمت ANSI ارسال مي‌كند و داده‌هاي يونيكد متن تخريب خواهند شد؛ مثلا چيزي شبيه به حالت زير:

<div align="center"><table border="1" width="95%" dir="rtl" cellspacing="0" cellpadding="0" style="font-family: Tahoma; font-size: 8pt" bordercolor="#660066"><tr><td bgcolor="#FFF9FF"><blockquote><p align="justify"><br>????? ????? ?<br>???? ???? ? ????? ?????? ??? ?? ????? ????? ?????. ???? ??? ???? ???? ????? ????? ????? ????? ????? ??? ??? ???? ???? ?????? ? ???? ?? ????? ???? ???? ??? ????? ??????.<br>???? ??? ????? ???? ?? ?????? ???? ????? ?????? ????? ? ?? ???? ???????? ????? ???? ???? ???? ?????? ???? ???? ??? ?? ????? ????.</blockquote></td></tr></table></div>
اين مشكل به صورت زير قابل حل است:

DECLARE @msg NVARCHAR(max)
SET @msg=N'متن فارسي'
براي ردگيري وضعيت ايميل‌هاي ارسالي هم مي‌توان از كوئري‌هاي زير استفاده نمود:

SELECT * from sysmail_allitems
SELECT * from sysmail_faileditems
SELECT * from sysmail_event_log