/// <summary> /// Send the data to the server /// </summary> /// <param name="data">Data to send to the server</param> /// <param name="failedCallback">Action to call if fails to send.</param> private async Task <MantaOutboundClientSendResult> ExecDataAsync(string data) { await SmtpStream.WriteLineAsync("DATA"); string response = await SmtpStream.ReadAllLinesAsync(); // Data response or Mail From if pipelining // If the remote MX supports pipelining then we need to check the MAIL FROM and RCPT to responses. if (_CanPipeline) { // Check MAIL FROM OK. if (!response.StartsWith("250")) { await SmtpStream.ReadAllLinesAsync(); // RCPT TO await SmtpStream.ReadAllLinesAsync(); // DATA return(new MantaOutboundClientSendResult(MantaOutboundClientResult.RejectedByRemoteServer, response, _VirtualMta, _MXRecord)); } // Check RCPT TO OK. response = await SmtpStream.ReadAllLinesAsync(); if (!response.StartsWith("250")) { await SmtpStream.ReadAllLinesAsync(); // DATA return(new MantaOutboundClientSendResult(MantaOutboundClientResult.RejectedByRemoteServer, response, _VirtualMta, _MXRecord)); } // Get the Data Command response. response = await SmtpStream.ReadAllLinesAsync(); } if (!response.StartsWith("354")) { return(new MantaOutboundClientSendResult(MantaOutboundClientResult.RejectedByRemoteServer, response, _VirtualMta, _MXRecord)); } // Send the message data using the correct transport MIME SmtpStream.SetSmtpTransportMIME(_DataTransportMime); await SmtpStream.WriteAsync(data, false); await SmtpStream.WriteAsync(MtaParameters.NewLine + "." + MtaParameters.NewLine, false); // Data done so return to 7-Bit mode. SmtpStream.SetSmtpTransportMIME(SmtpTransportMIME._7BitASCII); response = await SmtpStream.ReadAllLinesAsync(); if (!response.StartsWith("250")) { return(new MantaOutboundClientSendResult(MantaOutboundClientResult.RejectedByRemoteServer, response, _VirtualMta, _MXRecord)); } _MessagesAccepted++; return(new MantaOutboundClientSendResult(MantaOutboundClientResult.Success, response, _VirtualMta, _MXRecord)); }
/// <summary> /// Send the data to the server /// </summary> /// <param name="data">Data to send to the server</param> /// <param name="failedCallback">Action to call if fails to send.</param> public async Task <bool> ExecDataAsync(string data, Action <string> failedCallback, Func <string, Task> successCallbackAsync) { if (!base.Connected) { return(false); } _LastActive = DateTime.UtcNow; IsActive = true; await SmtpStream.WriteLineAsync("DATA"); string response = await SmtpStream.ReadAllLinesAsync(); // If the remote MX supports pipelining then we need to check the MAIL FROM and RCPT to responses. if (_CanPipeline) { // Check MAIL FROM OK. if (!response.StartsWith("250")) { failedCallback(response); IsActive = false; return(false); } // Check RCPT TO OK. response = await SmtpStream.ReadAllLinesAsync(); if (!response.StartsWith("250")) { failedCallback(response); IsActive = false; return(false); } // Get the Data Command response. response = await SmtpStream.ReadAllLinesAsync(); } _LastActive = DateTime.UtcNow; if (!response.StartsWith("354")) { failedCallback(response); IsActive = false; return(false); } // Increment the data commands as server has responded positiely. _DataCommands++; // Send the message data using the correct transport MIME SmtpStream.SetSmtpTransportMIME(_DataTransportMime); await SmtpStream.WriteAsync(data, false); await SmtpStream.WriteAsync(MtaParameters.NewLine + "." + MtaParameters.NewLine, false); _LastActive = DateTime.UtcNow; // Data done so return to 7-Bit mode. SmtpStream.SetSmtpTransportMIME(SmtpTransportMIME._7BitASCII); response = await SmtpStream.ReadAllLinesAsync(); _LastActive = DateTime.UtcNow; IsActive = false; if (!response.StartsWith("250")) { failedCallback(response); } else { await successCallbackAsync(response); } // If max messages have been sent quit the connection. if (_DataCommands >= OutboundRuleManager.GetMaxMessagesPerConnection(MXRecord, MtaIpAddress)) { ExecQuitAsync().Wait(); } return(true); }