ارسال ایمیل از دات نت

یکی از مشکلات همیشگی ارسال ایمیل از دات نت کم بودن propertyها کلاس SmtpClient و خلاصه بودن <system.net> در web.config است. تنها چیزهایی که می‌شود به این دو فهماند عبارتند از: نام کاربری، کلمه عبور، شماره پورت‌های مورد نیاز و استفاده یا عدم استفاده از SSL است. اینها در حالی است که اگر ایمیل خوان Outlook Express را مشاهده کنید متوجه می‌شوید که تنظیمات فوق العاده زیادی برای ارسال (و دریافت) ایمیل وجود دارد که شما به طور معمول در دات نت به آن دسترسی ندارید مثل تیک معروف My server requires authentication.

من در جستجو راه حل برای رفع این مشکل به لینک‌های زیر رسیده‌ام که امیدورم بتواند کار شما را هم راه بیندازد:

۱- دات نت برای ارسال ایمیل از CDO استفاده می‌کند. پس دانستن اطلاعاتی راجع به آن کمک خوبی به حل مسئله خواهد کرد: لینک

۲- یک FAQ کامل و بی‌نقص درباره فضای نامی Mail در دات‌نت: لینک

۳- جستجو در گوگل به دنبال آن عملیات خاصی که قصد انجامش با SMTPClient را دارید ولی نمی‌دانید برای آن از چه تنظیماتی باید استفاده کرد: لینک و لینک

۴- همان جستجوی مورد ۳ اما این بار در MSDN: لینک و لینک و لینک

۵- لاگ کردن فعالیت‌های SMTP برای یافتن علت احتمالی خطا: لینک

‫نحوه خطایابی عملیات ارسال/دریافت ایمیل

debug یکی از مشکلاتی که همیشه در آزمایش و راهبری پروتکل ECE به وجود می‌آید مشکلات مربوط به ارسال/دریافت ایمیل است. متاسفانه امکانات اولیه کلاس‌ها و کامپوننت‌های این کار اطلاعات چندان کاملی از خطای رخ داده به دست نمی‌دهند و گاها به یک خطای timed out بسنده می‌کنند. به عنوان مثال به خطای زیر که حاصل اجرای عملیات ارسال ایمیل با کلاس SmtpClient است توجه فرمایید:

(SendingMailException): The operation has timed out.,
(SmtpException): The operation has timed out.,

در این جور مواقع می‌توانید کلیه فعالیت‌های System.Net را زیر نظر بگیرید، شاید که مشکل ارسال/دریافت ایمیل را پیدا کردید. دقت کنید که با انجام این کار هر فعالیتی که بر روی TCP/IP انجام گیرد log شده و حجم فایل log در یک چشم به هم زدن به چندین مگابایت خواهد رسید. علاوه بر این پیدا کردن اطلاعات مورد نظر در این حجم زیاد اطلاعات کار چندان ساده‌ای نیست. در ادامه بخشی از این اطلاعات به عنوان نمونه آمده است:

System.Net.Sockets Verbose: 0 : [2616] Socket#23006966::Send()
System.Net.Sockets Verbose: 0 : [2680] Socket#23006966::Dispose()
System.Net.Sockets Error: 0 : [2616] Exception in the Socket#23006966::Send – A blocking operation was interrupted by a call to WSACancelBlockingCall
System.Net.Sockets Verbose: 0 : [2616] Exiting Socket#23006966::Send()     -> 0#0
System.Net Error: 0 : [2616] Exception in the SmtpClient#49662634::Send – Unable to write data to the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall.

حال برای فعال کردن «خطایابی» در برنامه خودتان کافی است کد زیر را به web.config یا app.config خود اضافه کنید. این کد در بالاترین سطح و درست زیر <configuration> اضافه می‌شود. همان جایی که <appSettings> و <system.web> قرار دارند:

<system.diagnostics>
<
trace autoflush="true" />
<
sources>
<
source name="System.Net" >
<
listeners>
<
add name="MyTraceFile"/>
</
listeners>
</
source>
<
source name="System.Net.Sockets">
<
listeners>
<
add name="MyTraceFile"/>
</
listeners>
</
source>
</
sources>
<
sharedListeners>
<
add
name="MyTraceFile"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="d:usersSystem.Net.trace.log"/>
</
sharedListeners>
<
switches>
<
add name="System.Net" value="Verbose" />
<
add name="System.Net.Sockets" value="Verbose" />
</
switches>
</
system.diagnostics>