diff --git a/src/com/fsck/k9/mail/transport/SmtpDataStuffing.java b/src/com/fsck/k9/mail/transport/SmtpDataStuffing.java new file mode 100644 index 000000000..110042028 --- /dev/null +++ b/src/com/fsck/k9/mail/transport/SmtpDataStuffing.java @@ -0,0 +1,43 @@ +package com.fsck.k9.mail.transport; + +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +public class SmtpDataStuffing extends FilterOutputStream +{ + private static final int STATE_NORMAL = 0; + private static final int STATE_CR = 1; + private static final int STATE_CRLF = 2; + + private int state = STATE_NORMAL; + + public SmtpDataStuffing(OutputStream out) + { + super(out); + } + + @Override + public void write(int oneByte) throws IOException + { + if (oneByte == '\r') + { + state = STATE_CR; + } + else if ((state == STATE_CR) && (oneByte == '\n')) + { + state = STATE_CRLF; + } + else if ((state == STATE_CRLF) && (oneByte == '.')) + { + // Read so this line needs an additional period. + super.write('.'); + state = STATE_NORMAL; + } + else + { + state = STATE_NORMAL; + } + super.write(oneByte); + } +} diff --git a/src/com/fsck/k9/mail/transport/SmtpTransport.java b/src/com/fsck/k9/mail/transport/SmtpTransport.java index c433d2f21..a7b15f7d7 100644 --- a/src/com/fsck/k9/mail/transport/SmtpTransport.java +++ b/src/com/fsck/k9/mail/transport/SmtpTransport.java @@ -317,9 +317,9 @@ public class SmtpTransport extends Transport message.setRecipients(RecipientType.BCC, null); executeSimpleCommand("DATA"); - //TODO: Data stuffing (RFC 821 4.5.2.) EOLConvertingOutputStream msgOut = new EOLConvertingOutputStream( - new BufferedOutputStream(mOut, 1024)); + new SmtpDataStuffing( + new BufferedOutputStream(mOut, 1024))); message.writeTo(msgOut);