Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Net / System / Net / Mail / SmtpCommands.cs / 1 / SmtpCommands.cs
namespace System.Net.Mail { using System; using System.Collections; using System.Globalization; using System.Text; using System.IO; using System.Net.Mime; static class CheckCommand { static AsyncCallback onReadLine = new AsyncCallback(OnReadLine); static AsyncCallback onWrite = new AsyncCallback(OnWrite); internal static IAsyncResult BeginSend(SmtpConnection conn, AsyncCallback callback, object state) { MultiAsyncResult multiResult = new MultiAsyncResult(conn, callback, state); multiResult.Enter(); IAsyncResult writeResult = conn.BeginFlush(onWrite, multiResult); if (writeResult.CompletedSynchronously) { conn.EndFlush(writeResult); multiResult.Leave(); } SmtpReplyReader reader = conn.Reader.GetNextReplyReader(); multiResult.Enter(); //this actually does a read on the stream. IAsyncResult result = reader.BeginReadLine(onReadLine, multiResult); if (result.CompletedSynchronously){ LineInfo info = reader.EndReadLine(result); if (!(multiResult.Result is Exception)) multiResult.Result = info; multiResult.Leave(); } multiResult.CompleteSequence(); return multiResult; } internal static object EndSend(IAsyncResult result, out string response) { object commandResult = MultiAsyncResult.End(result); if (commandResult is Exception) throw (Exception)commandResult; LineInfo info = (LineInfo)commandResult; response = info.Line; return info.StatusCode; } static void OnReadLine(IAsyncResult result) { if (!result.CompletedSynchronously) { MultiAsyncResult multiResult = (MultiAsyncResult)result.AsyncState; try { SmtpConnection conn = (SmtpConnection)multiResult.Context; LineInfo info = conn.Reader.CurrentReader.EndReadLine(result); if (!(multiResult.Result is Exception)) multiResult.Result = info; multiResult.Leave(); } catch (Exception e) { multiResult.Leave(e); } catch { multiResult.Leave(new Exception(SR.GetString(SR.net_nonClsCompliantException))); } } } static void OnWrite(IAsyncResult result) { if (!result.CompletedSynchronously) { MultiAsyncResult multiResult = (MultiAsyncResult)result.AsyncState; try { SmtpConnection conn = (SmtpConnection)multiResult.Context; conn.EndFlush(result); multiResult.Leave(); } catch (Exception e) { multiResult.Leave(e); } catch { multiResult.Leave(new Exception(SR.GetString(SR.net_nonClsCompliantException))); } } } internal static SmtpStatusCode Send(SmtpConnection conn, out string response) { conn.Flush(); SmtpReplyReader reader = conn.Reader.GetNextReplyReader(); LineInfo info = reader.ReadLine(); response = info.Line; reader.Close(); return info.StatusCode; } } static class ReadLinesCommand { static AsyncCallback onReadLines = new AsyncCallback(OnReadLines); static AsyncCallback onWrite = new AsyncCallback(OnWrite); internal static IAsyncResult BeginSend(SmtpConnection conn, AsyncCallback callback, object state) { MultiAsyncResult multiResult = new MultiAsyncResult(conn, callback, state); multiResult.Enter(); IAsyncResult writeResult = conn.BeginFlush(onWrite, multiResult); if (writeResult.CompletedSynchronously) { conn.EndFlush(writeResult); multiResult.Leave(); } SmtpReplyReader reader = conn.Reader.GetNextReplyReader(); multiResult.Enter(); IAsyncResult readLinesResult = reader.BeginReadLines(onReadLines, multiResult); if (readLinesResult.CompletedSynchronously) { LineInfo[] lines = conn.Reader.CurrentReader.EndReadLines(readLinesResult); if (!(multiResult.Result is Exception)) multiResult.Result = lines; multiResult.Leave(); } multiResult.CompleteSequence(); return multiResult; } internal static LineInfo[] EndSend(IAsyncResult result) { object commandResult = MultiAsyncResult.End(result); if (commandResult is Exception) throw (Exception)commandResult; return (LineInfo[])commandResult; } static void OnReadLines(IAsyncResult result) { if (!result.CompletedSynchronously) { MultiAsyncResult multiResult = (MultiAsyncResult)result.AsyncState; try { SmtpConnection conn = (SmtpConnection)multiResult.Context; LineInfo[] lines = conn.Reader.CurrentReader.EndReadLines(result); if (!(multiResult.Result is Exception)) multiResult.Result = lines; multiResult.Leave(); } catch (Exception e) { multiResult.Leave(e); } catch { multiResult.Leave(new Exception(SR.GetString(SR.net_nonClsCompliantException))); } } } static void OnWrite(IAsyncResult result) { if (!result.CompletedSynchronously) { MultiAsyncResult multiResult = (MultiAsyncResult)result.AsyncState; try { SmtpConnection conn = (SmtpConnection)multiResult.Context; conn.EndFlush(result); multiResult.Leave(); } catch (Exception e) { multiResult.Leave(e); } catch { multiResult.Leave(new Exception(SR.GetString(SR.net_nonClsCompliantException))); } } } internal static LineInfo[] Send(SmtpConnection conn) { conn.Flush(); return conn.Reader.GetNextReplyReader().ReadLines(); } } static class AuthCommand { internal static IAsyncResult BeginSend(SmtpConnection conn, string type, string message, AsyncCallback callback, object state) { PrepareCommand(conn, type, message); return ReadLinesCommand.BeginSend(conn, callback, state); } internal static IAsyncResult BeginSend(SmtpConnection conn, string message, AsyncCallback callback, object state) { PrepareCommand(conn, message); return ReadLinesCommand.BeginSend(conn, callback, state); } static LineInfo CheckResponse(LineInfo[] lines) { if (lines == null || lines.Length == 0) { throw new SmtpException(SR.GetString(SR.SmtpAuthResponseInvalid)); } System.Diagnostics.Debug.Assert(lines.Length == 1, "Did not expect more than one line response for auth command"); return lines[0]; } internal static LineInfo EndSend(IAsyncResult result) { return CheckResponse(ReadLinesCommand.EndSend(result)); } static void PrepareCommand(SmtpConnection conn, string type, string message) { conn.BufferBuilder.Append(SmtpCommands.Auth); conn.BufferBuilder.Append(type); conn.BufferBuilder.Append((byte)' '); conn.BufferBuilder.Append(message); conn.BufferBuilder.Append(SmtpCommands.CRLF); } static void PrepareCommand(SmtpConnection conn, string message) { conn.BufferBuilder.Append(message); conn.BufferBuilder.Append(SmtpCommands.CRLF); } internal static LineInfo Send(SmtpConnection conn, string type, string message) { PrepareCommand(conn, type, message); return CheckResponse(ReadLinesCommand.Send(conn)); } internal static LineInfo Send(SmtpConnection conn, string message) { PrepareCommand(conn, message); return CheckResponse(ReadLinesCommand.Send(conn)); } } static class DataCommand { internal static IAsyncResult BeginSend(SmtpConnection conn, AsyncCallback callback, object state) { PrepareCommand(conn); return CheckCommand.BeginSend(conn, callback, state); } static void CheckResponse(SmtpStatusCode statusCode, string serverResponse) { switch (statusCode) { case SmtpStatusCode.StartMailInput: { return; } case SmtpStatusCode.LocalErrorInProcessing: case SmtpStatusCode.TransactionFailed: default: { if((int)statusCode < 400){ throw new SmtpException(SR.GetString(SR.net_webstatus_ServerProtocolViolation),serverResponse); } throw new SmtpException(statusCode,serverResponse,true); } } } internal static void EndSend(IAsyncResult result) { string response; SmtpStatusCode statusCode = (SmtpStatusCode)CheckCommand.EndSend(result, out response); CheckResponse(statusCode, response); } static void PrepareCommand(SmtpConnection conn) { if (conn.IsStreamOpen) { throw new InvalidOperationException(SR.GetString(SR.SmtpDataStreamOpen)); } conn.BufferBuilder.Append(SmtpCommands.Data); } internal static void Send(SmtpConnection conn) { PrepareCommand(conn); string response; SmtpStatusCode statusCode = CheckCommand.Send(conn, out response); CheckResponse(statusCode, response); } } static class DataStopCommand { /* // Consider removing. internal static IAsyncResult BeginSend(SmtpConnection conn, AsyncCallback callback, object state) { PrepareCommand(conn); return CheckCommand.BeginSend(conn, callback, state); } */ static void CheckResponse(SmtpStatusCode statusCode, string serverResponse) { switch (statusCode) { case SmtpStatusCode.Ok: { return; } case SmtpStatusCode.ExceededStorageAllocation: case SmtpStatusCode.TransactionFailed: case SmtpStatusCode.LocalErrorInProcessing: case SmtpStatusCode.InsufficientStorage: default: { if((int)statusCode < 400){ throw new SmtpException(SR.GetString(SR.net_webstatus_ServerProtocolViolation), serverResponse); } throw new SmtpException(statusCode, serverResponse, true); } } } /* // Consider removing. internal static void EndSend(IAsyncResult result) { CheckResponse((SmtpStatusCode)CheckCommand.EndSend(result)); } */ static void PrepareCommand(SmtpConnection conn) { if (conn.IsStreamOpen) { throw new InvalidOperationException(SR.GetString(SR.SmtpDataStreamOpen)); } conn.BufferBuilder.Append(SmtpCommands.DataStop); } internal static void Send(SmtpConnection conn) { PrepareCommand(conn); string response; SmtpStatusCode statusCode = CheckCommand.Send(conn, out response); CheckResponse(statusCode, response); } } static class EHelloCommand { internal static IAsyncResult BeginSend(SmtpConnection conn, string domain, AsyncCallback callback, object state) { PrepareCommand(conn, domain); return ReadLinesCommand.BeginSend(conn, callback, state); } static string[] CheckResponse(LineInfo[] lines) { if (lines == null || lines.Length == 0) { throw new SmtpException(SR.GetString(SR.SmtpEhloResponseInvalid)); } if (lines[0].StatusCode != SmtpStatusCode.Ok) { if((int)lines[0].StatusCode < 400){ throw new SmtpException(SR.GetString(SR.net_webstatus_ServerProtocolViolation),lines[0].Line); } throw new SmtpException(lines[0].StatusCode, lines[0].Line, true); } string[] extensions = new string[lines.Length-1]; for (int i = 1; i < lines.Length; i++) { extensions[i-1] = lines[i].Line; } return extensions; } internal static string[] EndSend(IAsyncResult result) { return CheckResponse(ReadLinesCommand.EndSend(result)); } static void PrepareCommand(SmtpConnection conn, string domain) { if (conn.IsStreamOpen) { throw new InvalidOperationException(SR.GetString(SR.SmtpDataStreamOpen)); } conn.BufferBuilder.Append(SmtpCommands.EHello); conn.BufferBuilder.Append(domain); conn.BufferBuilder.Append(SmtpCommands.CRLF); } internal static string[] Send(SmtpConnection conn, string domain) { PrepareCommand(conn, domain); return CheckResponse(ReadLinesCommand.Send(conn)); } } static class HelloCommand { internal static IAsyncResult BeginSend(SmtpConnection conn, string domain, AsyncCallback callback, object state) { PrepareCommand(conn, domain); return CheckCommand.BeginSend(conn, callback, state); } static void CheckResponse(SmtpStatusCode statusCode, string serverResponse) { switch (statusCode) { case SmtpStatusCode.Ok: { return; } default: { if((int)statusCode < 400){ throw new SmtpException(SR.GetString(SR.net_webstatus_ServerProtocolViolation) ,serverResponse); } throw new SmtpException(statusCode, serverResponse, true); } } } internal static void EndSend(IAsyncResult result) { string response; SmtpStatusCode statusCode = (SmtpStatusCode)CheckCommand.EndSend(result, out response); CheckResponse(statusCode, response); } static void PrepareCommand(SmtpConnection conn, string domain) { if (conn.IsStreamOpen) { throw new InvalidOperationException(SR.GetString(SR.SmtpDataStreamOpen)); } conn.BufferBuilder.Append(SmtpCommands.Hello); conn.BufferBuilder.Append(domain); conn.BufferBuilder.Append(SmtpCommands.CRLF); } internal static void Send(SmtpConnection conn, string domain) { PrepareCommand(conn, domain); string response; SmtpStatusCode statusCode = CheckCommand.Send(conn, out response); CheckResponse(statusCode, response); } } static class StartTlsCommand { internal static IAsyncResult BeginSend(SmtpConnection conn, AsyncCallback callback, object state) { PrepareCommand(conn); return CheckCommand.BeginSend(conn, callback, state); } static void CheckResponse(SmtpStatusCode statusCode, string response) { switch (statusCode) { case SmtpStatusCode.ServiceReady: { return; } case SmtpStatusCode.ClientNotPermitted: default: { if((int)statusCode < 400){ throw new SmtpException(SR.GetString(SR.net_webstatus_ServerProtocolViolation),response); } throw new SmtpException(statusCode, response, true); } } } internal static void EndSend(IAsyncResult result) { string response; SmtpStatusCode statusCode = (SmtpStatusCode)CheckCommand.EndSend(result, out response); CheckResponse(statusCode, response); } static void PrepareCommand(SmtpConnection conn) { if (conn.IsStreamOpen) { throw new InvalidOperationException(SR.GetString(SR.SmtpDataStreamOpen)); } conn.BufferBuilder.Append(SmtpCommands.StartTls); conn.BufferBuilder.Append(SmtpCommands.CRLF); } internal static void Send(SmtpConnection conn) { PrepareCommand(conn); string response; SmtpStatusCode statusCode = CheckCommand.Send(conn, out response); CheckResponse(statusCode, response); } } static class MailCommand { internal static IAsyncResult BeginSend(SmtpConnection conn, byte[] command, string from, AsyncCallback callback, object state) { PrepareCommand(conn, command, from); return CheckCommand.BeginSend(conn, callback, state); } static void CheckResponse(SmtpStatusCode statusCode, string response) { switch (statusCode) { case SmtpStatusCode.Ok: { return; } case SmtpStatusCode.ExceededStorageAllocation: case SmtpStatusCode.LocalErrorInProcessing: case SmtpStatusCode.InsufficientStorage: default: { if((int)statusCode < 400){ throw new SmtpException(SR.GetString(SR.net_webstatus_ServerProtocolViolation),response); } throw new SmtpException(statusCode, response, true); } } } internal static void EndSend(IAsyncResult result) { string response; SmtpStatusCode statusCode = (SmtpStatusCode)CheckCommand.EndSend(result, out response); CheckResponse(statusCode, response); } static void PrepareCommand(SmtpConnection conn, byte[] command, string from) { if (conn.IsStreamOpen) { throw new InvalidOperationException(SR.GetString(SR.SmtpDataStreamOpen)); } conn.BufferBuilder.Append(command); conn.BufferBuilder.Append(from); conn.BufferBuilder.Append(SmtpCommands.CRLF); } internal static void Send(SmtpConnection conn, byte[] command, string from) { PrepareCommand(conn, command, from); string response; SmtpStatusCode statusCode = CheckCommand.Send(conn, out response); CheckResponse(statusCode, response); } } static class RecipientCommand { internal static IAsyncResult BeginSend(SmtpConnection conn, string to, AsyncCallback callback, object state) { PrepareCommand(conn, to); return CheckCommand.BeginSend(conn, callback, state); } static bool CheckResponse(SmtpStatusCode statusCode, string response) { switch (statusCode) { case SmtpStatusCode.Ok: case SmtpStatusCode.UserNotLocalWillForward: { return true; } case SmtpStatusCode.MailboxUnavailable: case SmtpStatusCode.UserNotLocalTryAlternatePath: case SmtpStatusCode.ExceededStorageAllocation: case SmtpStatusCode.MailboxNameNotAllowed: case SmtpStatusCode.MailboxBusy: case SmtpStatusCode.InsufficientStorage: { return false; } default: { if((int)statusCode < 400){ throw new SmtpException(SR.GetString(SR.net_webstatus_ServerProtocolViolation),response); } throw new SmtpException(statusCode, response, true); } } } internal static bool EndSend(IAsyncResult result, out string response) { SmtpStatusCode statusCode = (SmtpStatusCode)CheckCommand.EndSend(result, out response); return CheckResponse(statusCode, response); } static void PrepareCommand(SmtpConnection conn, string to) { if (conn.IsStreamOpen) { throw new InvalidOperationException(SR.GetString(SR.SmtpDataStreamOpen)); } conn.BufferBuilder.Append(SmtpCommands.Recipient); conn.BufferBuilder.Append(to); conn.BufferBuilder.Append(SmtpCommands.CRLF); } internal static bool Send(SmtpConnection conn, string to, out string response) { PrepareCommand(conn, to); SmtpStatusCode statusCode = CheckCommand.Send(conn, out response); return CheckResponse(statusCode, response); } } internal static class SmtpCommands { internal readonly static byte[] Auth = Encoding.ASCII.GetBytes("AUTH "); internal readonly static byte[] CRLF = Encoding.ASCII.GetBytes("\r\n"); internal readonly static byte[] Data = Encoding.ASCII.GetBytes("DATA\r\n"); internal readonly static byte[] DataStop = Encoding.ASCII.GetBytes("\r\n.\r\n"); internal readonly static byte[] EHello = Encoding.ASCII.GetBytes("EHLO "); internal readonly static byte[] Expand = Encoding.ASCII.GetBytes("EXPN "); internal readonly static byte[] Hello = Encoding.ASCII.GetBytes("HELO "); internal readonly static byte[] Help = Encoding.ASCII.GetBytes("HELP"); internal readonly static byte[] Mail = Encoding.ASCII.GetBytes("MAIL FROM:"); internal readonly static byte[] Noop = Encoding.ASCII.GetBytes("NOOP\r\n"); internal readonly static byte[] Quit = Encoding.ASCII.GetBytes("QUIT\r\n"); internal readonly static byte[] Recipient = Encoding.ASCII.GetBytes("RCPT TO:"); internal readonly static byte[] Reset = Encoding.ASCII.GetBytes("RSET\r\n"); internal readonly static byte[] Send = Encoding.ASCII.GetBytes("SEND FROM:"); internal readonly static byte[] SendAndMail= Encoding.ASCII.GetBytes("SAML FROM:"); internal readonly static byte[] SendOrMail = Encoding.ASCII.GetBytes("SOML FROM:"); internal readonly static byte[] Turn = Encoding.ASCII.GetBytes("TURN\r\n"); internal readonly static byte[] Verify = Encoding.ASCII.GetBytes("VRFY "); internal readonly static byte[] StartTls = Encoding.ASCII.GetBytes("STARTTLS"); } internal struct LineInfo { string line; SmtpStatusCode statusCode; internal LineInfo(SmtpStatusCode statusCode, string line) { this.statusCode = statusCode; this.line = line; } internal string Line { get { return line; } } internal SmtpStatusCode StatusCode { get { return statusCode; } } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- X509Extension.cs
- HttpCookieCollection.cs
- OneOf.cs
- QilInvoke.cs
- SoapElementAttribute.cs
- DataGridViewColumn.cs
- TabletDevice.cs
- ManipulationVelocities.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- DataGridViewRowsRemovedEventArgs.cs
- CollectionMarkupSerializer.cs
- ContextQuery.cs
- ImageBrush.cs
- ScrollBar.cs
- ExceptionHandlerDesigner.cs
- SecurityCriticalDataForSet.cs
- ColumnClickEvent.cs
- RelationshipFixer.cs
- WorkflowMarkupSerializationException.cs
- PropertyItemInternal.cs
- CodeIterationStatement.cs
- EngineSite.cs
- SafeRightsManagementSessionHandle.cs
- CodeDirectoryCompiler.cs
- PanelDesigner.cs
- webproxy.cs
- RsaKeyIdentifierClause.cs
- ScrollItemPattern.cs
- TiffBitmapEncoder.cs
- ProxyWebPartConnectionCollection.cs
- Facet.cs
- CheckBoxFlatAdapter.cs
- WebPartDescription.cs
- ReplyChannelBinder.cs
- OdbcPermission.cs
- EventsTab.cs
- JoinTreeSlot.cs
- ListViewGroupConverter.cs
- SerialReceived.cs
- listitem.cs
- DocumentXPathNavigator.cs
- ServiceProviders.cs
- RequestCacheValidator.cs
- SignerInfo.cs
- DefaultAuthorizationContext.cs
- UIPermission.cs
- CounterCreationData.cs
- Bits.cs
- DesignerForm.cs
- SelectiveScrollingGrid.cs
- XmlSchemaExternal.cs
- SQLDecimalStorage.cs
- ToolStripDropDownClosedEventArgs.cs
- MsmqIntegrationBinding.cs
- URLAttribute.cs
- TreeView.cs
- XmlCustomFormatter.cs
- SqlAggregateChecker.cs
- ComponentRenameEvent.cs
- AttributeExtensions.cs
- DataTableMappingCollection.cs
- ClassImporter.cs
- HttpCachePolicy.cs
- WindowsListViewItem.cs
- FixedSOMPageConstructor.cs
- DataTableExtensions.cs
- QilPatternVisitor.cs
- DmlSqlGenerator.cs
- _ConnectStream.cs
- StringResourceManager.cs
- TableLayoutPanelCellPosition.cs
- ZipIOModeEnforcingStream.cs
- ToolStripRenderer.cs
- DataGridParentRows.cs
- StringWriter.cs
- GradientBrush.cs
- TypefaceCollection.cs
- TableHeaderCell.cs
- WmfPlaceableFileHeader.cs
- DisposableCollectionWrapper.cs
- IndividualDeviceConfig.cs
- XPathDocumentBuilder.cs
- TypeUtil.cs
- ElementProxy.cs
- MdiWindowListStrip.cs
- RangeBaseAutomationPeer.cs
- DataListItem.cs
- DropDownButton.cs
- SchemaElement.cs
- TypeNameParser.cs
- ColorTypeConverter.cs
- ContentFilePart.cs
- XpsFilter.cs
- CapabilitiesState.cs
- Rect3DValueSerializer.cs
- complextypematerializer.cs
- FloatSumAggregationOperator.cs
- WSSecurityTokenSerializer.cs
- MenuCommand.cs
- AttributeProviderAttribute.cs