Using system.collections; using system.io; using system.net.sockets; using system.thread; using system.text; using system.diagnost;
namespace PramodSingh.LibPOP3 {? # region "Delegates"? public delegate void POP3Error (string errorMsg) ;? public delegate void POP3MsgRetrivalStatus (int MsgNumber, int MsgSize, int MsgRetsize) ;? public delegate void POP3Complete () ;? public delegate void POP3MsgComplete (int MsgNumber, string MsgHeader);?? # endregion ?? public class POP3 {??? # region "Private class / Enum / Struct" ?? // stateObject for Asynchronous Recieve event ?? private class stateObject ?? {?? ? // client socket.??public socket worksocket = null; ??? // size of receive buffer.???public const Int buffersize = 256; ??? // receive buffer.??public Byte [] Buffer = new byte [buffersize]; ????public stringbuilder sb = new stringbuilder (); ??} ?? // pop3 commands ?? init company {??? init = 0, ??? user, ??? pass, ??? stat, ??? list, ??? retr, ??? endRetr, ??? dele, ??? bye ??} ?? // email Properties ?? private messageprop ?? {??? public string text; ??? public int debrsize; ??? public arraylist attachments; ??} ?? // attachment with in the emails ?? public struct Attachment ?? {??? public string ContentType; ??? public string name; ??? public string ContentTransferEncoding; ??? public string ContentDescription; ??? public string ContentDisposition; ??? public String filename; ??? public Byte [] binarydata; ??} ?? # endregion
?? # region "private" ?? // private variable decration ?? private string lastmsg = "" ", error =" ", user =", pass = "" ", server ="; ?? private int num msg = 0 , SIZEMSG = 0, retrmsg = 0, DELMSG = 0; ?? private arraylist msgs = new arraylist (); ?? private bool delafterread; ?? private state = state.init; ?? private const INT port = 110 ;? ? private Socket client = null; ?? private POP3Error errorDelegate = null; ?? private POP3MsgRetrivalStatus msgStatusDelegate = null; ?? private POP3Complete complete = null; ?? private POP3MsgComplete msgcomplete = null; ?? private bool usercancel = false; ?? / / asynchronous recieves event ?? private static ManualResetEvent receiveDone = ??? new ManualResetEvent (false); ?? private stateObject stateObject = new stateObject (); ?? // reads line from index in src and appends it to dst ?? private void Readline (int index, string src, ref string dst) ?? {???? INT where = src.indexof ("/ r", index 1); ???? IF ( Where> 0) ???? {????? INT length = where-index; ????? DST = src.substring (index, length); ????} ???} ??? catch (EXCEPTION E) ??? {???? error = " Readline error: " E.MESSAGE " / R / N " E.StackTrace; ???? errotelegate (error); ???} ??} ???? // main function ?? private void ParseMessage ) ?? {??? stringbuilder s = new stringbuilder (); ?????????? i (Lastmsg.StartSwith ("- err") // if there Is An Error ???? {????? error = "Received -ERR from Server:" lastmsg; ????? close (); // disconnect and stop ????? Return; ??? ?} ???? char [] CRLF = {(char) 13, (char) (10)}; ???? switch (state) // what shop we do next ????? {???? Case State.init: // IF WE Are ALREADY Connected ?????? msgs.clear ();
?????? s.append ("user"); ?????? s.append (user); ?????? S.Append (CRLF); ?????? Send (Client , S.toString ()); // send user ID ?????? state = state.user; ?????? case stats: ????? ? S.Append ("pass"); ?????? s.append (pass); ?????? S.Append (CRLF); ?????? Send (Client, S.toString) ))); // now send password ?????? state = state.pans; ?????? Break; ??????? case state.pass: ?????? S.Append "Stat"); ?????? S.Append (CRLF); ?????? Send (Client, S.toString ()); // Now send stat request ?????? state = state .Stat; ?????? Break; ??????? case state.stat: ????? {?????? char [] seperator = {(char) 32};???? ??? String [] split = lastmsg.split (seperator); ?????? f (split.length> 1) ?????? {??????? Nummsg = system.convert.toint32 (split [1] .trim (). TOSTRING ()); ??????? sizemsg = system.convert.toint32 (split [2] .trim (). TOSTRING ()); ?????? } ??????????? IF (Nummsg> 0) // if there is any any messages the send retro ?????? {??????? state = state.list; ?????? S.Append ("List 1"); ??????? Retrmsg ; ??????? S.Append (CRLF); ??????? Send (Client, S.TOSTRING ()); // send retr Request ??????} ?? ????????? Else // if not, disconnect ?????? {??????? Error = "no new messages / r / n"; ??????? state = state.bye; ??????} ?????} ?????? breaf; ????? case state.list: ????? {?????? char [] seperator = { Char) 32}; ?????? String [] split = lastmsg.split (seperator); ?????? state = state.Rtr; ?????? S.Append ("retr" retrmsg ); ?????? S.Append (CRLF); ?????? messageprop prop = new messageprop (); ?????? prop.retrsize = 0; ????? ing (split .Length> 1) ?????? {??????? prop.msgsize = system.convert.toint32 (split [2] .trim (). TOSTRING ()); ??????} ?????? prop.text = ""; ?????? msgs.add (prop); ?????? send (client, s.toString ()); ?????}? ????? Break;
????? case state.retr: ????? {?????? messageProp TMP = (MessageProp) msgs [RETRMSG-1]; ?????? IF (Lastmsg.StartSwith (" OK ")) // if it's first data dam ok ?????? {??????? lastmsg = lastmsg.replace (" ok / r / n "," "); ???? ??} ?????? tmp.text = lastmsg; // append data to message ket ?????? tmp.retrsize = lastmsg.length; // add data size to retr size ?????? msgstatusdelegate (retrmsg, tmp.msgsize, tmp.retrsize); ?????? msgs [retrmsg-1] = TMP; ?????? // if (Lastmsg.EndSwith ("/ r / n. / r / n ") || (Lastmsg.endSwith)) ?????? // this is unreliable as message comes in chucks ?????? // We would Be Able To Get /R/n./R/N?????//check the message size. ?????? = (tmp.msgsize == (tmp.retize-3)) ?????? { ? // Check if there is ally other message ??????? // PARSE THE message for attachments ??????? messagebody (retrmsg); ??????? msgcomplete (Retrmsg, Message HEADER) )); ??????? f (retrmsg ??????? {
???????? retrmsg ;
???????? S.Append ("List" retrmsg);
???????? S.Append (CRLF);
???????? Send (Client, S.toString ());
???????? state = state.list;
???????}
??????? ELSE
??????? {
????????? // Weide Got Now All Messages
???????? f (delafterread && numssg> 0) // We want to delete the from server
???????? {
????????? state = state.dele;
????????? DELMSG = 1;
????????? S.Append ("dele" DELMSG CRLF);
????????? Send (Client, S.toString ());
????????
????????}
???????? Else // Leave the and disconnect
???????? {
????????? state = state.endretr;
????????? Error = "session ended / r / n";
????????? S.Append ("quit" CRLF);
????????? Send (Client, S.toString ());
????????}
???????}
??????}
?????}
?????? Break;
????? case state.dele: ????? {?????? // delete another message ?????? ing (DELMSG ?????? {
??????? DELMSG ;
??????? S.Append ("dele" DELMSG CRLF);
??????? send (client, s.toString ());
?????
??????}
?????? Else // no more message - disconnect
?????? {
?????
??????? state = state.bye;
??????? Error = "deleted all messages / r / n";
??????? S.Append ("quit" crlf);
??????? send (client, s.toString ());
??????
??????}
?????}
?????? Break;
????? case state.bye: // default
????? default:
?????
?????? Break;
????}
???? // call the receivecallback method to get the data
???? if (state! = state.endretr) && (State! = State.bye))
???? {
????? stateObject.sb = new stringbuilder ();
????? // Slow the pace for other app
????? thread.sleep (10);
????? Client.beginReceive (stateObject.buffer, 0, stateObject.buffitsize, 0,
????? New asynccallback (receiveCallback), StateObject);
????}
???? Else
???? {
????? completion ();
????? receivedone.set ();
????? close ();
????}
???}
??? catch (Exception E)
??? {
????
???? if (! usercancel)
???? {
????? Error = "PARSEMESSAGE ERROR:" "/ r / n" E.Message "/ R / N" E.StackTrace
????}
???? Else
???? {
????? Error = "Action canceled by user";
????? usercancel = false;
????}
???? receivedone.set ();
???? close ();
??? errotelegate (error);
???}
??}
??
?? // Connect to Server and Retrieve Messages
?? private void connect ()
?? {
??? // Connect to a Remote Device.
??? Try
??? {
????? // Establish The Remote endpoint for the socket.
???? iphostentry iphostinfo = DNS.Resolve (Server);
???? ipaddress ipaddress = iphostinfo.addresslist [0];
?????? ipndpoint remoteep = new ipndpoint (ipaddress, port);
???? // Create the state object.????
???? // Create a TCP / IP socket.?????client = new socket (addressFamily.InterNetwork, ????? sockettype.stream, protocoltype.tcp);
????? // connect to the remote endpoint. ???? Client.connect (remoteep); ???????? // receive the response from the remote device.???// Begin Receiving T Data from the remote device. ???? state = state.init; ???????? stateObject.worksocket = client; ???? Client.BeginReceive (stateObject.buffer, 0, stateObject.buffersize, 0, ????? New asyncCallback (receiveCallback), stateObject); ???? receivedone.waitone (); ?????? ???} ??? catch (Exception E) ??? {????? CHAR [] CRLF = {(Char) 13, (char) 10}; ???? error = "Connection Error:" CRLF E.MESSAGE CRLF E.STACKTRACE; ???? errotelegate (Error); ???} ??}
?? // asynchronous recieve callback ?? Private Void ReceiveCallback (IASYNCRESULT AR) ?? {???? r ??? {???? // Retrieve the State Object and the client socket ???? // from the asynchronous State Object.????stateObject StateObj = (stateObject) ar.asyncState; ???? socket client = stateobj.worksocket; ???????? // read data from the remote device.????int BYTESREAD = Client.Endreceive (ar);
???? f (bytesread> 0) ???? {????? // there might be more data, so store the data received so far.?????stateobj.sb.Append (Encoding.ascii .Getstring (stateobj.buffer, 0, bytesread); ????? lastmsg = stateobj.sb.tostring (); ????? parseMessage (); ????} ???} ??? catch (EXCEPTION E) ??? {???? error = "recievecallback error" E.toTOString (); ???? errotelegate (error); ???} ??} ?? // send the data to server ?? private void send (socket client, string data) ?? {??? try ??? {????? Try ??? {?????.???? byte [] Bytedata = encoding .Ascii.getbytes (data); ???? // begin sending the data to the remote device.?????client.send(Bytedata );??? }???catch(Exception E) ??? { ???? char [] CRLF = {(char) 13, (char) 10}; ???? error = "send error:" CRLF E.MESSAGE CRLF E.STACKTRACE; ???? errordelegate (Error); ???} ??} ???? # endregion ?? # region "public" ???? // register the error delegates ?? public pop3error errorhandler ?? {??? set ??? { ???? errotelegate = value; ???} ??}
?? // register the Status delegates ?? public POP3MsgRetrivalStatus MsgStatusHandler ?? {??? set ??? {???? msgStatusDelegate = value; ???} ??} ?? // complete handler ?? public POP3Complete CompleteHandler ?? {??? set ??? {???? Complete = value; ???} ??} ?? // message completion handler ?? public pop3msgcomplete messagecompeletehandler ?? {??? set ??? {? ??? Msgcomplete = value; ???} ??} ?? // save msg to a file ?? public void saveMessageTofile (int msgnumber, string filename) ?? {??? try ??? {???? MessageProp prop = (messageprop) msgs [msgnumber-1]; ???? Byte [] Bytedata = Encoding.ASCII.GETBYTES (Prop.Text); ???? filestream fs = new filestream (filename, filemode.create); ???? fs.write (Bytedata, 0, Bytedata.Length); ???? fs.close (); ???} ??? {???? error = " SaveMessageTofile error: " " / r / n " E.Message " / r / n " E.STACKTRACE; ???? erroRDelegate (Error); ???}
??} ?? // Gets the MOM, TO, DATE, SUBJECT, BODY ?? // from entire message ?? public string message {??? try ??? { ???? String Ret = ""; ???? MessageProp prop = (MessageProp) msgs [msgnumber-1]; ???? int where = prop.text.indexof ("from:");???? Readline (where, prop.text, ref); ???? RET = "/ r / n"; ???? WHERE = prop.text.indexof ("to:"); ???? readline (Where , prop.text, ref re rett; ???? RET = "/ r / n"; ???? WHERE = prop.text.indexof ("Date:"); ???? Readline (where, prop. TEXT, REF RET); ????? RET = "/ r / n"; ???? RET = MessageSubject (msgnumber); ???? RET = "/ r / n"; ???? Return Ret ; ???} ??? Catch (Exception E) ??? {???? error = "MessageHeader error:" "/ r / n" E.Message "/ r / n" E.STACKTRACE ; ???? errotelegate (error); ???? returno "error in getting header, see error message for details"; ???} ?????} ?? // Gets ONLY MESSAGE SUBJECT ?? Public String Messagesubject (int msgnum) ?? {???????????gageprop prop = (messageprop) msgs [msgnumber-1]; ???? Int where = prop.text.indexof ("Subject:" ); ???? String Ret = ""; ???? readline (where, pro p.Text, Ref Ret; ???? Return Ret; ???} ??? Catch (Exception E) ??? {???? Error = "MessageSubject Error:" "/ R / N" E.Message "/ r / n" E.STACKTRACE; ???? ErrorDelegate (Error); ???? Return "Error IN Getting Subject, See Error Message for Details"; ???} ??}? ? // Gets Only Message Body ?? public string messagebody (int msgnumber) ?? {??? String Ret = ""; ???? messageProp prop = (MessageProp) MSGS [msgnumber -1]; ???? Parseattachment (msgnumber, ref re ret); ???? IF (RET == ""
) ???? {?????? INT where = prop.text.indexof ("/ r / n / r / n"); ????? ife (where! = - 1) ????? ? Where = 4; ????? Else where = 0; ????? int indexstart = where; ????? int RetLetLength = prop.text.length-where-3; ????? Ret = Prop.Text.Substring (IndexStart, Retlength); ????} ???? Return Ret; ???} ??? catch (Exception E) ??? {???? error = "MessageBody Error:" "/ r / n" E.Message "/ r / n" E.STACKTRACE; ???? ErrorDelegate (Error); ???? Return "ERROR IN GETTING BODY, SEE ERROR Message for Details"; ???} ??} ???} Get attachment count ?? public int attachmentcount (int msgnumber) ?? {???? messageprop prop = (MessageProp) msgs [msgnumber-1 ]; ???? Return? prop.attachments.count; ???} ??? Catch (Exception E) ??? {???? error = "MessageBody Error:" "/ r / n" e .Message "/ r / n" E.STACKTRACE; ???? ErrorDelegate (Error); ???? Return 0; ???} ??} ?? // Get the attachments ?? public pop3.attachment [] Attachments (int msgnumber) ?? {??? String Ret = ""; ???? Parseattachment (msgnumber, ref ret); ???? messageprop prop = (MessageProp) Msgs [msgnumber-1]; ???? array mytargetarray = array.createInst Ance (TypeOf (attachment), prop.attachments.count; ???? prop.attachments.copyto (MyTargeTArray); ???? Return (attachment []) MyTargetArray; ???} ??? Catch (Exception E ) ??? {???????? error = "attachments error:" "/ r / n" E.SSAGE "/ r / n" E.STACKTRACE; ??? ErrorDelegate (Error ); ???? Return null; ???} ??} ?? // save attachments to file ?? public void saveattachments (int msgnumber, string interface) ?? {??? try ??? {??? ? Attachment [] attachs = attachments (msgnumber);
???? foreach (attachment attach in attachs ???? {????? if (! Directory.exists (DIRPATH)) ????? {?????? Directory.createdIRectory (DirPath); ?????} ????? String path = DIRPATH "//" attach.FileName; ????? filestream fs = new filestream (path, filemode.create); ????? fs.write (attach.binarydata, 0, attach.binarydata.length; ????? fs.close (); ????} ???} ??? catch (Exception E) ??? {???? Error = "saveattachment error:" "/ r / n" E.MESSAGE "/ r / n" E.StackTrace; ???? errotelegate (error); ???} ??} ?? // Gets entire message with out paars? Public String message (int msgnumber) ?? {???? messageprop prop = (messageprop) msgs [msgnumber-1]; ???? Return Prop. TEXT; ???} ??? Catch (Exception E) ??? {???????? Error = "Message Error:" "/ r / n" E.MESSAGE "/ R / N " E.STACKTRACE; ???? ErrorDelegate (Error); ???? Return" error in getting message, see error message for details; ???} ??} ?? // CANCEL THE REQUEST AND RESET? PUBLIC VOID CANCEL () ?? {??? Usercancel = true; ??? receivedone.set (); ??? close (); ??} ?? // open the connection with the pop3 server ?? public void OP En () ?? {??? IF (user! = "&& pass! =" && server! = ") ??? {???? thread tclient = new thread (New Threadstart (connection)); ???? tclient.start (); ???? // tclient.join (); ???} ??? Else ??? {???????? Error = "Missing Information for User, Password and server "; ???? errotelegate (error); ???}
??}
?? // closes and quits from pop3 server ?? public void close () ?? {??? try ??? {???? receivedone.set (); ???? client.close (); ?? ?} ??? carat (Exception E) ??? {???? if (! usercancel) ???? {????? Error = E.MESSAGE; ????} ???? ELSE? ??? {????? error = "action canceled by user"; ????} ???? erroRDelegate (ERROR); ???} ??} ?? // sets username and password ?? public String username ?? {???? Return User; ???} ??? set ??? {???? user = value; ???} ??} ?? public String password ?? {???? Return Pass; ???} ??? set ??? {???? pass = value; ???} ??} ?? public String Server ?? {??? get ??? {???? Return Server; ???} ??? set ??? {???? server = value; ???} ??} ?? / / Want to delete message, {????} ??? {????} ??? {???} ??? {???} ??? set ??? {???? delafterread = value ; ???} ??} ???? // Gets Number of Msgs That Aren't IN Server ?? public int number ??? {???? Return Nummsg; ???}? ?} ?? // reset the counter ?? public void reset () ?? {??? Retrmsg = 0; ??? num msg = 0; ??? msgs.clear (); ??} ?? // Individual Message size ?? public int sizeofMessage (int msgnumber) ?? {? ?? Try ??? {???? messageProp prop = (messageprop) msgs [msgnumber-1]; ???? Return prop.msgsize; ???} ??? Catch (Exception E) ??? {? ??? char [] crlf = {(char) 13, (char) 10}; ???? error = "message error:" CRLF E.MESSAGE CRLF E.STACKTRACE; ???? errotelegate Error); ???? Return 0; ???} ??} ?? // gest size of all msgs ?? public int sizeofMessages ?? {??? get ??? {???? Return SIZEMSG;? ??} ??} ?? // Gets Number of Received from Server Msgs ?? public int number {??? get ??? {???? Return RetRMSG; ???} ??} ?? / / gets string error ?? public string error ?? {???? Return error; ???} ??} ?? // Gets Last Message RecieVied from Server ?? public string lastserverMessage? ? {??? get ??? {???? Return LastMsg;
???} ??} ???? # endRegion
?? # region "constructor" ???? public pop3 () ?? {??? user = "; ??? pass =" "; ??? server =" "; ??? error =" not connection TO Server "; ??? delafterread = false; ?????} ?? public pop3 (string server) ?? {??? user = username; ??? pass = password; ?? Server = server; ??? delafterread = false; ??} ?? public pop3 (String server, bool delafterread) ?? {??? user = username; ??? pass = password;? ?? server = server; ??? delafterread = delafterread; ??} ???? # endregion ???? # region "attachment" ?? // this has to be private ?? // Made public for testing ?? Private void Parseattachment (int msgnumber, ref string msgbody) ?? {??? String boundary = ""; ??????? messageProp prop = (MessageProp) msgs [msgnumber-1 ]; ???? prop.attachments = new arraylist (); ???? msgs [msgnumber-1] = prop. ???? Int where = prop.text.indexof ("Content-type:");? ??? i (where> 0) ???? {????? are = prop.text.indexof ("boundary ="); ????? ife (where> 1) ????? { ????? ie readline (where, prop.text, ref boundary); ?????? boundary = boundary.replace ("Boundary = /", "" "); ?????? boundary = boundary.replace ("/" "," "); ?????? char [] CRLF = {(char) 13, (char) 10}; ?????? StringBuilder SB = New StringBuilder (" - "); ?????? sb.append (boundary); ?????? sb.append (crlf); ?????? boundary = sb.tostring (); ????? ? int StartIndex = prop.text.indexof (boundary); ?????? int endindex = 0; ?????? String Ret = ""; ?????? BOOL BATTACEND = false; ??? ??? while ((endindex = prop.text.indexof (boundary, startIndex bitch ")> startIndex) ?????? {?????? startIndex = boundary.length; ???? ??? Int tempindex = endindex;
??????? endindex - = (startIndex); ??????? Ret = prop.text.substring (startIndex, endindex); ??????? // Need to Parse the data for the Data for THE Attachments ??????? // is attachment or data ???????? f (isattachment (re)) ??????? {???????? {??????? {??????? Readattachment (RET, MSGNumber ); ???????? Battacend = true; ???????} ??????? {???????? msgbody = RET; ???????} ??????? STARTINDEX = Tempindex; ??????} ?????? f (Battacend) ?????? {??????? Sb.append ("-"); ??????? boundary = boundary.replace ((char) 13, (char) 32); ??????? boundary = boundary.replace ((char) 10, (char) 32); ??????? boundary = boundary.trim (). TOSTRING (); ?????? boundary = "-"; ??????? STARTINDEX = Boundary.Length; ??????? endindex = prop.text.indexof (Boundary, StartIndex Boundary.Length); ??????? endindex - = (startIndex); ??????? Ret = Prop.Text.Substring (startIndex, endindex); ??????? readattachment (RET, MSGNUMBER); ??????} ?????} ????} ???? ELSE? ??? {????? msgbody = ""; ????} ???} ??? catch (Exception E) ??? {???? error = "PARSEATTACHMENT ERROR:" "/ r / N " E.Message " / r / n " E.STACKTRACE; ???? errotelegate (error); ???} ??} ???? // check IF this is attachment or not ?? private bool isattachment (string src) ?? {??? int where = src.indexof ("Content-Disposition:"); ??? if (where> 0) ??? {? ??? Return True; ???} ??? Else ??? {????} ??}
?? // Get All attachment from email ?? private void readtachment (string src, int msgnumber) ?? {????? String Ret = "" "; ???? string Lastline = ""; ???? messageprop prop = (messageprop) msgs [msgnumber-1]; ???? attachment at = new attachment (); ??????? int where = src.indexof ("Content -Type: "); ???? RET =" "; ???? ife (where> = 0) ???? {????? readline (where, src, ref re ret); ???? ? at.contentType = ret.replace ("Content-type:", "). Trim (). TOSTRING (); ????} ???? Ret =" "; ???? WHERE = SRC. Indexof ("name"); ???? ife (where> = 0) ???? {????? readline (where, src, ref re ret); ????? at.name = RET.REPLACE ("Name", ""). Trim (). TOSTRING (); ????? at.name = at.name.replace ("=", "). Trim (). TOSTRING (); ?? ??? at.name = at.name.replace ("/" "," "). Trim (). TOSTRING (); ????} ??????? Ret =" "; ??? ? Where = src.indexof ("Content-Transfer-Encoding:"); ???? = 0) ???? {????? Readline (where, src, ref reed); ?? ???? at.contentTransferencoding = RET.REPLACE ("Content-Transfer-Encoding:", "). Trim (). TOSTRING (); ????} ??????? Ret =" " ???? where = src.indexof ("Content-Description:"); ???? ife (where> = 0) ???? {????? readli Ne (where, src, ref reled; ?????? at.contentDescription = RET.REPLACE ("Content-Description:", ""). Trim (). TOSTRING (); ????}
???? Ret = ""; ???? WHERE = src.indexof ("Content-Disposition:"); ???? ife (where> = 0) ???? {????? readline WHERE, SRC, REF RET; ?????? at.contentdisposition = RET.REPLACE ("Content-Disposition:", ""). Trim (). TOSTRING (); ????} ???? RET = ""; ???? WHERE = src.indexof ("filename"); ???? f (where> = 0) ???? {????? readline (where, src, ref re- ; ?????? lastline = return; ????? at.FileName = RET.REPLACE ("filename", ""). Trim (). TOSTRING (); ????? at.FileName = At .filename.replace ("=", ""). Trim (). Tostring (); ????? at.FileName = at.FileName.Replace ("/" "", ""). Trim (). Tostring (); ????} ???? at.binarydata = attachmentdata (src, lastline); ???? prop.attachments.add (at); ???} ??? Catch (Exception E) ?? ? {???? error = "Readattachment error:" "/ r / n" E.Message "/ r / n" E.STACKTRACE; ??? errotelegate (error); ???}? ?
?? private byte [] attachmentdata (string src, string lastline) ?? {??? Try ??? {???? String Base64String = ""; ???? Int where = src.indexof (lastline);? ???????????? (char) 13, (char) 10}; ???? f (where> 0) ???? {????? Base64String = src.substring (Where lastline. Length); ????? Base64String = Base64String.Replace (CHAR) 13, (Char) 32); ????? Base64String = Base64String.Replace (Char) 10, (char) 32);??? ?? Base64String = Base64String.trim (). TOSTRING (); ????? Return Convert.FromBase64String (Base64String); ????} ???? Return Null; ???} ??? Catch (Exception E ) ??? {???? char [] CRLF = {(char) 13, (char) 10}; ???? error = "AttachmentData error:" "/ r / n" E.MESSAGE " / r / n " E.STACKTRACE; ???? ErrorDelegate (Error); ???? Return Null; ???} ?????} ?? # endregion ???}}