All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.subethamail.smtp.command.DataCommand Maven / Gradle / Ivy

package org.subethamail.smtp.command;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.subethamail.smtp.server.io.DeferredFileOutputStream;
import org.subethamail.smtp.server.BaseCommand;
import org.subethamail.smtp.server.ConnectionContext;
import org.subethamail.smtp.server.Session;
import org.subethamail.smtp.server.Session.Delivery;
import org.subethamail.smtp.server.io.CharTerminatedInputStream;
import org.subethamail.smtp.server.io.DotUnstuffingInputStream;

/**
 * @author Ian McFarland <[email protected]>
 * @author Jon Stevens
 */
public class DataCommand extends BaseCommand
{
    private final static char[] SMTP_TERMINATOR = { '\r', '\n', '.', '\r', '\n' };

    public DataCommand()
	{
		super("DATA",
				"Following text is collected as the message.\n"
				+ "End data with .");
	}

	@Override
	public void execute(String commandString, ConnectionContext context) throws IOException
	{
		Session session = context.getSession();

		if (session.getSender() == null)
		{
			context.sendResponse("503 Error: need MAIL command");
			return;
		}
		else if (session.getDeliveries().size() == 0)
		{
			context.sendResponse("503 Error: need RCPT command");
			return;
		}

		context.sendResponse("354 End data with .");
		session.setDataMode(true);

		InputStream stream = context.getConnection().getInput();
		stream = new BufferedInputStream(stream);
		stream = new CharTerminatedInputStream(stream, SMTP_TERMINATOR);
		stream = new DotUnstuffingInputStream(stream);

		if (session.getDeliveries().size() == 1)
		{
			Delivery delivery = session.getDeliveries().get(0);
			delivery.getListener().deliver(session.getSender(), delivery.getRecipient(), stream);
		}
		else
		{
			DeferredFileOutputStream dfos = new DeferredFileOutputStream(
					context.getServer().getDataDeferredSize());

			try
			{
				int value;
				while ((value = stream.read()) >= 0)
				{
					dfos.write(value);
				}
	
				for (Delivery delivery : session.getDeliveries())
				{
					delivery.getListener().deliver(session.getSender(), delivery.getRecipient(), dfos.getInputStream());
				}
			}
			finally
			{
				dfos.close();
			}
		}

		session.reset(true); // reset session, but don't require new HELO/EHLO
		context.sendResponse("250 Ok");
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy