Index: /home/maurer/stuff/workspace/james-dev/src/test/org/apache/james/smtpserver/SMTPServerTest.java
===================================================================
--- /home/maurer/stuff/workspace/james-dev/src/test/org/apache/james/smtpserver/SMTPServerTest.java	(revision 393430)
+++ /home/maurer/stuff/workspace/james-dev/src/test/org/apache/james/smtpserver/SMTPServerTest.java	(working copy)
@@ -572,6 +572,25 @@
         
         smtpProtocol1.quit();
     }
+    
+    public void testHeloEnforcementDisabled() throws Exception, SMTPException {
+        m_testConfiguration.setHeloEhloEnforcement(false);
+        finishSetUp(m_testConfiguration);
+
+        SMTPProtocol smtpProtocol1 = new SMTPProtocol("127.0.0.1", m_smtpListenerPort);
+        smtpProtocol1.openPort();
+
+        assertEquals("first connection taken", 1, smtpProtocol1.getState());
+
+        // no message there, yet
+        assertNull("no mail received by mail server", m_mailServer.getLastMail());
+
+        String sender1 = "mail_sender1@localhost";
+        
+        smtpProtocol1.mail(new Address(sender1));
+        
+        smtpProtocol1.quit();
+    }
 
     public void testAuth() throws Exception, SMTPException {
         m_testConfiguration.setAuthorizedAddresses("128.0.0.1/8");
Index: /home/maurer/stuff/workspace/james-dev/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java
===================================================================
--- /home/maurer/stuff/workspace/james-dev/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java	(revision 393430)
+++ /home/maurer/stuff/workspace/james-dev/src/test/org/apache/james/smtpserver/SMTPTestConfiguration.java	(working copy)
@@ -35,6 +35,7 @@
     private boolean m_ehloResolv = false;
     private boolean m_senderDomainResolv = false;
     private boolean m_checkAuthClients = false;
+    private boolean m_heloEhloEnforcement = true;
     private int m_maxRcpt = 0;
 
     
@@ -99,6 +100,10 @@
     public void setMaxRcpt(int maxRcpt) {
         m_maxRcpt = maxRcpt; 
     }
+    
+    public void setHeloEhloEnforcement(boolean heloEhloEnforcement) {
+        m_heloEhloEnforcement = heloEhloEnforcement; 
+    }
 
     public void init() throws ConfigurationException {
 
@@ -113,6 +118,7 @@
         handlerConfig.addChild(Util.getValuedConfiguration("authorizedAddresses", m_authorizedAddresses));
         handlerConfig.addChild(Util.getValuedConfiguration("maxmessagesize", "" + m_maxMessageSize));
         handlerConfig.addChild(Util.getValuedConfiguration("authRequired", m_authorizingMode));
+        handlerConfig.addChild(Util.getValuedConfiguration("heloEhloEnforcement", m_heloEhloEnforcement+""));
         if (m_verifyIdentity) handlerConfig.addChild(Util.getValuedConfiguration("verifyIdentity", "" + m_verifyIdentity));
         
         handlerConfig.addChild(Util.createSMTPHandlerChainConfiguration());
Index: /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/MailCmdHandler.java
===================================================================
--- /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/MailCmdHandler.java	(revision 393422)
+++ /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/MailCmdHandler.java	(working copy)
@@ -105,7 +105,7 @@
         if (session.getState().containsKey(SMTPSession.SENDER)) {
             responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Sender already specified";
             session.writeResponse(responseString);
-        } else if (!session.getState().containsKey(SMTPSession.CURRENT_HELO_MODE)) {
+        } else if (!session.getState().containsKey(SMTPSession.CURRENT_HELO_MODE) && session.useHeloEhloEnforcement()) {
             responseString = "503 "+DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.DELIVERY_OTHER)+" Need HELO or EHLO before MAIL";
             session.writeResponse(responseString);
         } else if (argument == null || !argument.toUpperCase(Locale.US).equals("FROM")
Index: /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPHandler.java
===================================================================
--- /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPHandler.java	(revision 392343)
+++ /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPHandler.java	(working copy)
@@ -163,6 +163,11 @@
     private boolean relayingAllowed;
 
     /**
+     * Whether the remote Server must send HELO/EHLO 
+     */
+    private boolean heloEhloEnforcement;
+    
+    /**
      * TEMPORARY: is the sending address blocklisted
      */
     private boolean blocklisted;
@@ -273,6 +278,7 @@
             smtpID = random.nextInt(1024) + "";
             relayingAllowed = theConfigData.isRelayingAllowed(remoteIP);
             authRequired = theConfigData.isAuthRequired(remoteIP);
+            heloEhloEnforcement = theConfigData.useHeloEhloEnforcement();
             sessionEnded = false;
             resetState();
         } catch (Exception e) {
@@ -698,6 +704,12 @@
     }
 
     /**
+     * @see org.apache.james.smtpserver.SMTPSession#useHeloEhloEnforcement()
+     */
+    public boolean useHeloEhloEnforcement() {
+        return heloEhloEnforcement;
+    }
+    /**
      * @see org.apache.james.smtpserver.SMTPSession#getUser()
      */
     public String getUser() {
Index: /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPHandlerConfigurationData.java
===================================================================
--- /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPHandlerConfigurationData.java	(revision 390102)
+++ /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPHandlerConfigurationData.java	(working copy)
@@ -79,6 +79,14 @@
      * @return whether SMTP authentication is on
      */
     boolean isVerifyIdentity();
+    
+    /**
+     * Returns whether the remote server needs to send a HELO/EHLO
+     * of its senders.
+     *
+     * @return whether SMTP authentication is on
+     */
+    boolean useHeloEhloEnforcement();
 
     /**
      * Returns the MailServer interface for this service.
Index: /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPServer.java
===================================================================
--- /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPServer.java	(revision 392227)
+++ /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPServer.java	(working copy)
@@ -93,6 +93,11 @@
     private boolean verifyIdentity = false;
 
     /**
+     * Whether the server needs helo to be send first
+     */
+    private boolean heloEhloEnforcement = false;
+    
+    /**
      * This is a Network Matcher that should be configured to contain
      * authorized networks that bypass SMTP AUTH requirements.
      */
@@ -217,6 +222,10 @@
             if (getLogger().isInfoEnabled()) {
                 getLogger().info("The idle timeout will be reset every " + lengthReset + " bytes.");
             }
+            
+            heloEhloEnforcement = handlerConfiguration.getChild("heloEhloEnforcement").getValueAsBoolean();
+            
+            if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
 
             //set the logger
             ContainerUtil.enableLogging(handlerChain,getLogger());
@@ -422,6 +431,13 @@
         public UsersRepository getUsersRepository() {
             return SMTPServer.this.users;
         }
+        
+        /**
+         * @see org.apache.james.smtpserver.SMTPHandlerConfigurationData#useHeloEnforcement()
+         */
+        public boolean useHeloEhloEnforcement() {
+            return SMTPServer.this.heloEhloEnforcement;
+        }
 
     }
 }
Index: /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPSession.java
===================================================================
--- /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPSession.java	(revision 392227)
+++ /home/maurer/stuff/workspace/james-dev/src/java/org/apache/james/smtpserver/SMTPSession.java	(working copy)
@@ -184,6 +184,13 @@
      * @return authentication required or not
      */
     boolean isAuthRequired();
+    
+    /**
+     * Returns whether remote server needs to send HELO/EHLO
+     *
+     * @return HELO/EHLO required or not
+     */
+    boolean useHeloEhloEnforcement();
 
     /**
      * Returns the user name associated with this SMTP interaction.
