简体   繁体   中英

sending bulk sms to group using vb.net

I connected recently to SMS provider API using vb.net

I have created a group table and inserted all numbers in this group and then reach each row and send trigger the API to process sending. The sms is not reached to all group members, its only delivered successfully to the first mobile number in the group.

How to solve this problem ? I think I have to set a delay between each sending and i did with no use. my code is below :

  Function GetGroupsMobileNumbers() As ArrayList
    Dim MobileNumbersArrayList As New ArrayList


    For Each Contact As FilsPayComponent.ContactAddress In FilsPayComponent.ContactAddress.GetAllContactAddressByGroupId(ddlGroup.SelectedValue)
        MobileNumbersArrayList.Add(Contact.Mobile)
    Next



    Return MobileNumbersArrayList
End Function
Protected Sub btnSend_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSend.Click

    If ddlGroup.SelectedValue = 0 Then
        lbResult.Text = "No groups selected"
        Exit Sub
    End If

    Dim MobileNumbersArrayList As ArrayList
    MobileNumbersArrayList = GetGroupsMobileNumbers()

    If MobileNumbersArrayList.Count = 0 Then

        lbResult.Text = "Group doesnt contain numbers"


        Exit Sub
    End If

    Dim TotalNo As Integer = FilsPayComponent.ContactAddress.AddressContactsCount(ddlGroup.SelectedValue)
    If MobileNumbersArrayList.Count * messagecount.Value <= FilsPayComponent.SmSUser.GetSmSUserByUserId(Context.User.Identity.Name).Balance Then



        Dim txtMsg As String
        Dim smstype As Integer

        If hidUnicode.Value <> "1" Then
            txtMsg = txtMessage.Text
            smstype = 1
        Else
            txtMsg = ConvertTextToUnicode(txtMessage.Text)

            smstype = 2
        End If
        Dim x As Integer
        'For Each Contact As FilsPayComponent.ContactAddress In FilsPayComponent.ContactAddress.GetAllContactAddressByGroupId(ddlGroup.SelectedValue)
        For Each Contact In MobileNumbersArrayList.ToArray

            Dim toMobile As String = Contact.Mobile

            If toMobile.Length > 10 Then

                Dim ExecArrayList As ArrayList
                ExecArrayList = SendSMS(toMobile, txtMsg, smstype)

                '-- give the excution more time
                If ExecArrayList.Count < 1 Then
                    Threading.Thread.Sleep(1000)
                End If
                '-- give the excution more time
                If ExecArrayList.Count < 1 Then
                    Threading.Thread.Sleep(1000)
                End If
                '-- give the excution more time
                If ExecArrayList.Count < 1 Then
                    Threading.Thread.Sleep(1000)
                End If

                x = x + 1



                '  lbresult.Text = "Sent Successfully"
            End If

        Next

        FilsPayComponent.SmSUser.RemoveSmsCredit(Context.User.Identity.Name, messagecount.Value * x)

        Dim NewsmsarchiveItem As New FilsPayComponent.smsarchive
        NewsmsarchiveItem.FromMobile = txtSenderID.Text
        NewsmsarchiveItem.ToMobile = "0"
        NewsmsarchiveItem.GroupId = ddlGroup.SelectedValue
        NewsmsarchiveItem.DateSent = DateTime.Now
        NewsmsarchiveItem.Msg = txtMessage.Text
        NewsmsarchiveItem.GroupCount = x
        NewsmsarchiveItem.Optional1 = Context.User.Identity.Name
        NewsmsarchiveItem.Optional2 = "1"


        NewsmsarchiveItem.MessageNo = messagecount.Value

        Try
            NewsmsarchiveItem.Addsmsarchive()
            lbResult.Text = "Message sent successfully"
            btnSend.Visible = False

        Catch ex As Exception
            lbResult.Text = ex.Message
        End Try

    Else

        lbResult.Text = "Not enough credit, please refill "

    End If
End Sub

Sub SendSMS(ByVal toMobile As String, ByVal txtMsg As String, ByVal smstype As Integer)
    Dim hwReq As HttpWebRequest
    Dim hwRes As HttpWebResponse

    Dim smsUser As String = "xxxxxx"
    Dim smsPassword As String = "xxxxxx"
    Dim smsSender As String = "xxxxxx"




    Dim strPostData As String = String.Format("username={0}&password={1}&destination={2}&message={3}&type={4}&dlr=1&source={5}", Server.UrlEncode(smsUser), Server.UrlEncode(smsPassword), Server.UrlEncode(toMobile), Server.UrlEncode(txtMsg), Server.UrlEncode(smstype), Server.UrlEncode(smsSender))
    Dim strResult As String = ""
    Try

        hwReq = DirectCast(WebRequest.Create("http://xxxxx:8080/bulksms/bulksms?"), HttpWebRequest)

        hwReq.Method = "POST"
        hwReq.ContentType = "application/x-www-form-urlencoded"
        hwReq.ContentLength = strPostData.Length

        Dim arrByteData As Byte() = ASCIIEncoding.ASCII.GetBytes(strPostData)
        hwReq.GetRequestStream().Write(arrByteData, 0, arrByteData.Length)

        hwRes = DirectCast(hwReq.GetResponse(), HttpWebResponse)
        If hwRes.StatusCode = HttpStatusCode.OK Then
            Dim srdrResponse As New StreamReader(hwRes.GetResponseStream(), Encoding.UTF8)
            Dim strResponse As String = srdrResponse.ReadToEnd().Trim()
            Select Case strResponse
                Case "01"
                    strResult = "success"

                    Exit Select
                Case Else
                    strResult = "Error: " + strResponse
                    Exit Select


            End Select
        End If
    Catch wex As WebException
        strResult = "Error, " + wex.Message
    Catch ex As Exception
        strResult = "Error, " + ex.Message
    Finally
        hwReq = Nothing
        hwRes = Nothing
    End Try
End Sub

If function GetGroupsMobileNumbers() does not return an array list of numbers (as Strings) then comment out. MobileNumbersArrayList = GetGroupsMobileNumbers() then use the commented out code below (with three of your own tel. numbers) to set it for testing.

    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
    If ddlGroup.SelectedValue = 0 Then
        lbResult.Text = "No groups selected"
        Exit Sub
    End If

    Dim MobileNumbersArrayList As New ArrayList
    MobileNumbersArrayList = GetGroupsMobileNumbers()

    'MobileNumbersArrayList.Add("07702123456")
    'MobileNumbersArrayList.Add("07702123457")
    'MobileNumbersArrayList.Add("07702123458")



    If MobileNumbersArrayList.Count = 0 Then

        lbResult.Text = "Group doesnt contain numbers"
        Exit Sub
    End If

    Dim TotalNo As Integer = FilsPayComponent.ContactAddress.AddressContactsCount(ddlGroup.SelectedValue)

    If MobileNumbersArrayList.Count * messagecount.Value <= FilsPayComponent.SmSUser.GetSmSUserByUserId(Context.User.Identity.Name).Balance Then
        Dim txtMsg As String
        Dim smstype As Integer

        If hidUnicode.Value <> "1" Then
            txtMsg = txtMessage.Text
            smstype = 1
        Else
            txtMsg = ConvertTextToUnicode(txtMessage.Text)
            smstype = 2
        End If

        Dim x As Integer
        For Each Contact In MobileNumbersArrayList
            If Contact.Length > 10 Then
                SendSMS(Contact, txtMsg, smstype)
                x = x + 1
            End If

        Next

        FilsPayComponent.SmSUser.RemoveSmsCredit(Context.User.Identity.Name, messagecount.Value * x)

        Dim NewsmsarchiveItem As New FilsPayComponent.smsarchive
        NewsmsarchiveItem.FromMobile = txtSenderID.Text
        NewsmsarchiveItem.ToMobile = "0"
        NewsmsarchiveItem.GroupId = ddlGroup.SelectedValue
        NewsmsarchiveItem.DateSent = DateTime.Now
        NewsmsarchiveItem.Msg = txtMessage.Text
        NewsmsarchiveItem.GroupCount = x
        NewsmsarchiveItem.Optional1 = Context.User.Identity.Name
        NewsmsarchiveItem.Optional2 = "1"


        NewsmsarchiveItem.MessageNo = messagecount.Value

        Try
            NewsmsarchiveItem.Addsmsarchive()
            lbResult.Text = "Message sent successfully"
            btnSend.Visible = False

        Catch ex As Exception
            lbResult.Text = ex.Message
        End Try

    Else

        lbResult.Text = "Not enough credit, please refill "

    End If
End Sub

This btnSend sub should work if the rest of your code is okay. Note your line.

Dim TotalNo As Integer = FilsPayComponent.ContactAddress.AddressContactsCount(ddlGroup.SelectedValue)

Doesn't appear to do anything. If you need to set a delay you would be better off turning SendSMS into a function that returns a sent confirmation to your btnSend loop. Most texting APIs can handle lists of numbers rather than waiting for a response for each text message. Afterall they only get added to a queue at their end.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM