it-swarm.asia

إرسال البريد الإلكتروني عبر خادم Gmail SMTP باستخدام C #

لسبب ما ، لا يعمل الجواب المقبول ولا أي أسئلة أخرى من أجل " إرسال بريد إلكتروني في .NET من خلال Gmail ". لماذا لا يعملون؟

استكمال: لقد جربت جميع الإجابات (المقبولة وغير ذلك) في السؤال الآخر ، ولكن لا يعمل أي منها.

أود فقط معرفة ما إذا كان يعمل لصالح أي شخص آخر ، وإلا فإن Google ربما تكون قد غيرت شيئًا ما (الذي حدث من قبل).

عندما أجرب قطعة الشفرة التي تستخدم SmtpDeliveryMethod.Network ، أتلقى بسرعة SmtpException على إرسال (رسالة). الرسالة هي

يتطلب خادم SMTP اتصالًا آمنًا أو لم تتم مصادقة العميل.

استجابة الخادم كانت:

5.5.1 المصادقة المطلوبة. معرفة المزيد في "<- على محمل الجد ، وينتهي هناك.

تحديث:

هذا سؤال طرحته منذ فترة طويلة ، والإجابة المقبولة هي الكود الذي استخدمته عدة مرات في مشاريع مختلفة.

لقد أخذت بعض الأفكار في هذا المنشور وغيره من مشاريع EmailSender لإنشاء مشروع EmailSender في Codeplex . إنه مصمم للاختبار ويدعم خدمات SMTP المفضلة مثل GoDaddy و Gmail.

229
CVertex

CVertex ، تأكد من مراجعة الكود الخاص بك ، وإذا لم يكشف ذلك عن أي شيء ، فأرسله. كنت فقط تمكين هذا على موقع ASP.NET اختبار كنت أعمل ، وأنه يعمل.

في الواقع ، في مرحلة ما كان لدي مشكلة في التعليمات البرمجية الخاصة بي. لم أتمكن من تحديد موقعه حتى أمتلك إصدارًا أبسط على برنامج وحدة التحكم ورأيت أنه يعمل (لا يوجد أي تغيير في جانب Gmail كنت قلقًا بشأنه). يعمل الرمز أدناه تمامًا مثل العينات التي أشرت إليها:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("[email protected]", "mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]", "[email protected]", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

لقد عملت أيضًا باستخدام مزيج من web.config و http://msdn.Microsoft.com/en-us/library/w355a94k.aspx و الكود (لأنه لا يوجد EnableSsl في ملف التكوين: ().

283
eglasius

سوف يتابع دائمًا ما يكون الجواب لسؤالك إذا فشل كل شيء :

لقد حصلت على نفس الخطأ بالضبط ، فقد تبيّن أن خوارزمية قياس كلمة المرور الجديدة القوية في Google قد غيّرت اعتبار كلمة المرور الحالية ضعيفة للغاية ، ولا تخبرني بشيء عنها (ولا حتى رسالة أو تحذير) ... كيف اكتشفت ذلك ؟ حسنًا ، اخترت تغيير كلمة المرور الخاصة بي لمعرفة ما إذا كان ذلك سيساعد (جرب كل شيء آخر ولكن دون جدوى) وعندما قمت بتغيير كلمة المرور الخاصة بي ، نجحت!

بعد ذلك ، للتجربة ، حاولت تغيير كلمة المرور الخاصة بي مرة أخرى إلى كلمة المرور السابقة لمعرفة ما سيحدث ، ولم يسمح لي Gmail فعليًا بالقيام بذلك ، مستشهدًا بالسبب "آسف ، لا يمكننا السماح لك بحفظ هذا التغيير حسب اختيارك" كلمة المرور ضعيفة للغاية "ولن تسمح لي بالعودة إلى كلمة المرور القديمة. لقد فهمت من ذلك أنه كان يخطئ لأنه إما أ) تحتاج إلى تغيير كلمة المرور الخاصة بك مرة واحدة كل × عدد شهور أو ب). كما قلت من قبل ، تغيرت خوارزميات قوة كلمة المرور الخاصة بهم ، وبالتالي لم يتم قبول كلمة المرور الضعيفة التي كنت أقبلها ، على الرغم من أنهم لم يقولوا شيئًا عن ذلك عند محاولة تسجيل الدخول إلى أي مكان! هذا (الرقم 2) هو السيناريو الأكثر ترجيحًا ، نظرًا لأن عمر كلمة المرور الضعيفة يبلغ من العمر حوالي 4 أشهر ، وقد سمح لي باستخدامه في Gmail.

إنه لأمر سيء للغاية أنهم لم يقلوا شيئًا عن ذلك ، لكن هذا أمر منطقي. نظرًا لأن معظم رسائل البريد الإلكتروني المختطفة يتم تسجيل دخولها باستخدام برنامج خارج gmail ، وأنا أظن أنه يجب عليك الحصول على كلمة مرور أقوى إذا كنت تريد استخدام Gmail خارج بيئة Gmail.

آمل أن يساعد هذا!

66
Erx_VB.NExT.Coder

بالإضافة إلى خطوات تحري الخلل وإصلاحه الأخرى الموضحة أعلاه ، أود أيضًا أن أضيف أنه إذا قمت بتمكين المصادقة ثنائية العامل (المعروفة أيضًا باسم التحقق من خطوتين ) على حساب GMail الخاص بك ، يجب عليك إنشاء تطبيق كلمة المرور الخاصة واستخدام كلمة المرور التي تم إنشاؤها حديثًا للمصادقة عبر SMTP .

لإنشاء واحدة ، تفضل بزيارة: https://www.google.com/settings/ واختر ترخيص التطبيقات والمواقع لإنشاء كلمة المرور.

64
John Rasch
Turn On Access For Less Secure Apps and it will work for all no need to change password.

رابط لإعداد Gmail

enter image description here

50
Suhail Mumtaz Awan

واجهت بعض المشكلات في إرسال رسائل البريد الإلكتروني من حساب gmail الخاص بي أيضًا ، والتي كانت ناتجة عن العديد من المواقف المذكورة أعلاه. فيما يلي ملخص لكيفية العمل بها ، وإبقائها مرنة في نفس الوقت:

  • بادئ ذي بدء ، قم بإعداد حساب GMail الخاص بك:
    • تمكين IMAP وتأكيد العدد الأقصى الصحيح للرسائل (يمكنك القيام بذلك هنا)
    • تأكد من أن كلمة المرور لا تقل عن 7 أحرف وأن تكون قوية (وفقًا لـ Google)
    • تأكد من أنك لست مضطرًا إلى إدخال رمز الكابتشا أولاً. يمكنك القيام بذلك عن طريق إرسال بريد إلكتروني تجريبي من متصفحك.
  • قم بإجراء تغييرات في web.config (أو app.config ، لم أحاول ذلك بعد ، لكنني أفترض أنه من السهل تشغيله في تطبيق windows):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="[email protected]" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    Host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="[email protected]"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class

والآن كلما أردت إرسال رسائل البريد الإلكتروني ، كل ما عليك فعله هو الاتصال بـ SSLMail.SendMail:

مثلا في صفحة بها عنصر تحكم PasswordRecovery:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

أو في أي مكان في الكود يمكنك الاتصال:

SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]", "Subject", "Body"})

آمل أن يكون هذا يساعد أي شخص يعمل في هذا المنصب! (لقد استخدمت VB.NET لكنني أعتقد أنه من السهولة تحويله إلى أي لغة .NET.)

29
Sebas
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("[email protected]","[email protected]","test","testbody")

إذا تلقيت خطأ ، مثل "يتطلب خادم SMTP اتصالًا آمنًا أو لم تتم مصادقة العميل. كانت استجابة الخادم: 5.5.1 المصادقة مطلوبة. مزيد من المعلومات على" كما أحصل عليه قبل ذلك ، تأكد من تضمين السطر SMTPClientObj.UseDefaultCredentials = False وهذا يجب أن السطر قبل SMTPClientObj.Credentials.

لقد حاولت تبديل هذين الخطين في الاتجاه المعاكس و 5.5.1 خطأ في المصادقة المطلوبة تم إرجاعه.

13
Terry Chng

أوه ... إنه لأمر مدهش ... أولاً لم أستطع إرسال بريد إلكتروني لأي أسباب. ولكن بعد أن غيرت تسلسل هذين الخطين على النحو التالي ، فإنه يعمل بشكل مثالي.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");

نأمل أن تكون هذه المساعدة!!! :)

12
Wirol

واجهت نفس المشكلة ، لكن اتضح أن الحماية من الفيروسات كانت تمنع البريد الإلكتروني العشوائي الصادر. أتاح لي إيقاف تشغيل هذا استخدام المنفذ 587 لإرسال بريد إلكتروني عبر SMTP عبر GMail

9
user464329

خطوات بسيطة لإصلاح هذا:

1) تسجيل الدخول إلى Gmail الخاص بك

2) انتقل إلى هذه الصفحة https://www.google.com/settings/security/lesssecureapps وتعيين إلى "تشغيل"

9
Kevin

المشكلة ليست مشكلة القدرة التقنية على الإرسال عبر gmail. هذا يعمل لمعظم الحالات. إذا لم تتمكن من الحصول على جهاز لإرساله ، فعادةً ما يكون ذلك بسبب عدم توثيق الجهاز مع إنسان في أدوات التحكم مرة واحدة على الأقل.

المشكلة التي يواجهها معظم المستخدمين هي أن Google تقرر تغيير الحدود الصادرة طوال الوقت. يجب عليك دائمًا إضافة رمز دفاعي إلى حلك. إذا بدأت في رؤية الأخطاء ، فقم بإيقاف سرعة الإرسال وتوقف عن الإرسال لفترة من الوقت. إذا كنت لا تزال تحاول إرسال Google ، فستضيف أحيانًا وقتًا إضافيًا إلى فترة التأخير قبل إرسالها مرة أخرى.

ما قمت به في نظامي الحالي هو إرسال تأخير لمدة 1.5 ثانية بين كل رسالة. ثم إذا واجهت أي أخطاء ، توقف لمدة 5 دقائق ثم ابدأ من جديد. يعمل هذا عادةً وسيسمح لك بإرسال ما يصل إلى حدود الحساب (آخر مرة قمت فيها بالتحقق من أنه كان 2000 لتسجيلات العملاء الرئيسية يوميًا).

9
Jason Short

لست متأكدًا من إصدار .NET المطلوب لذلك لأن eglasius ذكرت أنه لا يوجد إعداد enableSsl (أستخدم .NET 4.0 ، لكنني أظن أنه يعمل في .NET 2.0 أو إصدار أحدث) ، ولكن هذا التكوين يعمل بنجاح بالنسبة لي (ولا يتطلب منك استخدام أي تكوين برنامجي):

<system.net>
  <mailSettings>
    <smtp from="[email protected]" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" Host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
    </smtp>
  </mailSettings>
</system.net>

قد تضطر إلى تمكين بروتوكول POP أو IMAP على حساب Gmail أولاً: https://mail.google.com/mail/؟shva=1#settings/fwdandpop

أوصي بتجربتها مع عميل بريد عادي أولاً ...

8
Wiebe Tijsma

إذا لم ينجح أي شيء آخر من أجلك ، فقد تحتاج إلى السماح بالوصول إلى حساب gmail الخاص بك من تطبيقات الطرف الثالث. كانت هذه مشكلتي. للسماح بالوصول ، قم بما يلي:

  1. تسجيل الدخول إلى حساب جوجل الخاص بك.
  2. تفضل بزيارة هذه الصفحة https://accounts.google.com/DisplayUnlockCaptcha وانقر على زر للسماح بالوصول.
  3. تفضل بزيارة هذه الصفحة https://www.google.com/settings/security/lesssecureapps وتمكين الوصول إلى التطبيقات الأقل أمانًا.

هذا يعمل بالنسبة لي آمل أن يعمل لشخص آخر!

8
Celt

كنت أستخدم اتصال VPN للشركات. كان هذا هو السبب في أنني لم أستطع إرسال بريد إلكتروني من طلبي. يعمل إذا انفصلت عن VPN.

6
Ned

@ Andres Pompiglio: نعم هذا صحيح ، يجب عليك تغيير كلمة المرور مرة واحدة على الأقل .. هذه الرموز تعمل بشكل جيد:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

ويمكنك إجراء مكالمة إلى الوظيفة باستخدام:

Response.Write(SendMail(recipient Address, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

لقد وجدت أيضًا أن الحساب الذي استخدمته لتسجيل الدخول تم إلغاء تنشيطه بواسطة google لسبب ما. بمجرد إعادة تعيين كلمة المرور الخاصة بي (إلى ما كانت عليه سابقًا) ، تمكنت من إرسال رسائل البريد الإلكتروني على ما يرام. كنت أتلقى 5.5.1 رسالة أيضا.

5
RKL

لقد حاولت أيضًا حل العديد من التغييرات ، لكنني سأجري بعض التغييرات

Host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true

مع smtpclient المعلمات أعلاه تعمل في جوجل

5
Suresh

حل ممكن آخر لك. كنت أواجه مشكلات مماثلة عند الاتصال بـ gmail عبر IMAP. بعد تجربة كل الحلول التي صادفتها ، سوف تقرأ عنها هنا وفي أي مكان آخر على SO (على سبيل المثال ، تمكين IMAP ، قم بتمكين وصول أقل أمانًا إلى بريدك ، باستخدام https://accounts.google. com/b/0/displayunlockcaptcha وما إلى ذلك) ، لقد قمت بالفعل بإعداد حساب بريد جوجل جديد مرة أخرى.

في الاختبار الأصلي ، أول حساب gmail قمت بإنشائه ، قمت بالاتصال بحساب gmail الرئيسي. نتج عن هذا سلوك خاطئ حيث تم الرجوع إلى الحساب الخاطئ بواسطة google. على سبيل المثال ، يؤدي تشغيل https://accounts.google.com/b/0/displayunlockcaptcha إلى فتح حسابي الرئيسي بدلاً من الحساب الذي أنشأته لهذا الغرض.

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

لم أؤكد هذا بعد (أي. مستنسخة) ، ولكن يبدو أنها فعلت ذلك بالنسبة لي ... آمل أن يساعد.

4
sinewave440hz

كنت أتلقى نفس الخطأ ولم يساعد أي من الحلول المذكورة أعلاه.

كانت مشكلتي أنني كنت أقوم بتشغيل الشفرة من خادم بعيد ، والتي لم تستخدم قط لتسجيل الدخول إلى حساب gmail.

فتحت متصفحًا على الخادم البعيد وسجّلت الدخول إلى gmail من هناك. لقد طرحت سؤال أمان للتحقق من أنه كان لي لأن هذا كان موقعًا جديدًا. بعد القيام بالتحقق الأمني ​​، تمكنت من المصادقة من خلال الرمز.

4
Vlad Tamas

لقد واجهت نفس الخطأ ( "يتطلب خادم SMTP اتصالًا آمنًا أو لم تتم مصادقة العميل. استجابة الخادم كانت: 5.5.1 المصادقة مطلوبة. تعرف على المزيد على" ) واكتشف أنني كنت أستخدم كلمة مرور خاطئة. أصلحت بيانات اعتماد تسجيل الدخول وأرسلتها بشكل صحيح.

أعرف أن هذا متأخر ، لكن ربما يساعد هذا شخصًا آخر.

4
Albert Bori

قم بتشغيل تطبيقات أقل أمانًا لحسابك: https://www.google.com/settings/security/lesssecureapps

4
Burak Kalkan
  1. تحقق أولاً من إعداد حساب gmail وتشغيله من "الوصول للتطبيقات الأقل أمانًا"  enter image description here

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

  1. جلس

    smtp.UseDefaultCredentials = false;
    

    قبل

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    
4
reza.cse08

شيء آخر وجدته هو أنه يجب عليك تغيير كلمة المرور مرة واحدة على الأقل. وحاول استخدام كلمة مرور مستوى آمنة (لا تستخدم نفس المستخدم مثل كلمة المرور ، 123456 ، إلخ.)

4
Andres Pompiglio

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

تسجيل الدخول إلى الحساب ومحاولة يدويا لإرسال البريد. إذا تم الوصول إلى الحد الأقصى فسيبلغك بذلك

3
Ayson Baxter

يمكنك أيضًا الاتصال عبر المنفذ 465 ، ولكن بسبب بعض القيود المفروضة على مساحة الاسم System.Net.Mail قد تضطر إلى تغيير التعليمات البرمجية الخاصة بك. هذا لأن مساحة الاسم لا توفر القدرة على إجراء اتصالات SSL الضمنية. تمت مناقشة هذا الأمر في http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx ، ولقد قدمت مثالًا عن كيفية استخدام CDO (كائن بيانات تعاونية) في مناقشة أخرى ( بريد SMTP عبر أخطاء C # .Net على جميع المنافذ ).

3
Bryan Allred

هناك سبب واحد أو أكثر لهذه الأخطاء.

  • تسجيل الدخول باستخدام Gmail الخاص بك (أو أي شيء آخر إذا) في النظام المحلي الخاص بك.

  • تحقق أيضًا من تطبيق أقل أمانًا وقم بتعيينه على "تشغيل" هنا هو الرابط لـ GMAIL. https://www.google.com/settings/security/lesssecureapps

  • تحقق من وجود EnableSsl في رمز البريد الإلكتروني الخاص بك ، وقم أيضًا بتعيينه على صواب.

    smtp.EnableSsl = true;
    
  • تحقق أيضًا من المنفذ الذي تستخدمه حاليًا. 25 عالمي ، ولكن يمكنك التحقق من ذلك للآخرين مثل 587. تحقق هنا. هل كل الاتصالات SMTP يحدث أكثر من 25؟

  • إذا كنت على بعد : تحقق من إجابة فلاد تاماس أعلاه.

2
Bharat
  smtp.Host = "smtp.gmail.com"; //Host name
    smtp.Port = 587; //port number
    smtp.EnableSsl = true; //whether your smtp server requires SSL
    smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    smtp.Timeout = 20000;
2
somesh

قم بتغيير كلمة مرور gmail وحاول مرة أخرى ، يجب أن تعمل بعد ذلك.

لا تعرف السبب ، ولكن في كل مرة تقوم فيها بتغيير الاستضافة ، يجب عليك تغيير كلمة المرور الخاصة بك.

1
Jo Smo

إذا كانت لديك خطوة التحقق بخطوتين في حساب Gmail ، فستحتاج إلى إنشاء كلمة مرور للتطبيق. https://support.google.com/accounts/answer/185833؟p=app_passwords_sa&hl=ar&visit_id=636903322072234863-1319515789&rd=1 حدد كيفية إنشاء خيار كلمة مرور التطبيق واتباع الخطوات المتوفرة. انسخ كلمة مرور التطبيق المنشأة والصقها في مكان ما ، حيث لن تتمكن من استعادتها بعد النقر فوق تم.

0
Faith Nassiwa