الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح بروتوكول SMTP وكود لإرسال البريد بدوت نت

مغلق
بدأه dreammaker في 23 فبراير 2006 · 22 رد · 5,075 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذا الكتيب يشرح بروتوكول SMTP

مع التطبيق العملي على إرسال البريد

بكود فيجيوال بيزيك دوت نت

إعداد:

محمد حمدي غانم

الكتيب مرفق

smtp.zip

#2

ملاحظة أخي

يجب تثبيت SMTP Server

عن طريق قرص الويندوز

أو نقوم بتثبيت سيرفر IIS بالكامل

مع شكري

#3

طيب و إلي عمل smtp server يعمل أيه لازم يثبت ال Ms smtp server برضه :P

#4

هو فيه من حق عاوز أعرفه أزي نتحكم في الوقت بتاع الأرسال في ال MS SMTP SERVER ???

#5

السلام عليكم

ارسال رسائل عن طريق ال smtp بسيط جدا و هو ان نعرف متغير من نوع system.web.smtpserver

ثم نكتب :

dim smtp as smtpserver
smtp.smtpserver.insert(0,"127.0.0.1")
smtp.send(message)

و اعتقد كلكم يعرف هذه الطريقة لكن هناك طريقة عن طريق ال tcpclient اقوم بالاتصال بسيرفر ال smtp و اقوم بارسال معلومة معلومة عن الرسالة و لكن المشكلة يعرض لي رسالة خط و هي كالتالي :

the requested name is valid and was found in the database, but it doesn't have the correct associated data being resolved for

و هذه الرسالة ايضا في ايميل الpop3 تظهر ايضا فارجوكم توضيح هذه المشكلة

#6

maayah:

ليس شرطا.. الكود يستخدم بروتوكولات الالتصال لتطبييق SMTP خطوة خطوة، ولا يستخدم السيرفر الافتراضي الخاص بالـ IIS.

تحياتي

#7

R0OT

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

ihsan_ahmed

الرسالة التي ذكرتها كانت تظهر لي عند استخدام IP خاطئ

أرجو أن تنظر في الكود المرفق في الكتاب، لتتعرف على كيفية الحصول على الـ IP الخاص بالـ SMTP الخاص بهوتميل، حيث يمكنك تعميم الطريقة.

تحياتي

#8

بالنسبة لسرعة ارسال الميل في الثانية ففعلا دي قدرة تختلف من سيرفر لسيرفر و من منتج لاخر و كنت قريت فيها علشان كده حفتي و اقلي فيها

الفكرة كلها قدره المنتج على عمل اكثر thread و كل thread تكون قادرة على ارسال البريد بحد ذاتها تقريبا ال exchange بيعمل 16 بس مش فاكر قريتها فين

الحاجة التانية الي بتأثر في الميل و سرعته هو وجود برنامج لبحث الايميل و ال DNS لانه الايميل كله DNS

Mahmoud Magdy

MVP - Exchange Server. MCITP (Windows Server 2008, Exhcange Server 2010,/2007),CCNP, MCTS(OCS 2007 R2, SCCM 2007)

Tech Lead

Ingazat Information Technology

Follow me on twitter: http://www.twitter.com/_busbar

my blog: http://autodiscover.wordpress.com

Link with me on linkedin: http://www.linkedin.com/profile?viewProfile=&key=71027694

or on experts-exchange.com: http://www.experts-exchange.com/M_1426100.html

#9

busbar أنا قصدي مش كام ميل أنا قصدي ممكن يتبعت بعد 4 : 12 ساعة ده طبعا في حالة أستخدام ال smtp بتاع الويندوز يعني Ms smtp server

#10

السلام عليكم

يا اخوان انا اولا لم استخدم الدالة الجاهزة ثانيا بدل الاي بي يمكنك وضع عنوان الموقع بدون www مثلا بالنسبة للياهو نضع في مكان ال smtpserver التالي (yahoo.com) فقط و بالنسبة لبرنامجي فقد استخدمت الكود التالي :

Sub send()
        Try
            lstlog.Items.Clear()
            Dim smtpserver As New TcpClient()
            smtpserver.Connect(txtsmtpserver.Text, 25)
            lstlog.Items.Add("connection established with smtpserver.com")
            Dim writestream As NetworkStream = smtpserver.GetStream
            Dim readstream As StreamReader = New StreamReader(smtpserver.GetStream)
            'عندما نتصل بالسسيرفر يرد لنا جوابا بالنجاح او فشل الاتصال و نحن نقرا الجواب و نخزنه في المتغير الاتي
            s = readstream.ReadLine
            Dim sendstring As String = "HELO" & "yahoo.com"
            Dim dataToSend() As Byte = Encoding.ASCII.GetBytes(sendstring)
            'الان نضيف الجواب لل لست بوكس
            lstlog.Items.Add(s)
            'الان نرسل ايميلي الى السيرفر
            sendstring = "MAIL FROM: " & "<" & txtfrom.Text & ">\r\n"
            dataToSend = Encoding.ASCII.GetBytes(sendstring)
            writestream.Write(dataToSend, 0, dataToSend.Length)
            'الان نتلقى الجواب و نضيفه لل لستبوكس
            s = readstream.ReadLine
            lstlog.Items.Add(s)
            'الان نرسل ايميل المرسل اليه الى السيرفر
            sendstring = "RCPT TO: " & "<" & txtto.Text & ">\r\n"
            dataToSend = Encoding.ASCII.GetBytes(sendstring)
            writestream.Write(dataToSend, 0, dataToSend.Length)
            'الان نتلقى الجواب و نضيفه لل لستبوكس
            s = readstream.ReadLine
            lstlog.Items.Add(s)
            'send data
            sendstring = "DATA " & "\r\n"
            dataToSend = Encoding.ASCII.GetBytes(sendstring)
            writestream.Write(dataToSend, 0, dataToSend.Length)
            'الان نتلقى الجواب و نضيفه لل لستبوكس
            s = readstream.ReadLine
            lstlog.Items.Add(s)
            'send message subject and text
            sendstring = "SUBJECT: " & txtsubject.Text & "\r\n" & txtmsg.Text & "\r\n" & "." & "\r\n"
            dataToSend = Encoding.ASCII.GetBytes(sendstring)
            writestream.Write(dataToSend, 0, dataToSend.Length)
            'الان نتلقى الجواب و نضيفه لل لستبوكس
            s = readstream.ReadLine
            lstlog.Items.Add(s)
            'send disconnect message to server
            sendstring = "QUIT " & "\r\n"
            dataToSend = Encoding.ASCII.GetBytes(sendstring)
            writestream.Write(dataToSend, 0, dataToSend.Length)
            'الان نتلقى الجواب و نضيفه لل لستبوكس
            s = readstream.ReadLine
            lstlog.Items.Add(s)
            'now close all open resource
            writestream.Close()
            readstream.Close()
            smtpserver.Close()

        Catch exc As Exception
            MsgBox(Err.Description)
        End Try
        thr.Abort()
    End Sub

    Private Sub bttnconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnconnect.Click
        Try
            oPOP.connectPOP(txtserver.Text, txtuser.Text, txtpass.Text)
        Catch exc As Exception
            MsgBox(Err.Description)
            txterror.Text = txterror.Text & oPOP.exc & vbCrLf
        End Try
    End Sub

    Private Sub bttndisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttndisconnect.Click
        Try
            oPOP.DisconnectPOP()
        Catch exc As Exception
            MsgBox(Err.Description)
            txterror.Text = txterror.Text & oPOP.exc & vbCrLf
        End Try
    End Sub

و برنامجي مرفق

و مشكلتي الان يكتب لي unable to read data

جربوه و ارجو اجابتي

اما بالنسبة للاي بي فيمكنني ان احصل عليه لاي موقع كالاتي:

Dim ip As System.Net.IPHostEntry
        ip = System.Net.Dns.GetHostByName("www.yahoo.com)

email.rar

#12

السلام عليكم

حقيقة الكود السابق هو اصله من لغة ال c#.net و قد ترجمته الى vb.net و لكن اعتقد انه غير دقيق واعتقد الكود التالي اضبط و ادق

Public Class Class1
    Dim _SMTPserverIP As String
    Private Shared _errmsg As String = ""
    Private Shared _ServerResponse As String = ""
    Shared _Identity As String = ""
    Shared _MailFrom As String = ""
    Shared _MailTO As String = ""
    Shared _Subject As String = ""
    Shared _MailData As String = ""
    Public Shared WriteOnly Property subject() As String
        Set(ByVal Value As String)
            _Subject = Value
        End Set
    End Property
    Public Shared WriteOnly Property Identity() As String
        Set(ByVal Value As String)
            _Identity = Value
        End Set
    End Property
    Public Shared WriteOnly Property MailFrom() As String
        Set(ByVal Value As String)
            _MailFrom = Value
        End Set
    End Property
    Public Shared WriteOnly Property MailTo() As String
        Set(ByVal Value As String)
            _MailTO = Value
        End Set
    End Property
    Public Shared WriteOnly Property MailData() As String
        Set(ByVal Value As String)
            _maildata = Value
        End Set
    End Property
    Public Property SMTPserverIP() As String
        Get
            Return _SMTPserverIP
        End Get
        Set(ByVal Value As String)
            _SMTPserverIP = Value
        End Set
    End Property
    Public Shared ReadOnly Property ErrMsg() As String
        Get
            Return _errmsg
        End Get
    End Property
    Public Shared ReadOnly Property ServerResponse() As String
        Get
            Return _ServerResponse
        End Get
    End Property
    Public Shared SMTPserver As String
    Dim connectionok As Boolean
    Dim responsecode() As String = {"220", "250", "354", "221"}
    Public Shared Waiting As Integer = 30
    Dim tcp As SMTPclient
    Dim stream As System.Net.Sockets.NetworkStream
    Public Sub SendMail()
        Try
            Dim bytes() As Byte
            Dim ServerResponse As String
            connectionok = False
            tcp = New SMTPclient()
            tcp.NoDelay = True
            tcp.SendTimeout = Waiting * 1000
            tcp.ReceiveTimeout = Waiting * 1000
            tcp.SendBufferSize = 1042
            tcp.Connect(_SMTPserverIP, 25)
            connectionok = True
            ServerResponse = tcp.GetServerResponse
            ServerResponse = stream.Read(bytes, 0, bytes.Length)
            If ServerResponse.StartsWith("220") = False Then
                tcp.Close()
                Return
            End If
            If SMTP(String.Concat("HELO", vbCrLf), False) = False Then
                tcp.Close()
                Return
            End If
            If SMTP(String.Concat("MAIL FROM:", _MailFrom, vbCrLf), False) = False Then
                tcp.Close()
                Return
            End If
            If SMTP(String.Concat("RCPT TO:", _MailTO, vbCrLf), True) = False Then
                tcp.Close()
                Return
            End If
            If SMTP(String.Concat("DATA:", vbCrLf), False) = False Then
                tcp.Close()
                Return
            End If
            Dim StrTemp As String = ""
            If _Identity = "" Then
                StrTemp = ""
            Else
                StrTemp = String.Concat("FROM:", _Identity, vbCrLf)
            End If
            StrTemp = String.Concat(StrTemp, "TO:", _MailTO, vbCrLf)
            StrTemp = String.Concat(StrTemp, "SUBJECT:", _Subject, vbCrLf)
            StrTemp = String.Concat(StrTemp, _MailData, vbCrLf)
            StrTemp = String.Concat(StrTemp, ".", vbCrLf)
            If SMTP(StrTemp, False) = False Then
                tcp.Close()
                Return
            End If
        Catch SE As System.Net.Sockets.SocketException
            _errmsg = SE.Message
            tcp.Close()
        Catch E As System.Exception
            _errmsg = E.Message
            tcp.Close()

        End Try

    End Sub
    Function SMTP(ByRef command As String, ByVal check As Boolean) As Boolean
        Dim ServerResponse As String
        tcp.sendcommandtoserver(command)
        ServerResponse = tcp.getserverresponse
        If check Then
            If ServerResponse.StartsWith("550") OrElse ServerResponse.StartsWith("553") Then
                Return True
            ElseIf ServerResponse.StartsWith("250" + _MailFrom) Then
                Return True
            Else : Return False

            End If
            Return True
        End If
        Dim a As Integer
        For a = 0 To responsecode.Length - 1
            If ServerResponse.StartsWith(responsecode(a)) Then
                If check = False OrElse responsecode(a) <> "221" Then
                    Exit For

                End If
            End If
        Next
        If a = responsecode.Length Then
            Return False
        End If
        Return True
    End Function
    Public Class SMTPclient
        Inherits System.Net.Sockets.TcpClient
        Public Property isConnected() As Boolean
            Get
                Return active
            End Get
            Set(ByVal Value As Boolean)
                active = Value
            End Set
        End Property
        Public Sub SendCommandToServer(ByVal command As String)
            Dim ns As System.Net.Sockets.NetworkStream = Me.GetStream
            Dim WriteBuffer() As Byte
            WriteBuffer = System.Text.Encoding.Default.GetBytes(command)
            ns.Write(WriteBuffer, 0, WriteBuffer.Length)
        End Sub
        Public Function GetServerResponse() As String
            Dim streamsize As Integer, x As String
            Dim ReadBuffer(1023) As Byte
            Dim ns As System.Net.Sockets.NetworkStream = Me.GetStream
            streamsize = ns.Read(ReadBuffer, 0, ReadBuffer.Length)
            x = System.Text.Encoding.Default.GetString(ReadBuffer)
            Return x
        End Function

    End Class
End Class

اما استعمالها فكما يلي :

Dim A As New Class1()
            A.MailFrom = txtfrom.Text
            A.MailTo = txtto.Text
            A.subject = txtsubject.Text
            A.MailData = txtmsg.Text
            Dim ip As System.Net.IPHostEntry
            ip = Dns.GetHostByName(txtsmtpserver.Text)
            A.SMTPserverIP = ip.AddressList(0).ToString
            A.SendMail()
#13

سأجرب ومشكور

Practice makes perfect 2007*

البرمجة بلا انطباعات

#15

باستخدام بروتوكول SMTP وبروتوكولات الاتصال والـ Thgreading كنت كتبت برنامجا يرسل 2 مليون بريد في الساعة!

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

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

شكرا لمن ساهموا في إثراء هذا الموضوع.

تحياتي

#17

الياهو لا يقبل أستخدام ال smtp أو pop3 سوي للمشتركين فيه يعني عشرين دولار تقريبا سنويا :( و الهوت ميل فعل مثله

أذا ما هو الحل ؟؟؟

gmail و لكنها حتي الأن لم تفتح رسميا :( و المشكلة الأكبر أنها تتعامل مع البرتكولات من منطق ال SSl :(

عمرو عيسي

#18

طيب انا مثلا عملت برنامج و اريد ان يرسل لي تقرير بين فترة واخرى كرسالة الى الايميل الا توجد طريقة لارسال تقرير الى ايميلي .. غير معقول لاتوجد طريقة بهذه اللغة الكبيرة

#19

للحوصل على خاد البريد على ياهوو:

Dim hostInfo As IPHostEntry, IP as String

hostInfo = Dns.GetHostByName("mta1.grp.scd.yahoo.com")

IP= hostInfo.AddressList(0).ToString

ihsan_ahmed:

المشكلة ليست في لغة البرمجة.. المشكلة في خادم البريد، فياهوو وهوتميل أغلقوا الطريق علينا.. لكن لو لديك خدمة بريد على موقع خاص بك، فيمكنك الإرسال عبره.. نحن نرسل البريد من موقعنا أدباء دوت كوم www.odbaa.com حيث نرسل باسم البريد odbaa@odbaa.com برمجيا بدون مشاكل، علما باننا برمجنا الموقع بـ ASP.net

#20

أيوه يا عم dreammaker ;) دعاية في نص الطريق كده ;)

#22

بسم الله الرحمن الرحيم

الاخوة الكرام لقد تم تغير نسخة المتصفح التي يمكن عرض الكتاب من خلالها لذا جرى تغيير نسخة الكتاب الى النسخة الحالية الموجودة بالمرفقات مع هذه المشاركة

smtp.zip

هذا الموضوع مغلق.

مواضيع مشابهة