package mireka.transmission.immediate; import mireka.smtp.EnhancedStatus; import mireka.smtp.MailSystemStatus; import mireka.smtp.SendException; import mireka.smtp.client.MtaAddress; import org.subethamail.smtp.client.SMTPException; /** * Thrown to indicate that the remote MTA returned an error message. */ public class RemoteMtaErrorResponseException extends SendException { private static final long serialVersionUID = -2886452940130526142L; private final MtaAddress remoteMta; private final MailSystemStatus remoteMtaStatus; public RemoteMtaErrorResponseException(SMTPException e, MtaAddress remoteMta) { super(e, enhancedStatusFromRemoteResponse(smtpStatusFromResponse(e))); this.remoteMta = remoteMta; this.remoteMtaStatus = smtpStatusFromResponse(e); } private static MailSystemStatus smtpStatusFromResponse(SMTPException e) { return new ResponseParser() .createResponseLookingForEnhancedStatusCode(e.getResponse()); } private static EnhancedStatus enhancedStatusFromRemoteResponse( MailSystemStatus smtpStatus) { if (smtpStatus instanceof EnhancedStatus) { return (EnhancedStatus) smtpStatus; } else if (smtpStatus instanceof Rfc821Status) { return new EnhancedStatus((Rfc821Status) smtpStatus); } else { throw new RuntimeException("Unexpected: " + smtpStatus.getClass()); } } public MtaAddress remoteMta() { return remoteMta; } /** * SMTP response sent by the remote MTA */ public MailSystemStatus remoteMtaStatus() { return remoteMtaStatus; } }