لماذا يتم إرسال MailMessage إلى أي عنوان من تطبيق Windows Forms ، ولكن ليس من تطبيق ASP.NET ، عندما يستخدم كلاهما نفس SMTP خادم؟

StackOverflow https://stackoverflow.com/questions/2145437

سؤال

أنا أعاني من خطأ غامض (بالنسبة لي) عند إرسال رسائل البريد الإلكتروني عبر خادم SMTP من تطبيق ويب ASP.NET. أحصل على الخطأ الشهير "غير قادر على الترحيل لـ xxx@yyy.zzz". ما هو غامض بالنسبة لي هو أنه عندما أقوم بقطع ولصق نفس الرمز بالضبط الذي يرسل البريد الإلكتروني إلى تطبيق نماذج Windows المعتاد ، فإن إرسال البريد الإلكتروني باستخدام هذا التطبيق ، فكل شيء على ما يرام. هذا جعلني أعتقد أنه ربما تكون المشكلة هي أن تطبيق ASP.NET يعمل كخدمة شبكة أثناء تشغيل تطبيق Windows Form SMTP-Server الذي يعمل ضمن خادم الشبكة في نفس IIS ، وهذا التطبيق لا يواجه هذه المشكلة.

لقد حاولت أيضًا إرسال رسائل البريد الإلكتروني عبر SMTP Server يدويًا بواسطة Telnet SMTP-Server على المنفذ 25 وتشغيل SMTP-Protocol يدويًا ، وكل شيء يعمل بشكل جيد. لم يتم تكوين SMTP-Server مع أي نوع من المصادقة أو SSL.

هناك حقيقة غامضة أخرى وهي أن تطبيق ASP.NET يمكنه إرسال رسائل بريد إلكتروني من عنوان داخل نفس المجال إلى عنوان البريد الإلكتروني داخل نفس المجال ، ولكن ليس لأي عنوان خارج المجال. لكن تطبيق Windows Forms ، الذي يستخدم نفس الرمز بالضبط ، يمكنه إرسال رسائل البريد الإلكتروني من أي عنوان إلى أي عنوان داخل وخارج المجال.

لتلخيص:

  • يمكن لتطبيق ASP.NET إرسال رسائل البريد الإلكتروني من العناوين داخل المجال إلى العناوين داخل المجال ، ولكن ليس للعناوين خارج المجال.
  • يمكن لتطبيق نماذج Windows تشغيل نفس الرمز على نفس الكمبيوتر يمكن أن يرسل رسائل البريد الإلكتروني من أي عنوان إلى أي عنوان.
  • يمكن لتطبيق ASP.NET آخر على نفس IIS الذي يعمل ضمن نفس الحساب (خدمة الشبكة) إرسال رسائل البريد الإلكتروني باستخدام نفس SMTP Server من أي عنوان إلى أي عنوان.
  • لا توجد مصادقة تم تكوينها على خادم SMTP.
  • يستخدم كل من تطبيق ASP.NET وتطبيق Windows Forms فئة System.net.mail.smtpclient لإرسال system.net.mail.mailmessage.

الرمز الذي يرسل تدليك البريد الإلكتروني هو:

private void button1_Click(object sender, EventArgs e)
        {
            MailMessage mesasge = new MailMessage(txtFrom.Text, txtTo.Text, "Test mail", txtBody.Text);
            SmtpClient client = new SmtpClient();
            if (!(string.IsNullOrEmpty(txtUserName.Text)))  //Is false since txtUserName.Text is empty
                client.Credentials = new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);
            client.EnableSsl = false;
            client.Host = txtServer.Text;
            client.Port = 25;
            try
            {
                client.Send(mesasge);
            }
            catch (Exception ex)
            {
                txtResponse.Text = ex.Message;
            }
        }

بقدر ما أستطيع أن أفهم ، يجب أن تكون هذه مسألة تكوين بدلاً من مشكلات الترميز. هل لدى أي شخص فكرة عن المشكلة ، وربما كيف يمكن حل هذا؟ شكرا!

هل كانت مفيدة؟

المحلول

هذا بالتأكيد يبدو وكأنه مشكلة مصادقة أو ، أنت تستخدم عن طريق الخطأ خادمين مختلفين SMTP.

أوصيك بتمكين تسجيل الدخول في كلا التطبيقين ، وعرض السجل. عندما تشاهد السجل ، يجب أن تكون قادرًا على رؤية الاختلافات ، ونأمل أن تعود إلى الكود الخاص بك.

لتسجيل enalbe في system.net.mail ، تحتاج إلى إضافة بعض الإدخالات إلى ملف .config الخاص بك.

<configuration>
  <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="System.Net.trace.log"                />
    </sharedListeners>

    <switches>
      <add name="System.Net" value="Verbose" />
      <add name="System.Net.Sockets" value="Verbose" />
    </switches>
 </configuration>

إليك رابط بمزيد من المعلومات:

http://systemnetmail.com/faq/4.10.aspx

نصائح أخرى

هل لديك انتحال شخصية = صحيح في web.config؟

فعل هذا:

new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);

بقدر ما أعرف يتطلب تعيين web.config للسماح انتحال شخصية.

حاول إضافة هذا لك web.config (إذا لم يكن لديك هناك)

    <system.web>
    <identity impersonate="true"  />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top