2016-10-11 2 views
1

Ich habe kürzlich versucht, meine Hände in der neuen Google Mail-API auszuprobieren. Und alles scheint gut zu funktionieren, außer einer Sache. Mein Problem ist wie folgt:Gmail-API sendet E-Mails, aber einige werden nie empfangen

Ich arbeite an einem Rezeptionist Projekt, das möglicherweise mehr als eine E-Mail in weniger als einer Minute während der geschäftigen Stunden generieren muss. Also nur zu Testzwecken betreibe ich den folgenden Code, der gut arbeitet:

if __name__ == '__main__': 
    service = setup()  //Simply an helper function to do the basic credential check. Works fine! 
    print('service:'+str(service)) 

    for counter in range(1, 10): 
    print('Sending message '+ str(counter)) 
    message = create_message(<SENDER_EMAIL_ID>,<RECEIVER_EMAIL_ID>, "Email Number: "+ str(counter) , "Sample text") 
    response = send_message(service, 'me' , message) 
    print(response) 

Das Setup() Funktion ist wie folgt:

credentials = get_credentials() 
http = credentials.authorize(httplib2.Http()) 
service = discovery.build('gmail', 'v1', http=http) 

Nun, wenn ich den Code ausführen sagen dreimal hintereinander in weniger als eine Minute, der Code läuft gut und ich bin in der Lage, alle 27 E-Mails im gesendeten Ordner der SENDER_EMAIL_ID mit einem Webbrowser zu sehen. Daher sendet die Google Mail-API alle Nachrichten, wenn eine Anfrage gesendet wird. Jedoch werden nur einige dieser E-Mails an der RECEIVER_EMAIL_ID empfangen und der Rest wird gerade gelöscht.

Wenn ich jedoch das Programm mit sagen 2-5 Minuten Verzögerung ausführen, dann werden alle E-Mails empfangen.

Ich habe keine Ahnung, warum das ist.

Jede Hilfe würde wirklich geschätzt werden. :)

+0

Ich kann mir vorstellen, dass die API eine Art Soft-Rate-Limiting verwendet, also würde ich vorschlagen, die "Antwort" beim Aufruf von 'send_message()' gegenüber der 'Antwort' für spätere Aufrufe von' zu vergleichen get_message() ', und sehen Sie, wie sich die Antworten zwischen sofort gesendeten, verzögerten und gelöschten E-Mails unterscheiden. –

+0

Es tut mir leid, hätte ich erwähnen sollen. Ich überprüfe die empfangenen Mails direkt mit einem Browser. Also benutze ich einfach send_message(). Auch die Antwort, die ich für jede Anfrage bekomme, ist wie folgt: 'Gesendete Nachricht: {u'labelIds ': [u'SENT'], u'id ': u'157bce1438e5db28', u'threadId ': u'157bce1438e5db28 '} ' –

+0

Es gibt also keine Fehler in Ihrer Antwort. Es wird eine [Users.messages-Ressource] (https://developers.google.com/gmail/api/v1/reference/users/messages#resource) zurückgegeben) für alle Elemente auf der Schleife, aber nur einige wurden vom Empfänger empfangen? Was meinst du mit "fallengelassen" - Senden fehlgeschlagen? – adjuremods

Antwort

1

Um mehr auf @ ken-y-n's Antwort in den Kommentaren zu erklären, hat GMail API usage limits. Speziell für dieses Produkt ist die tägliche Nutzung über

  • 1 Milliarde Quote Einheiten/Tag
  • 250 Quoteneinheiten/user/Sekunde

Sie die während des Tests rateLimitExceeded Fehler aufgetreten haben.

Da Sie E-Mails über eine Schleife senden, werden Sie beim Aufruf von send ungefähr 100 Einheiten kosten (zuzüglich anderer Kosten, die von den Methoden abhängen, die Sie anrufen). Dies ist der Grund, warum einige E-Mails gelöscht wurden. Sie können dem entgegenwirken, indem Sie exponentielle Backoffs für die Nachrichten implementieren, die nicht gesendet werden konnten.

Eine andere Alternative, anstatt es durch eine Schleife zu betreiben, ist die Verwendung von Batch requests, die Ihre API-Aufrufe zusammenfasst, um die Anzahl der HTTP-Verbindungen Ihrer App zu reduzieren.

+0

Danke dafür! Ich werde die Kontingentgrenzen prüfen. Trotzdem wollte ich bestätigen, dass es normal ist, alle diese Serien-E-Mails im gesendeten Ordner mit einem Browser für die SENDER_EMAIL_ID zu sehen. Wie ich bereits erwähnt habe, habe ich keine andere Antwort auf die E-Mails erhalten, die gelöscht wurden. Meine Antwort für alle Abfragen war wie folgt: 'Gesendete Nachricht: {u'labelIds ': [u'SENT'], u'id ': u'157bce1438e5db28', u'threadId ': u'157bce1438e5db28'} ' –

Verwandte Themen