发送50多封邮件导致问题导致通用故障

问题描述:

我正在开发一个应用程序,其中需要发送100多封邮件。经过几次线程后,我才知道发送邮件的限制可以在一个小时内发送,如100封邮件。为此,我将收件人列表分成块,并在每个块之间放置5秒的延迟,并在每个邮件中延迟3秒。组块之间的延迟在每个组块之后增加,当组块达到100秒时,它将重置为5秒。之后,它可以为50条消息确定,但是当我提高收件人列表时,它引起问题一些消息没有在第一时间发生,并显示为本地错误消息。发送50多封邮件导致问题导致通用故障

是否有任何标准的方式来实现这一点,我可能需要发送100+条消息,我怎样才能发送多条消息,而不会一次失败。如果我需要延迟什么应该是块或消息之间的适当延迟。

在此先感谢。

private final int MAX_SMS_IN_ONE_TIME = 10; 
private final int DELAY_BETWEEN_CHUNKS = 5000; 

public void sendMessage(arguments){ 
    // Send long messages in chunk of 20 messages and put gap of increasing 5 seconds till 50 seconds and then reset. 

    final Iterator iterator = messageChunks.iterator(); 
    new Thread(new Runnable() { 
     @Override 
     public void run(){ 

     int interval =1; 
     while (iterator.hasNext()) { 

      for (final Contact contact : 
       (List<Contact>) iterator.next()) { 

       sendSMS(body, contact.getmMobileNumbers().get(0)); 

       App.trackEvent("Message", "Sent", "Messages from our sms app"); 
      } 
     } 
     try { 
      Log.i("chunk", "chunk # " + interval + " delay is " + DELAY_BETWEEN_CHUNKS); 
      Thread.sleep(DELAY_BETWEEN_CHUNKS * interval); 
      interval++; 
      if (interval == 10) { 
       interval = 1; 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     } 
     } 
    }).start(); 
} 

public void sendSMS(final String message, final String phoneNo) { 
    try { 
     String SENT = "com.ebryx.smscustommessagegeneration"+""+System.currentTimeMillis()+""+((int)this.getmMessageId()); 
     Intent intentMessageASendStatus = new Intent(SENT); 

     final PendingIntent pi = PendingIntent.getBroadcast(App.getContext(), ((int)this.getmMessageId()), 
       intentMessageASendStatus, PendingIntent.FLAG_CANCEL_CURRENT); 
     final ArrayList<PendingIntent> sentPI = new ArrayList<PendingIntent>(){{add(pi);}}; 

     App.getContext().registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 


       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 

         Log.i("tag","sent successfully "); 
      break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 

         Log.i("tag","Generic Failure"); 
       break; 

        case SmsManager.RESULT_ERROR_NO_SERVICE: 

         Log.i("tag","No service failure"); 
      break; 

     case SmsManager.RESULT_ERROR_NULL_PDU: 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 

         Log.i("tag","Airplane mode failure"); 
         break; 
       } 
      } 
     }, new IntentFilter(SENT)); 

     final SmsManager smsManager = SmsManager.getDefault(); 
     final ArrayList<String> parts = smsManager.divideMessage(message); 

     new Timer().schedule(new TimerTask() { 
       @Override 
       public void run() { 
        smsManager.sendMultipartTextMessage(phoneNo, null, parts, sentPI, null); 

       }}, 3000); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+1

什么是您所看到的错误讯息? –

+0

@ScottNewson,我没有看到任何错误消息,但由于通用故障,很少有消息没有去。 –

+0

为什么增加发送消息之间的时间? –

您应该使用两个广播接收器,用于发送和发送未决意图。

消息传递后,您必须添加回调机制来通知消息已传递并且统计发送新消息。这个电话应该是同步

  1. 创建一个HashMap,并根据我们在下面的传递广播接收器中获得的传递状态一个接一个地发送到下面的方法。

    /** 
        * Sends an SMS message to another device 
        * 
        * @param phoneNumber Number to which msg send 
        * @param message Text message 
        */ 
    private void sendSMS(String phoneNumber, String message) { 
        // Intent Filter Tags for SMS SEND and DELIVER 
        String SENT = "SMS_SENT"; 
        String DELIVERED = "SMS_DELIVERED"; 
    // STEP-1___ 
        // SEND PendingIntent 
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
          SENT), 0); 
    
        // DELIVER PendingIntent 
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
          new Intent(DELIVERED), 0); 
    // STEP-2___ 
        // SEND BroadcastReceiver 
        BroadcastReceiver sendSMS = new BroadcastReceiver() { 
         @Override 
         public void onReceive(Context arg0, Intent arg1) { 
          switch (getResultCode()) { 
          case Activity.RESULT_OK: 
           Toast.makeText(getBaseContext(), "SMS sent", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
           Toast.makeText(getBaseContext(), "Generic failure", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_NO_SERVICE: 
           Toast.makeText(getBaseContext(), "No service", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_NULL_PDU: 
           Toast.makeText(getBaseContext(), "Null PDU", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_RADIO_OFF: 
           Toast.makeText(getBaseContext(), "Radio off",       Toast.LENGTH_SHORT).show(); 
           break; 
          } 
         } 
        }; 
    
        // DELIVERY BroadcastReceiver 
        BroadcastReceiver deliverSMS = new BroadcastReceiver() { 
         @Override 
         public void onReceive(Context arg0, Intent arg1) { 
          switch (getResultCode()) { 
          case Activity.RESULT_OK: 
           // TODO : notify from here to send new message. 
           // Add callback mechanism 
           Toast.makeText(getBaseContext(), "SMS delivered", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case Activity.RESULT_CANCELED: 
           Toast.makeText(getBaseContext(), "SMS not delivered", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          } 
         } 
        }; 
    // STEP-3___ 
        // ---Notify when the SMS has been sent--- 
        registerReceiver(sendSMS, new IntentFilter(SENT)); 
    
        // ---Notify when the SMS has been delivered--- 
        registerReceiver(deliverSMS, new IntentFilter(DELIVERED)); 
    
        SmsManager sms = SmsManager.getDefault(); 
        sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
    } 
    } 
    
  2. 您也可以删除您的HashMap元素的短信DELIVERED 这可能有助于您跟踪有多少邮件传递成功。
+0

感谢您的回答@jitesh非常感谢。但我读到另一个答案,“At&T手机不支持消息传递报告”。我已经在Lg g3和三星S5上测试过两款手机都没有提供广播接收器。所以把商业逻辑放在它上面是有风险的事情。 –

+0

同时调查我遇到有预先设定的限制,以及时发送消息,如每小时100个信息和每半个小时30个消息。为了避免这种情况,您需要根据手机并更改该限制。阅读后,我认为发送失败的消息可能是其原因是极限纠正我,如果我错了。请分享你的想法。链接是folllowing: https://*.com/questions/19079151/is-there-a-limit-to-the-number-of-numbers-to-send-an-sms –

似乎没有SMS发送限制的官方文档,从我能找到的以及以下站点。

Unfortunately似乎是从期刊 谷歌的Android开发团队没有公开的文档。我已经能够找到短信限制

这是自2017年5月17日

唯一的数字是从Commonsware的网站:

SMS Sending Limitations
在Android 1.x和2.x设备上运行的应用程序仅限于每小时发送100条SMS消息,然后 用户开始收到每条短信的提示ssage请求确认 他们确实希望发送它。

应用程序在Android 4.x的设备上运行,界限现在30条SMS 在30分钟内消息.../...

那里看来是没有办法解决增加了限制without rooting手机。您需要更改以下设置的位置。以下将允许每180000ms发送1000条SMS = 30分钟。

SMS_OUTGOING_CHECK_MAX_COUNT 1000 
SMS_OUTGOING_CHECK_INTERVAL_MS 1800000 

通常(沮丧)的Android与改变跨设备的性能也适用问题。一部电话可能与另一部电话的级别不同。

该公司已确定一些手机与他们的产品的最大SMS容量。 SMS sending limits with FrontlineSync and Android。他们还建议,可能需要根据电话来增加限制。

相关资源:

Check android package SMS limit?

is there a limit to the number of numbers to send an SMS?

Android Java: How To Send SMS & Receive SMS & Get SMS Messages 8月30日,2017年