Index: smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
===================================================================
--- smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java	(Revision 5719)
+++ smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java	(Revision 5848)
@@ -26,7 +26,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
-
+import java.util.regex.Pattern;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.net.smtp.SMTPClient;
 import org.apache.commons.net.smtp.SMTPReply;
 import org.apache.james.protocols.api.Protocol;
@@ -45,8 +46,8 @@
 import org.apache.james.protocols.smtp.hook.MessageHook;
 import org.apache.james.protocols.smtp.hook.RcptHook;
 import org.apache.james.protocols.smtp.utils.TestMessageHook;
+import static org.junit.Assert.*;
 import org.junit.Test;
-import static org.junit.Assert.*;
 
 public abstract class AbstractSMTPServerTest {
     
@@ -105,6 +106,75 @@
     }
     
     @Test
+    public void testReceivedHeader() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        ProtocolServer server = null;
+        try {
+            server = createServer(createProtocol(hook), address);  
+            server.bind();
+            
+            SMTPClient client = createClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.helo("localhost");
+            client.setSender(SENDER);
+            client.addRecipient(RCPT1);
+            assertTrue(client.sendShortMessageData(MSG1));
+            client.quit();
+            client.disconnect();
+
+            MailEnvelope env = hook.getQueued().iterator().next();
+            List<String> lines = IOUtils.readLines(env.getMessageInputStream());
+            assertTrue("first line is Received header",
+                    lines.get(0).toLowerCase().startsWith("received:"));
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testEmptyMessageReceivedHeaderJames1547() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        ProtocolServer server = null;
+        try {
+            server = createServer(createProtocol(hook), address);  
+            server.bind();
+            
+            SMTPClient client = createClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.helo("localhost");
+            client.setSender(SENDER);
+            client.addRecipient(RCPT1);
+            assertTrue(client.sendShortMessageData(""));
+            client.quit();
+            client.disconnect();
+
+            MailEnvelope env = hook.getQueued().iterator().next();
+            List<String> lines = IOUtils.readLines(env.getMessageInputStream());
+            assertTrue("first line is Received header",
+                    Pattern.compile("^received:").matcher(lines.get(0).toLowerCase()).find());
+            assertTrue("second last line is non-empty and starts with spaces",
+                    Pattern.compile("^ +\\S+").matcher(lines.get(lines.size()-2)).find());
+            assertEquals("last line is empty", "", lines.get(lines.size()-1));
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
     public void testStartTlsNotSupported() throws Exception {
         TestMessageHook hook = new TestMessageHook();
         InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
Index: smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAddHeadersFilter.java
===================================================================
--- smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAddHeadersFilter.java	(Revision 5719)
+++ smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractAddHeadersFilter.java	(Revision 5848)
@@ -57,10 +57,17 @@
     
     @Override
     protected Response onSeparatorLine(SMTPSession session, ByteBuffer line, LineHandler<SMTPSession> next) {
+        // fallback in case there is no header line:
+        if (getLocation() == Location.Prefix && session.getAttachment(headersPrefixAdded, State.Transaction) == null) {
+            session.setAttachment(headersPrefixAdded, Boolean.TRUE, State.Transaction);
+            return addHeaders(session, line, next);
+        }
+        
         if (getLocation() == Location.Suffix && session.getAttachment(headersSuffixAdded, State.Transaction) == null) { 
             session.setAttachment(headersSuffixAdded, Boolean.TRUE, State.Transaction);
             return addHeaders(session, line, next);
         }
+        
         return super.onSeparatorLine(session, line, next);
     }
 
