package org.mailster.smtp.core.commands.impl;
import java.io.IOException;
import org.apache.mina.core.session.IoSession;
import org.mailster.smtp.api.handler.RejectException;
import org.mailster.smtp.core.SMTPContext;
import org.mailster.smtp.core.SMTPState;
import org.mailster.smtp.core.commands.AbstractCommand;
/**
* The MAIL command implementation.
*
* @author De Oliveira Edouard <doe_wanted@yahoo.fr>
* @author Ian McFarland <ian@neo.com>
* @author Jon Stevens
*/
public class MailCommand extends AbstractCommand
{
public MailCommand()
{
super("MAIL", "The MAIL FROM command specifies the sender",
"FROM: <address>\n address = the email address of the sender");
}
public void execute(String commandString, IoSession ioSession, SMTPContext ctx)
throws IOException
{
SMTPState smtpState = ctx.getSMTPState();
if (!smtpState.getHasSeenHelo())
{
sendResponse(ioSession, "503 Error: send HELO/EHLO first");
}
else if (smtpState.getHasSender())
{
sendResponse(ioSession, "503 Sender already specified");
}
else
{
if (commandString.trim().equals("MAIL FROM:"))
{
sendResponse(ioSession, "501 Syntax: MAIL FROM: <address>");
return;
}
String args = getArgPredicate(commandString);
if (!args.toUpperCase().startsWith("FROM:"))
{
sendResponse(ioSession, "501 Syntax: MAIL FROM: <address> Error in parameters: \""
+ getArgPredicate(commandString) + "\"");
return;
}
String emailAddress = extractEmailAddress(args, 5);
if (isValidEmailAddress(emailAddress))
{
try
{
ctx.getDeliveryHandler().from(emailAddress);
smtpState.setHasSender(true);
sendResponse(ioSession, "250 Ok");
}
catch (RejectException ex)
{
sendResponse(ioSession, ex.getMessage());
}
}
else
{
sendResponse(ioSession, "553 <" + emailAddress + "> Invalid email address");
}
}
}
}