- Notifications
You must be signed in to change notification settings - Fork33
mailhog/smtp
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
github.com/mailhog/smtp
implements an SMTP server state machine.
It attempts to encapsulate as much of the SMTP protocol (plus its extensions) as possiblewithout compromising configurability or requiring specific backend implementations.
proto:=NewProtocol()reply:=proto.Start()reply=proto.ProcessCommand("EHLO localhost")// ...
SeeMailHog-Server andMailHog-MTA for example implementations.
Interaction with the state machine is via:
- the
Parse
function - the
ProcessCommand
andProcessData
functions
You can mix the use of all three functions as necessary.
Parse
should be used on a raw text stream. It looks for an end of line (\r\n
), and if found, processes a single command. Any unprocessed data is returned.
If any unprocessed data is returned,Parse
should becalled again to process then next command.
text:="EHLO localhost\r\nMAIL FROM:<test>\r\nDATA\r\nTest\r\n.\r\n"varreply*smtp.Replyfor {text,reply=proto.Parse(text)iflen(text)==0 {break }}
ProcessCommand
should be used for an already parsed command (i.e., a completeSMTP "line" excluding the line ending).
ProcessData
should be used if the protocol is inDATA
state.
reply=proto.ProcessCommand("EHLO localhost")reply=proto.ProcessCommand("MAIL FROM:<test>")reply=proto.ProcessCommand("DATA")reply=proto.ProcessData("Test\r\n.\r\n")
The state machine provides hooks to manipulate its behaviour.
Hook | Description |
---|---|
LogHandler | Called for every log message |
MessageReceivedHandler | Called for each message received |
ValidateSenderHandler | Called after MAIL FROM |
ValidateRecipientHandler | Called after RCPT TO |
ValidateAuthenticationHandler | Called after AUTH |
SMTPVerbFilter | Called for every SMTP command processed |
TLSHandler | Callback mashup called after STARTTLS |
GetAuthenticationMechanismsHandler | Called for each EHLO command |
The state machine also exports variables to control its behaviour:
Variable | Description |
---|---|
RejectBrokenRCPTSyntax | Reject non-conforming RCPT syntax |
RejectBrokenMAILSyntax | Reject non-conforming MAIL syntax |
RequireTLS | Require STARTTLS before other commands |
MaximumRecipients | Maximum recipients per message |
MaximumLineLength | Maximum length of SMTP line |
Copyright © 2014-2015, Ian Kent (http://iankent.uk)
Released under MIT license, seeLICENSE for details.