2009-11-19 18 views
1

Pour utiliser un exemple de réponse de Google lors de l'envoi "EHLO":réponse d'analyse syntaxique se terminent par SMTP étendu (ESMTP)

250-mx.google.com at your service, [66.501.941.15] 
250-SIZE 35651584 
250-8BITMIME 
250-AUTH LOGIN PLAIN 
250-ENHANCEDSTATUSCODES 
250 PIPELINING 

Hex:

32 35 30 2D 6D 78 2E 67 6F 6F 67 6C 65 2E 63 6F 6D 20 61 74 20 79 6F 75 72 20 73 65 72 76 69 63 65 2C 20 5B 39 32 2E 34 32 31 2E 35 36 35 2E 34 32 5D 0D 0A 32 35 30 2D 53 49 5A 45 20 33 35 36 35 31 35 38 34 0D 0A 32 35 30 2D 38 42 49 54 4D 49 4D 45 0D 0A 32 35 30 2D 41 55 54 48 20 4C 4F 47 49 4E 20 50 4C 41 49 4E 0D 0A 32 35 30 2D 45 4E 48 41 4E 43 45 44 53 54 41 54 55 53 43 4F 44 45 53 0D 0A 32 35 30 20 50 49 50 45 4C 49 4E 49 4E 47 0D 0A

Puisque la spécification SMTP stipule qu'une ligne doit se terminer par un CR LF (0D 0A), nous pouvons analyser ces deux octets pour trouver des lignes, mais comment déterminer la fin de la réponse? Sur le satellite, les réponses peuvent être divisées en morceaux avec un retard significatif entre les deux. Ce signifie une réponse pourrait finir après un CR LF et ne pas être complète-à-dire:

250-mx.google.com at your service, [66.501.941.15] 
250-SIZE 35651584 
250-8BITMIME 

Toute logique qui recherche un CR LF final serait alors assumer la réponse est complète. Dans ce cas, j'utilise CryptLib pour effectuer le tunnel SLL, mais je peux créer le port avec mon propre code et le passer à la bibliothèque s'il y a un moyen d'obtenir une "fin de réponse".

Répondre

8

La réponse se termine sur la ligne où il n'y a pas de tiret entre le 250 et le nom. Donc, si le 4ème caractère de la ligne est un espace, ce sera la dernière ligne de la réponse.

De la section 4.2.1 du RFC 2821:

Le format des réponses multilignes exige que chaque ligne, à l'exception du dernier , commence par le code de réponse, suivi immédiatement par un trait d'union, "-" (également connu sous le nom de moins), suivi du texte. La dernière ligne commence par le code de réponse, suivi immédiatement par < SP>, éventuellement du texte, et < CRLF>.

+0

Ahh raté ça. Merci –

+0

Puisque tous les codes de réponse sont à 3 chiffres? Je suppose que je peux juste tester le quatrième caractère de chaque ligne pour l'absence d'un trait d'union? –

3

C'est une réponse multiligne dans le protocole SMTP (décrit dans RFC 821 Annexe E)

Vous remarquerez que la première ligne est formatée avec

CODE-FirstLine 
CODE-SecondLine 

Cependant, la dernière ligne est formatée comme si:

CODE LastLine 

Chaque ligne est délimitée par un CRLF comme vous l'avez expliqué, mais vous savez que vous êtes sur la dernière ligne d'une réponse multiligne lorsque le code et le texte ne sont pas délimités par un - (moins)

+0

Ahh raté ça. Je vous remercie –