массовая рассылка смс группе с помощью vb.net

Недавно я подключился к API провайдера SMS с помощью vb.net

Я создал групповую таблицу и вставил все числа в эту группу, а затем достиг каждой строки и отправил триггер API для обработки отправки. Смс не доходит до всех участников группы, оно успешно доставлено только на первый мобильный номер в группе.

Как решить эту проблему ? Я думаю, что мне нужно установить задержку между каждой отправкой, и я сделал это без толку. мой код ниже:

  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

person Dan    schedule 07.02.2013    source источник
comment
Что делают строки «Dim ExecArrayList As ArrayList ExecArrayList = SendSMS (toMobile, txtMsg, smstype)»? Кажется, что вы выделяете подпрограмму, которая не возвращает значения массиву   -  person SubtleStu    schedule 07.02.2013


Ответы (1)


Если function GetGroupsMobileNumbers() не возвращает список массивов чисел (в виде строк), закомментируйте. MobileNumbersArrayList = GetGroupsMobileNumbers() затем используйте приведенный ниже закомментированный код (с тремя вашими телефонными номерами), чтобы установить его для тестирования.

    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

Эта подпрограмма btnSend должна работать, если остальная часть вашего кода в порядке. Обратите внимание на свою линию.

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

Кажется, ничего не делает. Если вам нужно установить задержку, вам лучше превратить SendSMS в функцию, которая возвращает отправленное подтверждение в ваш цикл btnSend. Большинство текстовых API могут обрабатывать списки номеров, а не ждать ответа на каждое текстовое сообщение. В конце концов, они добавляются в очередь только в конце.

person SubtleStu    schedule 08.02.2013