📄 smtpservertest.java
字号:
String userName = "test_user_smtp"; m_usersRepository.addUser(userName, "pwd"); smtpProtocol.setSender(""); smtpProtocol.sendCommand("AUTH PLAIN"); smtpProtocol.sendCommand(Base64.encodeAsString("\0"+userName+"\0pwd\0")); assertEquals("authenticated", 235, smtpProtocol.getReplyCode()); smtpProtocol.addRecipient("mail@sample.com"); assertEquals("expected error", 503, smtpProtocol.getReplyCode()); smtpProtocol.quit(); } public void testNoRecepientSpecified() throws Exception { finishSetUp(m_testConfiguration); SMTPClient smtpProtocol = new SMTPClient(); smtpProtocol.connect("127.0.0.1", m_smtpListenerPort); smtpProtocol.sendCommand("ehlo "+InetAddress.getLocalHost()); smtpProtocol.setSender("mail@sample.com"); // left out for test smtpProtocol.rcpt(new Address("mail@localhost")); smtpProtocol.sendShortMessageData("Subject: test\r\n\r\nTest body\r\n"); assertTrue("sending succeeded without recepient", SMTPReply.isNegativePermanent(smtpProtocol.getReplyCode())); smtpProtocol.quit(); // mail was propagated by SMTPServer assertNull("no mail received by mail server", m_mailServer.getLastMail()); } public void testMultipleMailsAndRset() throws Exception { finishSetUp(m_testConfiguration); SMTPClient smtpProtocol = new SMTPClient(); smtpProtocol.connect("127.0.0.1", m_smtpListenerPort); smtpProtocol.sendCommand("ehlo "+InetAddress.getLocalHost()); smtpProtocol.setSender("mail@sample.com"); smtpProtocol.reset(); smtpProtocol.setSender("mail@sample.com"); smtpProtocol.quit(); // mail was propagated by SMTPServer assertNull("no mail received by mail server", m_mailServer.getLastMail()); } public void testRelayingDenied() throws Exception { m_testConfiguration.setAuthorizedAddresses("128.0.0.1/8"); finishSetUp(m_testConfiguration); SMTPClient smtpProtocol = new SMTPClient(); smtpProtocol.connect("127.0.0.1", m_smtpListenerPort); smtpProtocol.sendCommand("ehlo "+InetAddress.getLocalHost()); smtpProtocol.setSender("mail@sample.com"); smtpProtocol.addRecipient("maila@sample.com"); assertEquals("expected 550 error", 550, smtpProtocol.getReplyCode()); } public void testHandleAnnouncedMessageSizeLimitExceeded() throws Exception { m_testConfiguration.setMaxMessageSize(1); // set message limit to 1kb finishSetUp(m_testConfiguration); SMTPClient smtpProtocol = new SMTPClient(); smtpProtocol.connect("127.0.0.1", m_smtpListenerPort); smtpProtocol.sendCommand("ehlo "+InetAddress.getLocalHost()); smtpProtocol.sendCommand("MAIL FROM:<mail@localhost> SIZE=1025", null); assertEquals("expected error: max msg size exceeded", 552, smtpProtocol.getReplyCode()); smtpProtocol.addRecipient("mail@localhost"); assertEquals("expected error", 503, smtpProtocol.getReplyCode()); } public void testHandleMessageSizeLimitExceeded() throws Exception { m_testConfiguration.setMaxMessageSize(1); // set message limit to 1kb finishSetUp(m_testConfiguration); SMTPClient smtpProtocol = new SMTPClient(); smtpProtocol.connect("127.0.0.1", m_smtpListenerPort); smtpProtocol.sendCommand("ehlo "+InetAddress.getLocalHost()); smtpProtocol.setSender("mail@localhost"); smtpProtocol.addRecipient("mail@localhost"); Writer wr = smtpProtocol.sendMessageData(); // create Body with more than 1kb . 502 wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100\r\n"); // second line wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("123456781012345678201\r\n"); // 521 + CRLF = 523 + 502 => 1025 wr.close(); assertFalse(smtpProtocol.completePendingCommand()); assertEquals("expected 552 error", 552, smtpProtocol.getReplyCode()); } public void testHandleMessageSizeLimitRespected() throws Exception { m_testConfiguration.setMaxMessageSize(1); // set message limit to 1kb finishSetUp(m_testConfiguration); SMTPClient smtpProtocol = new SMTPClient(); smtpProtocol.connect("127.0.0.1", m_smtpListenerPort); smtpProtocol.sendCommand("ehlo "+InetAddress.getLocalHost()); smtpProtocol.setSender("mail@localhost"); smtpProtocol.addRecipient("mail@localhost"); Writer wr = smtpProtocol.sendMessageData(); // create Body with less than 1kb wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012345678301234567840123456785012345678601234567870123456788012345678901234567100"); wr.write("1234567810123456782012\r\n"); // 1022 + CRLF = 1024 wr.close(); assertTrue(smtpProtocol.completePendingCommand()); assertEquals("expected 250 ok", 250, smtpProtocol.getReplyCode()); } /* What we want to see is that for a given connection limit and a given backlog, that connection limit requests are handled, and that up to the backlog number of connections are queued. More connections than that would eventually error out (unless space connections than that should error out until space opens up in the queue. For example: # telnet localhost <m_smtpListenPort> Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refused is the immediate response if the backlog is full. */ public void testConnectionLimitExceeded() throws Exception { final int acceptLimit = 1; final int backlog = 1; m_testConfiguration.setConnectionLimit(acceptLimit); // allow no more than <acceptLimit> connection(s) in the service m_testConfiguration.setConnectionBacklog(backlog); // allow <backlog> additional connection(s) in the queue finishSetUp(m_testConfiguration); final SMTPClient[] client = new SMTPClient[acceptLimit]; for (int i = 0; i < client.length; i++) { client[i] = new SMTPClient(); // should connect to worker try { client[i].connect("127.0.0.1", m_smtpListenerPort); } catch (Exception _) { } assertTrue("client #" + (i+1) + " established", client[i].isConnected()); } // Cannot use SMTPClient. It appears that even though the // client's socket is established, since the client won't be // able to connect to the protocol handler, the connect call // hangs. // Different TCP/IP stacks may provide a "grace" margin above // and beyond the specified backlog. So we won't try to be // precise. Instead we will compute some upper limit, loop // until we get a connection error (or hit the limit), and // then test for the expected behavior. // // See: http://www.phrack.org/archives/48/P48-13 final Socket connection[] = new Socket[Math.max(((backlog * 3) / 2) + 1, backlog + 3)]; final java.net.SocketAddress server = new java.net.InetSocketAddress("localhost", m_smtpListenerPort); for (int i = 0; i < connection.length; i++) { connection[i] = new Socket(); try { connection[i].connect(server, 1000); } catch (Exception _) { assertTrue("Accepted connections " + i + " did not meet or exceed backlog of " + backlog + ".", i >= backlog); connection[i] = null; // didn't open, so don't try to close later break; // OK to fail, since we've at least reached the backlog } assertTrue("connection #" + (i+1) + " established", connection[i].isConnected()); } try { final Socket shouldFail = new Socket(); shouldFail.connect(server, 1000); fail("connection # " + (client.length + connection.length + 1) + " did not fail."); } catch (Exception _) { } client[0].quit(); client[0].disconnect(); Thread.sleep(100); // now should be able to connect (backlog) try { final Socket shouldWork = new Socket(); shouldWork.connect(server, 1000); assertTrue("Additional connection established after close.", shouldWork.isConnected()); shouldWork.close(); } catch (Exception e) { fail("Could not establish additional connection after close." + e.getMessage()); } // close the pending connections first, so that the server doesn't see them for (int i = 0; i < connection.length; i++) if (connection[i] != null) connection[i].close(); // close the remaining clients for (int i = 1; i < client.length; i++) { client[i].quit(); client[i].disconnect(); } } // RemoteDelivery tests. InMemorySpoolRepository outgoingSpool; private MockServiceManager m_serviceManager; private Properties getStandardParameters() { Properties parameters = new Properties(); parameters.put("delayTime", "500 msec, 500 msec, 500 msec"); // msec, sec, minute, hour parameters.put("maxRetries", "3"); parameters.put("deliveryThreads", "1"); parameters.put("debug", "true"); parameters.put("sendpartial", "false"); parameters.put("bounceProcessor", "bounce"); parameters.put("outgoing", "mocked://outgoing/"); return parameters; } /** * This has been created to test javamail 1.4 introduced bug. * http://issues.apache.org/jira/browse/JAMES-490 */ public void testDeliveryToSelfWithGatewayAndBind() throws Exception { finishSetUp(m_testConfiguration); outgoingSpool = new InMemorySpoolRepository(); ((MockStore) m_serviceManager.lookup(Store.ROLE)).add("outgoing", outgoingSpool); RemoteDelivery rd = new RemoteDelivery(); MockMailContext mmc = new MockMailContext(); mmc.setAttribute(Constants.AVALON_COMPONENT_MANAGER,m_serviceManager); mmc.setAttribute(Constants.HELLO_NAME,"localhost"); MockMailetConfig mci = new MockMailetConfig("Test",mmc,getStandardParameters()); mci.setProperty("bind", "127.0.0.1"); mci.setProperty("gateway","127.0.0.1"); mci.setProperty("gatewayPort",""+m_smtpListenerPort); rd.init(mci); String sources = "Content-Type: text/plain;\r\nSubject: test\r\n\r\nBody"; String sender = "test@localhost"; String recipient = "test@localhost"; MimeMessage mm = new MimeMessage(Session.getDefaultInstance(new Properties()),new ByteArrayInputStream(sources.getBytes())); MailImpl mail = new MailImpl("name",new MailAddress(sender),Arrays.asList(new MailAddress[] {new MailAddress(recipient)}),mm); rd.service(mail); while (outgoingSpool.size() > 0) { Thread.sleep(1000); } verifyLastMail(sender, recipient, null); assertEquals(((String) mm.getContent()).trim(),((String) ((MimeMessage) m_mailServer.getLastMail()[2]).getContent()).trim()); mail.dispose(); } /** * This is useful code to run tests on javamail bugs * http://issues.apache.org/jira/browse/JAMES-52 * * This * @throws Exception */ public void test8bitmimeFromStream() throws Exception { finishSetUp(m_testConfiguration); outgoingSpool = new InMemorySpoolRepository(); ((MockStore) m_serviceManager.lookup(Store.ROLE)).add("outgoing", outgoingSpool); RemoteDelivery rd = new RemoteDelivery(); MockMailContext mmc = new MockMailContext(); mmc.setAttribute(Constants.AVALON_COMPONENT_MANAGER,m_serviceManager); mmc.setAttribute(Constants.HELLO_NAME,"localhost"); MockMailetConfig mci = new MockMailetConfig("Test",mmc,getStandardParameters()); mci.setProperty("gateway","127.0.0.1"); mci.setProperty("gatewayPort",""+m_smtpListenerPort); rd.init(mci); String sources = "Content-Type: text/plain;\r\nContent-Transfer-Encoding: quoted-printable\r\nSubject: test\r\n\r\nBody=80\r\n"; //String sources = "Content-Type: text/plain; charset=iso-8859-15\r\nContent-Transfer-Encoding: quoted-printable\r\nSubject: test\r\n\r\nBody=80\r\n"; //String sources = "Content-Type: text/plain; charset=iso-8859-15\r\nContent-Transfer-Encoding: 8bit\r\nSubject: test\r\n\r\nBody\u20AC\r\n"; String sender = "test@localhost"; String recipient = "test@localhost"; MimeMessage mm = new MimeMessage(Session.getDefaultInstance(new Properties()),new ByteArrayInputStream(sources.getBytes())); MailImpl mail = new MailImpl("name",new MailAddress(sender),Arrays.asList(new MailAddress[] {new MailAddress(recipient)}),mm); rd.service(mail); while (outgoingSpool.size() > 0) { Thread.sleep(1000); } // verifyLastMail(sender, recipient, mm); verifyLastMail(sender, recipient, null); // THIS WOULD FAIL BECAUSE OF THE JAVAMAIL BUG // assertEquals(mm.getContent(),((MimeMessage) m_mailServer.getLastMail()[2]).getContent()); mail.dispose(); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -