One thing that can be difficult to test is email, get it wrong and at worst you can end up sending confusing and misleading emails to your clients. Its easy to get a webserver and a local copy of the database set up, but what about a local email server.
One approach is to create your own mail function, which looks at a system environment to see if it should actually send the mail or not. For instance, if it is a dev machine, ignore the mail function and write the contents of the email to log. This is OK, but it doesn’t actually test the email function until it is on live, which is arguably too late.
I have just come across a package called Dumbster. It is a java application that will sit and respond to SMTP requests, but instead of sending the email on to the recipient it holds on to it in an internal store. Bingo, we are actually testing the mail function, but the email is being contained.
To get up and running you will need Java, and Ant, and a copy of the source code. Extract the files and open up a terminal in the folder you placed the source. Run ant and you should see something like this.
$ ant Buildfile: /home/ubuntu/rjo1970-dumbster-d20b4e6/build.xml clean: [delete] Deleting directory /home/ubuntu/rjo1970-dumbster-d20b4e6/build init: [mkdir] Created dir: /home/ubuntu/rjo1970-dumbster-d20b4e6/build/classes [mkdir] Created dir: /home/ubuntu/rjo1970-dumbster-d20b4e6/build/test [mkdir] Created dir: /home/ubuntu/rjo1970-dumbster-d20b4e6/build/test/report compile: [javac] Compiling 29 source files to /home/ubuntu/rjo1970-dumbster-d20b4e6/build/classes jar: [jar] Building jar: /home/ubuntu/rjo1970-dumbster-d20b4e6/build/dumbster.jar compile-tests: [javac] Compiling 6 source files to /home/ubuntu/rjo1970-dumbster-d20b4e6/build/test test: [cobertura-instrument] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file [cobertura-instrument] Instrumenting 29 files to /home/ubuntu/rjo1970-dumbster-d20b4e6/build/instrumented [cobertura-instrument] Cobertura: Saved information on 29 classes. [cobertura-instrument] Instrument time: 174ms [junit] Running com.dumbster.smtp.MailMessageTest [junit] Tests run: 10, Failures: 0, Errors: 0, Time elapsed: 0.181 sec [junit] Flushing results... [junit] Flushing results done [junit] Cobertura: Loaded information on 29 classes. [junit] Cobertura: Saved information on 29 classes. [junit] Running com.dumbster.smtp.RequestTest [junit] Tests run: 38, Failures: 0, Errors: 0, Time elapsed: 0.079 sec [junit] Flushing results... [junit] Flushing results done [junit] Cobertura: Loaded information on 29 classes. [junit] Cobertura: Saved information on 29 classes. [junit] Running com.dumbster.smtp.RollingMailStoreTest [junit] Tests run: 7, Failures: 0, Errors: 0, Time elapsed: 0.049 sec [junit] Flushing results... [junit] Flushing results done [junit] Cobertura: Loaded information on 29 classes. [junit] Cobertura: Saved information on 29 classes. [junit] Running com.dumbster.smtp.SmtpServerTest [junit] Tests run: 10, Failures: 0, Errors: 0, Time elapsed: 1.113 sec [junit] Flushing results... [junit] Flushing results done [junit] Cobertura: Loaded information on 29 classes. [junit] Cobertura: Saved information on 29 classes. [junit] Running com.dumbster.smtp.SmtpStateTest [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.038 sec [junit] Flushing results... [junit] Flushing results done [junit] Cobertura: Loaded information on 29 classes. [junit] Cobertura: Saved information on 29 classes. [junitreport] Processing /home/ubuntu/rjo1970-dumbster-d20b4e6/build/test/report/TESTS-TestSuites.xml to /tmp/null279172976 [junitreport] Loading stylesheet jar:file:/usr/share/ant/lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl [junitreport] Transform time: 701ms [junitreport] Deleting: /tmp/null279172976 [cobertura-report] Cobertura 1.9.4.1 - GNU GPL License (NO WARRANTY) - See COPYRIGHT file [cobertura-report] Cobertura: Loaded information on 29 classes. [cobertura-report] Report time: 237ms BUILD SUCCESSFUL Total time: 10 seconds
You have now compiled the Java, and to run it use the following
java -jar build/dumbster.jar [PORT]
and substitute [PORT]
for the port you want to run it on, or leave it empty to run it on port 25, the default for SMTP.
Next make sure that your development setup is configured to use Dumbster as its SMTP server and you are good to go.
Once you have run your tests, or done what you need to do, you can have a look at what Dumbster has collected. They easiest way is to telnet into it. Once you have connected you need to be polite and say HELO
. You’re then free to inspect your email.
To see how many emails Dumbster has collected simply type LIST
into the terminal. You should see something like this.
$ telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 localhost Dumbster SMTP service ready HELO 250 OK LIST 250 There are 2 message(s).
To see an individual message you need to specify the index of the message, with the numbering starting at 0. You should see something like this.
LIST 0 250 ------------------------------------------- Subject: This is a subject Date: Tue, 14 Feb 2012 09:10:57 +0000 To: blog@ghosty.co.uk From: blog@ghosty This is an interesting test message. There are 2 message(s).
Once you are done, type the QUIT
command so that you free the server up to run more tests. The server will only allow a single connection at a time, and so if you leave your connection open, other applications will hang on the connection.
Leave a Reply