advertisement

Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET

80 %
20 %
advertisement
Information about Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET
Technology

Published on March 12, 2011

Author: DavidRossGoben

Source: slideshare.net

Description

This sample excerpt show you how to easily process, encode, and decode email. It also shows you how to easily perform complex outbound SMTP email, and introduces an inbound POP3 email class that is missing in VB.NET.
advertisement

Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NETBy David Ross GobenCopyright © 2011 by David Ross GobenAll rights reserved.Last Update: Monday, July 16, 2012This is a sample excerpt from the free PDF e-book, Enhancing Visual Basic .NET Far Beyond the Scope of Visual Basic 6.0, by DavidRoss Goben. Download this e-book, and its free companion, Navigating Your Way Through Visual Basic 6.0 Upgrades to Visual Basic.NET, also by David Ross Goben, at www.slideshare.net/davidrossgoben. They are also available on Google Docs athttps://docs.google.com/leaf?id=0B_Dj_dKazINlN2JlY2EwMmEtNGUyMy00NzQzLTliN2QtMDhlZTc5NDUzY2E5&sort=name&layout=list&num=50. The Google site also has a VBNetEmail.zip source file package featuring all VB.NET classes and utilities.Table of ContentsSend (SMTP) and Retrieve (POP3) Email with Ease under VB.NET................................................................................... 2 Adding the VB6 MAPISession and MAPIMessage Controls to VB.NET............................................................................................................2 PART ONE ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Sending Email under VB.NET using Native Methods ................................................................................................................................3 Quick and Dirty Email Senders ..........................................................................................................................................................3 TCP Ports, SSL Authentication, and Creating Credentials ...............................................................................................................5 An Email Sender with a Lot of Muscle ...............................................................................................................................................6 Sending Email Messages as HTML ..................................................................................................................................................8 Sending Alternate Message Views ..................................................................................................................................................10 Sending Alternate Message Views with Different Context Types and Transfer Encoding ............................................................13 Typical Email Server Specifications ..........................................................................................................................................................17 PART TWO ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Encoding and Decoding Email Data .........................................................................................................................................................18 Allowing Users to Specify Content-Type and Content-Transfer-Encoding Options.......................................................................19 Determining if Text can be Encoded As Quoted-Printable, Base64, or 7Bit ..................................................................................21 Converting 8-Bit HTML Data to 7-Bit without Loss of Integrity .......................................................................................................21 Converting 8-Bit Text Data to 7-Bit without Data Loss....................................................................................................................22 Decoding Quoted-Printable Text......................................................................................................................................................23 Translating Base64 Data Back to Its Original Format .....................................................................................................................23 Translating BinHex Data Back to its Original Format......................................................................................................................26 PART THREE ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Receiving Email under VB.NET using Native Methods ............................................................................................................................27 Connecting to a POP3 Server..........................................................................................................................................................30 Checking for a POP3 Server Response ..........................................................................................................................................31 Checking for Being Connected to a POP3 Server ..........................................................................................................................31 Getting a Response from the POP3 Server ....................................................................................................................................31 Submitting a Request to the POP3 Server ......................................................................................................................................33 Disconnecting from the POP3 Server ..............................................................................................................................................33 Getting Email Statistics from the POP3 Server ...............................................................................................................................34 Getting an Email Reference List from the POP3 Server.................................................................................................................34 Get an Email Header from the POP3 Server...................................................................................................................................35 Retrieve an Email from the POP3 Server ........................................................................................................................................36 Deleting an Email from the POP3 Server ........................................................................................................................................36 Reset (Undo) All Deletes from the POP3 Server ............................................................................................................................37 Send a ‘Keep-Alive’ NOOP Command to the POP3 Server ...........................................................................................................37 Disposing of Resources ...................................................................................................................................................................37 Using the Completed POP3 Class ...................................................................................................................................................38 PART FOUR ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Email Data Blocks Made Easy ..................................................................................................................................................................39 Easily Extracting the Component Parts from an Email File .............................................................................................................42 Compiling Everything into an Email Class Library....................................................................................................................................44 Building the VBNetMail Class Library ...............................................................................................................................................46 Accessing your New VBNetEmail Class Library DLL from another Project ....................................................................................46 The Complete SMTP.VB File ....................................................................................................................................................................47 The Complete POP3.VB File.....................................................................................................................................................................47 The Complete Utilities.VB File...................................................................................................................................................................53 Conclusion................................................................................................................................................................. 58About the Author .............................................................................................................................................................. 59 Page –1–

Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NETBrays whisper distantly beneath midnight mists as spent developers, pinned by looming deadlines and theirbrain’s threat of total collapse, rasp desperate prayers against an ominous sense of impending doom, workingat a fever’s pitch to hammer out viable code (which, according to Murphy’s Law of Looming Deadlines, is anabsolute impossibility). Suddenly, in utter horror, they crash into a brick wall; and this after having assuredtheir skeptical client of how superior VB.NET was over that antiquated VB6 the client revered. They realizetoo late that their strategy for the client’s email handler is unworkable: VB.NET does not provide the MAPIcontrols they thought it did. Another soul-torn howl trebles against the muffled parapets of the valley.Plain and simple, MAPI (Messaging Application Program Interface) is not yet a .NET technology; it is stillCOM technology (Common Object Model), used by ASP (Active Server Page), IIS (Internet InformationServer), and any other COM application that access email. Being COM-based, you should not expect to seethe VB.NET Toolbox sport controls such as VB6’s MAPISession or MAPMessage.Under the VB6 implementation of MAPI, it used the MAPISession control to (what else?) manage a MAPIsession. The MAPIMessage control was used to process email messages, both incoming (POP3; Post OfficeProtocol – Version 3) and outgoing (SMTP; Simple Mail Transfer Protocol).Presently, .NET is set up for outbound email, but it lacks a class supporting inbound email, even though bothof these technologies are simple TCP Clients (Transmission Control Protocol). I think it may havesomething to do with many people wanting to read email using eye-candy apps, such as Outlook or Mail. Butthis does not remove the need for an inbound class in more controlled environments.Although it is easy to write VB.NET code to support POP3 Inbound Email services, as I will show you, Ihave found only one other person (I have since found more, but none provide robust solutions), and he worksat Microsoft, who has developed any sort of VB.NET code to demonstrate this ability (albeit his solution wasjust a simple example with very limited capability). But by the time I found his article within the catacombsof MSDN, I had already put the finishing touches on my own full-featured POP3 Inbound Email solution.Adding the VB6 MAPISession and MAPIMessage Controls to VB.NETBut before diving into these VB.NET solutions, let us first take a look at the kind support that is presentlyavailable to developers who are upgrading VB6 MAPI applications to VB.NET.When you upgrade a VB6 MAPI application to VB.NET, you will notice that the upgradedapplication will still have the VB6 MAPISession and MAPIMessage controls on any form thathad them before. This is because their control sources have been copied locally and arereferenced internally. Under .NET, a copy of the COM-based MSMAPI32.DLL is converted intoa non-COM version (its DLLRegisterServer() entry is disabled) and saved to a project-local file namedInterop.MSMAPI32.DLL. But, because both VB6 controls actually accessed this DLL provider through theMSMAPI32.OCX ActiveX interface, another project-local non-COM DLL named AxInterop.MSMAPI32.DLLis internally compiled by .NET that will duplicate both the ActiveX visual Interface construction services forthe controls, as well as the function mapping services to the new Interop.MSMAPI32.DLL.Having found these controls on their upgraded applications, many developers also want to add them to otherVB.NET projects so they can take advantage of them there, but they cannot seem to find a way to easilyaccess the new DLLs from those new projects. It is doable, but it requires numerous coding hacks.But relax. Why not just add these two VB6 controls to your VB.NET Toolbox and access them directly? 1. With any form up on the Visual Studio screen so that the IDE toolbox is active, right-click a toolbox category you want to add the MAPI controls to (if you want to add them to their own category, such as to one named COM, right-click any category and select the Add Tab option, then type the name of your category, such as COM, press ENTER, then right-click that tab). 2. Select the Choose Items… option, and wait for the IDE to build a massive control reference list from the computer. 3. Once the Choose Toolbox Items dialog is finally displayed – select the COM Components tab. 4. Scroll down and put checkmarks in the check boxes for Microsoft MAPI Messages Control, Version 6.0, and Microsoft MAPI Sessions Control, Version 6.0. (Both of these are actually linked to MSMAPI32.OCX, which in turn drilled down to MAPI32.DLL, but they will now both link to a new .NET-compiled axInterop.MSMAPI32.DLL, which then drills down to Interop.MSMAPI32.DLL). 5. Click the OK button, and you will find these two controls now in your selected Toolbox category list, and you can begin using these controls just exactly as you would had been using them under VB6. Page –2–

NOTE: If you do not find these entries in the Choose Toolbox Items dialog box, then you may not or no longer have the VB6 redistributables on yoursystem, so you will have to minimally install the free Runtime Distribution Pack for Service Pack 6 for Visual Basic 6.0, available from Microsoft(www.microsoft.com/downloads/details.aspx?FamilyId=7B9BA261-7A9C-43E7-9117-F673077FFB3C&displaylang=en). You are allowed to dothis even if you no longer own VB6. You should also install the Microsoft Visual Basic 6.0 Service Pack 6 Cumulative Update(www.microsoft.com/download/en/details.aspx?amp;displaylang=en&id=7030).PART ONESending Email under VB.NET using Native MethodsVB.NET has its own Outbound SMTP Email class that supports sending email, and without a need toadd the more resource-hungry form controls, as we had to do with VB6. Because this technique is moreaccessible than supporting inbound email under VB.NET, we will first look at sending email out.Some people think that you simply hit a system-linked “Send” button and a message they had just typedis automatically launched into the labyrinths of the internet with possibly little or no code from you.Were that it be so easy. But hopefully you will now be able to make your clients think you made it so.Back in the “old days” of software engineering, say the early 1990s, we processed email through a thingcalled a Berkeley Socket (circa 1983). This “socket” simply described the endpoint of a bidirectionalinter-process communication flow across an Internet Protocol-based network. It was sometimes a realtrick to program for, depending on the platform, but when it functioned correctly, it was a work of art.In a pinch we launched a TelNet client and manually typed the various commandsto log on to an email server, send, receive, and read email, and finally disconnect.Those were cryptic and unforgiving days. But looking back to those times, I have towonder if we were either brilliant geniuses or major drool-monkeys, because wethought back in those younger and smarter years that it was all simple child’s play.Quick and Dirty Email SendersNowadays, we have built-in tools to do most of the hard stuff for us, such as the System.Net Namespace.This class library provides the .NET SMTP Outbound Mail class. To use it, in the heading of your form ormodule, above the class declaration of the file you want to implement it in, I will ask you to add this line:Imports System.Net, System.Text, VB = Microsoft.VisualBasic Most the code in this article REQUIRES this Imports line!NOTE: Some people import System.NET.Mail just to avoid typing “Mail.” later in their code, but we will also need accessto the System.Net.Mime namespace, and even later the System.Net.Sockets namespace. Note that the third part of the line,the declaration of VB, is not really necessary, but BOY is it handy to have in most every class or module we write.NOTE: MIME (or Mime) is an anagram for Multipurpose Internet Mail Extensions.First, if you want to send a fast note to someone, most servers will allow you to use the following method:******************************************************************************* Function Name : BrainDeadSimpleEmailSend Purpose : Send super simple email message (works with most SMTP servers)===============================================================================NOTES: strFrom : Full email address of who is sending the email. ie, David Dingus <daviddingus@att.net> strTo : Full email address of who to send the email to. ie, "Bubba Dingus" <bob.dingus@cox.com> strSubject: Brief text regarding what the email concerns. strBody : text that comprises the message body of the email. smtpHost : This is the email host you are using for sending emails, such : as "smtp.comcast.net", "authsmtp.juno.com", etc.*******************************************************************************Public Sub BrainDeadSimpleEmailSend(ByVal strFrom As String, _ ByVal strTo As String, _ ByVal strSubject As String, _ ByVal strBody As String, _ ByVal smtpHost As String) Dim smtpEmail As New Mail.SmtpClient(smtpHost) create new SMTP client using TCP port 25 smtpEmail.Send(strFrom, strTo, strSubject, strBody) send emailEnd SubNOTE: The FROM and TO email addresses can be simple, such as bob.dingus@cox.com, or more “trendy” formats, such as“Bernard Shaw Fullo” <FulloBS@highschnozez.com> or even Coat Mahatma <mahatmacoat@classydresser.com>. If the datacontains angle brackets, the Mail object will use only the data contained within them. If there are no angle brackets, then the mailobject will surround the data with angle brackets, assuming that the entire text is an email address. Page –3–

NOTE: Yahoo, Gmail, HotMail, and Juno are internet-based services providing both internet and SMTP/POP3 access. Unlike theother three, Yahoo, normally free, requires an additional monthly fee for SMTP/POP3 access. Juno and HotMail provide thisservice freely to their subscribers. Gmail, a free service, provides it if you set an option in the POP Download section of theForwarding and POP/IMAP option within its internet account Settings. You will, of course, have to set up SMTP/POP3 accountsand access within your favorite local email application for all four, such as Windows Mail, Outlook Express, or Outlook.The above method actually works for most SMTP servers. For example, Comcast and Juno both supportthis interface. I use this for quick messages (though they can also be major literary works), like mostpeople post text messages on their cell phones. However, I think it would be a bit difficult to drive downthe road with a desktop PC and keyboard in hand, trying to steer while I thumb a quick message.NOTE: Texting while driving is illegal here in Florida, as it should be. In 2010 I witnessed 6 accidents and 1 fatality due todriver texting, primarily by young people, though I must concede that they could have been more distracted by their stereosystems blasting so loudly that it made both their eyes bounce from one side of their head to the other, impairing their vision.The SMTP Host is the address of your email provider’s SMTP server. SMTP is a TCP/IP (TransmissionControl Protocol/Internet Protocol) process used for sending and receiving email. However, becauseSMTP is limited in its capability to queue messages at its receiving end, it is typically used with one oftwo other protocols, like POP3 or IMAP (Internet Message Access Protocol). But that is a topic we willcover after we resolve the email sending issues that many thousands of developers are presently having.For a much more robust method that supports most-all servers, including those that use security layers,like Gmail, you might try the following method to send a quick email with no attachments:******************************************************************************* Function Name : QuickiEMail Purpose : Send a simple email message (but packed with a lot of muscle)===============================================================================NOTES: strFrom : Full email address of who is sending the email. ie, David Dingus <daviddingus@att.net> strTo : Full email address of who to send the email to. ie, "Bubba Dingus" <bob.dingus@cox.com> strSubject: Brief text regarding what the email concerns. strBody : text that comprises the message body of the email. smtpHost : This is the email host you are using for sending emails, such : as "smtp.gmail.com", "smtp.comcast.net", "authsmtp.juno.com", etc. smtpPort : TCP Communications Port to use. Most servers default to 25, though 465 (SSL) or 587 (TLS) are becoming popular. usesSLL : If this value is TRUE, then use SSL/TLS Authentication protocol for secure communications. SSLUsername: If usesSLL is True, this is the username to use for creating a credential. Leave blank if the same as strFrom. SSLPassword: If usesSLL is True, this is the password to use for creating a credential. If this field and SSLUsername : are blank, then default credentials will be used (only works on local, intranet servers). SSLDomain : If creating a credential when a specific domain is required, set this parameter, otherwise, leave it blank.*******************************************************************************Public Function QuickiEMail(ByVal strFrom As String, _ ByVal strTo As String, _ ByVal strSubject As String, _ ByVal strBody As String, _ ByVal smtpHost As String, _ Optional ByVal smtpPort As Integer = 25, _ Optional ByVal usesSSL As Boolean = False, _ Optional ByVal SSLUsername As String = vbNullString, _ Optional ByVal SSLPassword As String = vbNullString, _ Optional ByVal SSLDomain As String = vbNullString) As Boolean Try Dim smtpEmail As New Mail.SmtpClient(smtpHost, smtpPort) create new SMTP client smtpEmail.EnableSsl = usesSSL true if SSL Authentication required If usesSSL Then SSL authentication required? If Len(SSLUsername) = 0 AndAlso Len(SSLPassword) = 0 Then if both SSLUsername and SSLPassword are blank... smtpEmail.UseDefaultCredentials = True use default credentials Else otherwise, we must create a new credential If Not CBool(Len(SSLUsername)) Then if SSLUsername is blank, use strFrom smtpEmail.Credentials = New NetworkCredential(strFrom, SSLPassword, SSLDomain) Else smtpEmail.Credentials = New NetworkCredential(SSLUsername, SSLPassword, SSLDomain) End If End If End If smtpEmail.Send(strFrom, strTo, strSubject, strBody) send email using text/plain content type and QuotedPrintable encoding Catch e As Exception if error, report it MsgBox(e.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation, "Mail Send Error") Return False return a failure flag End Try Return True if no error, then return a success flagEnd FunctionWith the QuickiEMail() method, you can send full, plain text message to one recipient with noattachments, hence; quick and dirty. With this method, you supply it with the full email address forwhom the email is from (you, for example), you also provide the full email address of the person you aresending it to, a subject for the email (what it is concerning), the body of the text message, and the SMTPhost (such as smtp.comcast.net, authsmtp.juno.com, or smtp.gmail.com). Page –4–

If you must use a TCP Port other than Port 25, such as Gmail requires (using Secure TCP Port 587), theninclude the needed port number. Also, if you will be using a secure TCP Port, then you will also requireSSL Authentication, so include Yes for the Boolean usesSSL flag. By setting usesSSL to True, this will inturn mean that you will need to also supply credentials. Do not panic. This is easy. Just look below.TCP Ports, SSL Authentication, and Creating CredentialsBy default, most Outbound Servers use TCP Port 25, and they use TCP Port 110 for their InboundServer, providing unencrypted, non-secure email transactions. However, some may differ, such asGmail, as mentioned above, which uses secure TCP Port 587 for their Outbound Server and TCP Port995 for their Inbound Server. But this is primarily because Gmail, and some others, requires an SSL(Secure Socket Layer) to process mail. In these cases you will need to set the optional parameter to thatTCP Port, such as in the following hard-coded example:Dim smtpEmail As New Mail.SmtpClient("smtp.EngulfNDevour.com", 465) Create new SMTP client using Secure TCP Port 465.smtpEmail.EnableSsl = True True if SSL authentication required.SmtpEmail.UseDefaultCredentials = True Typical for NTLM, negotiate, and Kerberos-based authentication.NOTE: Yes, yes, I know; TCP port 587 uses a newer breed of security called TLS (Transport Layer Security). But first, it isstill an SSL. Second, SSL technology provides identical security. And third, you are not going to find an EnableTls propertyin the Mail object. Refer to www.sans.org/reading_room/whitepapers/protocols/ssl-tls-beginners-guide_1029.The above DefaultCredentials property represents the system credentials for the current security contextin which the application is running. For a client application, these are usually the Windows credentials(username, password, and domain) of the user running the application (for ASP.NET applications, thedefault credentials are the user credentials of the logged-in user, or the user being impersonated).NOTE: To examine your default credentials, access the System.Net.CredentialCache.DefaultNetworkCredentials property.However, setting the UseDefaultCredentials property to True will apply only to a Microsoft NT LANManager (NTLM) using intranet-based Negotiate authentication and Kerberos-based authentication. Allothers will have to create a credential. This is no big whoop, as you are about to see.NOTE: To make sure that IIS supports both the Kerberos protocol and the NTLM protocol, you must confirm that theNegotiate security header is set in the NTAuthenticationProviders metabase property. For Negotiate authentication tofunction correctly, several exchanges must take place on the same connection. Therefore, Negotiate authentication cannot beused if an intervening proxy does not support keep-alive connections. If this is not understood, it should not concern you.NOTE: The centralized account management supported by NT Active Directory Services requires a corresponding authenticationprotocol for network log-on. Based on RFC 1510 (www.ietf.org/rfc/rfc1510.txt), the Kerberos protocol provides enhancedauthentication for the distributed computing environment and standardization to interoperate with other operating systems.FUNNY DIGRESSION: the Term NT stands for New Technology. It was adopted when Microsoft and IBM parted on theirjoint OS2 venture. IBM, slow about everything (a self-study showed it took them 9 weeks to ship an empty box), they refusedto adopt the revolutionary, advanced technology Microsoft was quickly developing without it being time-tested (meaningproven; this is why NASA uses 20-year-old technology), so Microsoft made its own version of OS2 that used it, naming it NT.Now, think about how many times you have read or heard even Microsoft mentioning the term NT Technology?If you are not accessing a local IIS (intranet) SMTP server, you will need to supply a new credential foran SSL SMTP client through a new NetworkCredential Object with a Username and Password providedto it (if Domains differ, then that must be supplied as well), as shown in this hand-coded example:Dim smtpEmail As New Mail.SmtpClient("smtp.gmail.com", 587) create new Gmail SMTP client with SSL (actually TLS) for outgoing eMailsmtpEmail.EnableSsl = True True if SSL/TLS authentication requiredsmtpEmail.Credentials = New NetworkCredential("Norio.Nachamichi.Jones@gmail.com","MomBNipp0neze") new credential with Username, PasswordNOTE: You cannot use decorated usernames for creating a network credential. You will not be able to use something likeTukool Firwurds <iBeAnicn@chic.net>. You would have to provide just the actual email address: iBeAnicn@chic.net.Although the above methods work in most domains, highly secure domains may require more than anSSL certificate to reach the outside world. For example, if you are a minion at the Engulf & DevourCredit Corp., you may need to apply code that bypasses massive firewalls and multi-layer proxies,which any high school youth worth their salt can usually break through before Second Period. Page –5–

As indicated, you need to create a NetworkCredential object if you access a server through an SSL/TLSlayer, such as Gmail or HotMail, because you will not be able to use default credentials. Compare theseexamples, demonstrating default access through “plain” and TLS secure Comcast servers:QuickiEMail("Idjut@comcast.net", "editor@nyt.com", "Letter to the Editor", "Your paper lines my dog cages.", "smtp.comcast.net") plainQuickiEMail("Bob <Idjut@comcast.net>", "ed@abrv.com", "Ltr 2 Ed", "Yr ppr lns m dg cgz 2.", "smtp.comcast.net", 587, True, "Idjut", "pSSwd#6") secureNOTE: Gmail, like a few other TLS servers, require the user’s FULL email address for their certificates (includes@gmail.com). Leaving the SSLUsername field blank, the user’s email address (as long as it is not decorated) will be used.But even so, just the above QuickiEMail() method supports most emails that people need to transmit,and is, in fact, all the outgoing email support than a great deal of people will ever require.An Email Sender with Some MuscleIf you may have multiple recipients, multiple optional BCC (Blind Carbon Copy) recipients, multipleoptional CC (Carbon Copy) recipients, multiple attachments, or if you want to send the body text asHTML format, or send alternate views of the message body, you will require a method with a whole lotmore muscle, like the following SendEmail() method:******************************************************************************* Function Name : SendEMail Purpose : Send a more complex email message===============================================================================NOTES: strFrom : Full email address of who is sending the email. ie, "David Dingus <david.dingus@att.net>" strTo : Full email address of who to send the email to. ie, "Bubba Dingus <bob.dingus@cox.com>" : If multiple recipients, separate each full email address using a semicolon (;) strSubject: Brief text regarding what the email concerns. strBody : text that comprises the message body of the email. May be raw text or HTML code IsHTML : True if the strBody data is HTML, or the type of data that would be contained within an HTML Body block. smtpHost : This is the email host you are using for sending emails, such : as "smtp.gmail.com", "smtp.comcast.net", "authsmtp.juno.com", etc. AltView : A System.Net.Mail.AlternateView object, such as Rich Text or HTML. : If need be, set AltView.ContentType.MediaType and AltView.TransferEncoding to properly format the AlternateView. : For example: AltView.ContentType.MediaType = Mime.MediaTypeNames.Text.Rtf : AltView.TransferEncoding = Mime.TransferEncoding.SevenBit StrCC : Send "carbon copies" of email to this or these recipients. : If multiple recipients, separate each full email address using a semicolon (;) strBcc : Blind Carbon Copy. Hide this or these recipients from view by others. : If multiple recipients, separate each full email address using a semicolon (;) strAttachments: A single filepath, or a list of filepaths to send to the recipient. : If multiple attachments, separate each filepath using a semicolon (;) (C:my datawin32.txt; c:jokes.rtf) : The contents of the attachments will be encoded and sent. : If you wish to send the attachment by specifying content type (MediaType) and content transfer encoding : (Encoding), then follow the attachment name with the MediaType and optional encoding (default is : application/octet-stream,Base64) by placing them within parentheses, and separated by a comma. For example: : C:My FilesAPI32.txt (text/plain, SevenBit); C:telnet.exe (application/octet-stream, Base64) : Where: The MediaType is determined from the System.Net.Mime.MediaTypeNames class, which : can specify Application, Image, or Text lists. For example, the above content type, : "textplain", was defined by acquiring System.Net.Mime.MediaTypeNames.Text.Plain. : The second parameter, Encoding, is determined by the following the values specified by the : System.Net.Mime.TrasperEncoding enumeration: : QuotedPrintable (acquired by System.Net.Mime.TransferEncoding.QuotedPrintable.ToString) : Base64 (acquired by System.Net.Mime.TransferEncoding.Base64.ToString) : SevenBit (acquired by System.Net.Mime.TransferEncoding.SevenBit.ToString) smtpPort : TCP Communications Port to use. Most servers default to 25. usesSLL : If this value is TRUE, then use SSL Authentication protocol for secure communications. SSLUsername: If usesSLL is True, this is the username to use for creating a credential. Leave blank if the same as strFrom. SSLPassword: If usesSLL is True, this is the password to use for creating a credential. If this field and SSLUsername : are blank, then default credentials will be used (only works on local, intranet servers). SSLDomain : If creating a credential with a specific domain is required, set this parameter, otherwise, leave it blank.*******************************************************************************Public Function SendEMail(ByVal strFrom As String, _ ByVal strTo As String, _ ByVal strSubject As String, _ ByVal strBody As String, _ ByVal IsHTML As Boolean, _ ByVal smtpHost As String, _ Optional ByVal AltView As Mail.AlternateView = Nothing, _ Optional ByVal strCC As String = vbNullString, _ Optional ByVal strBcc As String = vbNullString, _ Optional ByVal strAttachments As String = vbNullString, _ Optional ByVal smtpPort As Integer = 25, _ Optional ByVal usesSSL As Boolean = False, _ Optional ByVal SSLUsername As String = vbNullString, _ Optional ByVal SSLPassword As String = vbNullString, _ Optional ByVal SSLDomain As String = vbNullString) As Boolean Dim Email As New Mail.MailMessage create a new mail message With Email .From = New Mail.MailAddress(strFrom) add FROM to mail message (must be a Mail Address object) ------------------------------------------- Dim Ary() As String = Split(strTo, ";") add TO to mail message (possible list of email addresses; separated each with ";") For Idx As Integer = 0 To UBound(Ary) If Len(Trim(Ary(Idx))) <> 0 Then .To.Add(Trim(Ary(Idx))) add each TO recipent (primary recipients) Next ------------------------------------------- .Subject = strSubject add SUBJECT text line to mail message ------------------------------------------- .Body = strBody add BODY text of email to mail message. Page –6–

.IsBodyHtml = IsHTML indicate if the message body is actually HTML text. ------------------------------------------- If AltView IsNot Nothing Then if an alternate view of plain text message is defined... .AlternateViews.Add(AltView) add the alternate view End If ------------------------------------------- If CBool(Len(strCC)) Then add CC (Carbon Copy) email addresses to mail message Ary = Split(strCC, ";") (possible list of email addresses, separated each with ";") For Idx As Integer = 0 To UBound(Ary) If Len(Trim(Ary(Idx))) <> 0 Then .CC.Add(Trim(Ary(Idx))) add each recipent Next End If ------------------------------------------- If CBool(Len(strBcc)) Then add Bcc (Blind Carbon Copy) email addresses to mail message Ary = Split(strBcc, ";") (possible list of email addresses; separated each with ";") For Idx As Integer = 0 To UBound(Ary) If Len(Trim(Ary(Idx))) <> 0 Then .Bcc.Add(Trim(Ary(Idx))) add each recipent (hidden recipents) Next End If ------------------------------------------- If CBool(Len(strAttachments)) Then add any attachments to mail message Ary = Split(strAttachments, ";") (possible list of file paths, separated each with ";") For Idx As Integer = 0 To UBound(Ary) process each attachment Dim attach As String = Trim(Ary(Idx)) get attachment data If Len(attach) <> 0 Then if an attachment present... Dim I As Integer = InStr(attach, "(") check for formatting instructions If CBool(I) Then formatting present? Dim Fmt As String yes, so set up format cache Fmt = Mid(attach, I + 1, Len(attach) - I - 1) get format data attach = Trim(VB.Left(attach, I - 1)) strip format data from the attachment path Dim Atch As New Mail.Attachment(attach) create a new attachment Dim fmts() As String = Split(Fmt, ",") break formatting up For I = 0 To UBound(fmts) process each format specification Fmt = Trim(fmts(I)) grab a format instruction If CBool(Len(Fmt)) Then data defined? Select Case I yes, so determine which type of instruction to process Case 0 index 0 specified MediaType Atch.ContentType.MediaType = Fmt set media type to attachment Case 1 index 1 specifes Encoding Select Case LCase(Fmt) check the encoding types and process accordingly Case "quotedprintable", "quoted-printable" Atch.TransferEncoding = Mime.TransferEncoding.QuotedPrintable Case "sevenbit", "7bit" Atch.TransferEncoding = Mime.TransferEncoding.SevenBit Case Else Atch.TransferEncoding = Mime.TransferEncoding.Base64 End Select End Select End If Next .Attachments.Add(Atch) add attachment to email Else .Attachments.Add(New Mail.Attachment(attach)) add filepath (if no format specified, encoded in effiecient Base64) End If End If Next End If End With ----------------------------------------------------------------------- now open the email server... Try Dim SmtpEmail As New Mail.SmtpClient(smtpHost, smtpPort) create new SMTP client on the SMTP server SmtpEmail.EnableSsl = usesSSL true if SSL Authentication required If usesSSL Then SSL authentication required? If Len(SSLUsername) = 0 AndAlso Len(SSLPassword) = 0 Then if both SSLUsername and SSLPassword are blank... SmtpEmail.UseDefaultCredentials = True use default credentials Else otherwise, we must create a new credential If Not CBool(Len(SSLUsername)) Then if SSLUsername is blank, use strFrom SmtpEmail.Credentials = New NetworkCredential(strFrom, SSLPassword, SSLDomain) Else SmtpEmail.Credentials = New NetworkCredential(SSLUsername, SSLPassword, SSLDomain) End If End If End If SmtpEmail.Send(Email) finally, send the email... Catch e As Exception if error, report it MsgBox(e.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation, "Mail Error") Return False return failure flag End Try Return True return success flagEnd FunctionNotice that in this version we have added more recipients. A lot more. There is a TO list, a Carbon Copylist (CC), and a Blind Carbon Copy list (BCC; not viewable by TO or CC recipients). The CC list is anarchaic vestige that just forgot to go away. It was essential back in the days when you could specify onlya single email address in the TO field. The BCC was essential for sending copies to other concernedparties, but it was not essential, or the sender did not want the TO or CC viewers to know that theseBCC recipients were being sent copies. Some claim there is no use for a BCC list, but I beg to differ.NOTE: Microsoft Mail features BCC, but it does not seem to work (under Vista, anyway). Page –7–

The important thing to notice about these three recipient fields is that you separate each recipient with asemicolon (;). Notice also that in my code that I did a check on each after I split them into an array toensure that a field was not empty. Most email applications simply slap a semicolon on the tail of eachemail address, so splitting them into an array may leave any last array element empty.The Attachments, strAttachments, we handle just like TO, CC and BCC. The file paths to theattachments are separated by semicolons. The Mail.Attachments collection object takes care of loadingthe actual file data. Attachments are appended to the end of the email. As noted in the comments abovethe method, you can also declare the encoding and display formats for an attachment; otherwise theywill default to binary (“application/octet-stream”) and encoded using the Base64 method, which, as all,converts them to encoded 7-bit text, which all emails must be formatted to for internet processing.An email is actually a series of bytes (in email lingo, these are octets; 8-bits), formatted as 7-bit ASCIItext (ergo, the 8th bit is never used). As such, even binary attachments are encoded into blocks of ASCIItext, sometimes formatted as ASCII Hexadecimal (hex; “0” through “9”, and “A” through “F”, allowingfor a Base16 numbering system, though this doubles the data size), where each byte is represented bytwo 7-bit characters, and each character represents a nibble, or 4 bits (computer engineers must alwaysbe hungry). However, many servers now support various types of encoding, like Base64, to bettertransport 8-bit/binary data in the 7-bit-only catacombs of the internet (at a cost of the data’s footprintbeing about 25% larger). For example, my API32.txt file, which, by its extension, is hopefully a textfile, looks like gobbledygook at the bottom of my email when converted using the default Base64encoding. Here is a sampling of its beginning:NOTE: My comments in the SendEmail() method header regarding attachments, where I discuss formatting the attachmentto different content types and encoding, we will leave for later, when I actually discovered these solutions.From: mercedes_silver@80micro.comTo: david.ross.goben@gmail.comDate: 21 Feb 2011 21:16:00 -0500Subject: TestContent-Type: multipart/mixed; boundary=--boundary_0_5fbcc36e-0097-412e-bf2b-c4dc5bc543d0----boundary_0_5fbcc36e-0097-412e-bf2b-c4dc5bc543d0Content-Type: text/plain; charset=us-asciiContent-Transfer-Encoding: quoted-printableThis is just a test----boundary_0_5fbcc36e-0097-412e-bf2b-c4dc5bc543d0Content-Type: application/octet-stream; name=API32.txt ◄▬▬▬ The Name parameter identifies this as an attachment (and it was handled as a binary stream)Content-Transfer-Encoding: base64 ◄▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ How the file is encoded (I would have rather had this be text/plain, with 7bit encoding)JyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgICAgIEFQSTMyLlRYVCAtLSBXaW4zMiBBUEkgVHlwZSBEZWNsYXJhdGlvbnMgZm9yIFZpc3VhbCBCYXNpYw0KJw0KJyAgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk2IERlc2F3YXJlDQonDQonICBZb3UgaGF2ZSBhIHJveWFsdHktZnJlZSByaWdodCB0byB1c2UsIG1vZGlmeSwgcmVwcm9kdWNlIGFuZCBkaXN0... ◄▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ The encoded definition of several thousand more API declarations, structures, and constants continues from here.NOTE: In the back of my mind, when I encountered this during my initial email tests, I was really wondering about thisBase64 Content Transfer Encoding. But, we will return to this when we examine alternate views and attachments, where itwill make more sense to us. We will also learn how we can fully exploit it and very easily decode it (and also how to avoid it).Two other parameters you may have noticed in the SendEmail() method were IsHTML and AltView.Sending Email Messages as HTMLThe IsHTML parameter in the SendEMail() method sets the state of the Mail.MailMessage object’sBoolean IsBodyHtml flag. If it is set to True, then the SMTP interface will know to set the body textformatting flag to text/html instead of its usual text/plain. It is actually up to email reader software to usethat information and determine how to present the data. For example, some plain text readers will simplyshow the raw data, regardless. However, others will bring up a web interface, such as a WebBrowsercontrol, envelop the text within an HTML body, if it is not already, and present that to the user. Page –8–

This is quite easy to do, but there is a simple test you will need to perform, because some main bodyHTML is sent without HTML/BODY tags, though most are. The easiest test is to simply check to see if“</HTML>” is contained within the message. If not, all you have to do is prepend the text “<HTML><BODY>”in front of the message, and append the text “</BODY></HTML>” behind it. And that is all! Consider thistest, where String variable Msg is assumed to contain the HTML-formatted text of the message body:If Not CBool(InStr(1, Msg, "</HTML>", CompareMethod.Text)) Then Msg contains an HTML wrapper? Msg = "<HTML><BODY>" & Msg & "</BODY></HTML>" no so add one to itEnd IfSuppose I sent the following urgent code red email message (note the True for the IsHTML parameter):Dim Msg As String = "<b>This is bold text</b><p><u>This should be underlined</u><p>" some simple HTML textSendEMail("mercedes_silver@80micro.com", "david.ross.goben@gmail.com", "Test", Msg, True, "smtp.80micro.com")My Gmail account will receive an email with the following at the bottom of the data (sans my notes):From: mercedes_silver@80micro.comTo: david.ross.goben@gmail.comDate: 21 Feb 2011 21:39:04 -0500Subject: TestContent-Type: text/html; charset=us-ascii ◄▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Used second to determine how to display or process the dataContent-Transfer-Encoding: quoted-printable ◄▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ Used first to determine how to decode the data<b>This is bold text</b><p><u>This should be underlined</u><p> ◄▬▬▬▬ The HTML formatted text without HTML or BODY tagsOnce I strip out the header data (I will show this later), I end up with a String variable I named Msg thatcontains the text “<b>This is bold text</b><p><u>This should be underlined</u><p>”. I wouldexpose it within my Web Browser interface control, WebBrowser1, using code similar to the following:set the web browser to the same location as my usual text display controlMe.WebBrowser1.Bounds = Me.RichTextBox1.BoundsMe.RichTextBox1.Visible = False hide my plain text/Richtext textboxIf Not CBool(InStr(1, Msg, "</HTML>", CompareMethod.Text)) Then Does my Msg contain an HTML wrapper? Msg = "<HTML><BODY>" & Msg & "</BODY></HTML>" no so add one to itEnd Ifset web browser contents to that of my email message body and display itMe.WebBrowser1.DocumentText = MsgMe.WebBrowser1.Visible = True expose the web browser The two lines of text are dutifully displayed using the HTML formatting I assigned to them. The first line was Bold, and the second line was underlined. The urgent code red message was processed and read in time! The world is once again safe. There is so much more to explore if you truly want to create a full-featured email processor. The Internet Message Format document, RFC 2822 (www.ietf.org/rfc/rfc2822.txt), outlines all the gory details of email formatting.I should close this sub-section by saying that the message data on multi-line documents should befurther processed to ensure that the data is properly formatted for your web browser, rich text box, orsimple text box, such as by decoding special tags that may have been added, such as to representUnicode text within the simple 7-bit ASCII text format required for email transactions, for example.Data in an email is a series of lines, each terminated by a vbCrLf (Carriage Return and Linefeed – codes13 and 10, respectively). Often these line terminators are not a part of the original text, but are requiredto limit the line width of the email data. In these cases they are tagged, such as by using a “soft return”flag, like the equals sign “=” used by Quoted-Printable encoding. These must be decoded and removedbefore displaying the text. Also with Quoted-Printable-encoded text, if a space character precedes avbCrLf, then that space is converted to a special hexadecimal format, “=20”, which I habitually callHex-Tags. Also, if there are any 8-bit characters embedded in the message, then you should convertthem to Hex-Tags, otherwise the system will automatically encode the data to Base64, regardless ofwhat you really want, such as Quoted-Printable, simply to ensure 100% original data integrity.Fortunately, I will later present very simple functions to allow Quoted-Printable encoding of 8-bit textthat will convert any 8-bit codes to 7-bit without losing integrity, as well as decode Quoted-Printable-encoded and Base64-encoded data back to its original form. Page –9–

Sending Alternate Message ViewsAnother thing I want to explore with you is one of the more interesting parameters I have listed for theSendEMail() method, and that is AltView.The AltView parameter is declared as a System.Net.Mail.AlternativeView object. Even though mySendEMail() method presently allows for only one alternative view, which is usually all we ever reallyneed, the .NET SMTP processor will actually allow for as many as you want, in compliance to RFC2822, as though we would want to spend the rest of our miserable lives toiling over the variousformatting of a single email to say “Thanks for the $1 on my birthday” to Great Aunt Ethel. However,the real reason for this is more mundane: some people simply want to send both a “pretty” version oftheir email and a plain text version for those who may want to view them on a cell phone. Technically,most email processors will, by default, display the alternate view, or the first alternate view they cansupport, leaving the Plain Text version as the “last ditch” option.Typically, most of us tend to send plain text emails, even if they are in factformatted by a Rich Text or HTML editor, failing to add emphasis, bolding, italics,or underlining. Phooey! I still remember the thrill I got when I hit a button on mySelectric II Typewriter and it bolded what I typed, or got my first TypeBall – wecalled them golf balls – that supported italics. I did not even blink when I had to gothough the time and effort of changing the TypeBall just to change fonts.For me, at least, plain text is so monotonous and passé.NOTE: Were I to revert back to the days of no easy bolding, underlining, or italics, I think I would suffer a pulmonaryembolism, as may be apparent from reading my document; these features afford us a platform for curt, succinct expression.Most people prefer their emails to be formatted as HTML or as Rich Text, but they also want the optionto process their text as Plain Text for those who want to read their email on a cell phone, or who arevision-impaired (“Can’t see out of one eye, and I’m blind as a bat in the other,” as Grandpa often said).Most of you are aware that in a VB-written Rich Text editor, using a RichTextBox control, you haveeasy access to the Plain Text version and the Rich Text version of a document. Its Text propertyprovides the Plain Text version, and its Rtf property provides the Rich Text version.But did you know that accessing plain text from HTML formatting can also be easy?An HTML version can be provided by accessing the DocumentText property of their WebBrowsercontrol, as most of you are already aware. But a Plain Text rendering has always seemed to be an issue. Ihave seen a number of home-spun HTML editors that provide a Plain Text version of their data bymanually stripping out all the HTML Text Tags, plus any special formatting that might be stored withinor between them, on top of going through the often arduous task of interpreting all the special HTMLEntities in order to provide that “simple” plain-text version. This adds up to a whole lot of work.NOTE: An HTML Text Tag is a thing starting with “<” and ending with “>”, such as “<HTML>” or “</BODY>”.NOTE: HTML Entities start with an ampersand (&) and end with a semicolon (;), such as “&lt;” to represent anintentional “<”,“&gt;” for an intentional “>”, “&nbsp;” (non-breaking space) for a blank space “ ” where a spacemight normally be ignored, plus “;;” for an intentional “;”. Following is a list of the HTML Reserved Entities:Character Entity Number Entity Name Description" &#34; &quot; quotation mark (?) &#39; &apos; apostrophe (‘)& &#38; &amp; ampersand (&)< &#60; &lt; less-than (<)> &#62; &gt; greater-than (>)As you can see, there are two versions of tags; one that includes the decimal ASCII code, and one that includes the typical or“classic” representation. The Entity Number also allows 8- or 16-bit extended characters to be displayed by a 7-bit source. Page –10–

Even though I have seen a number of utilities, both commercial and shareware, that offer this kind ofservice, you can in fact bypass them and remove better than 75% of that work with this 1-line function:******************************************************************************* Function Name : QConvertHTML2Text Purpose : Short-Form Convert HTML formatted text to plain text : Returns : Provided a simple HTML source string, it will return a Plain Text : string with HTML code removed.*******************************************************************************Public Function QConvertHTML2Text(ByVal HTMLText As String) As String Return RegularExpressions.Regex.Replace(HTMLText.Replace("&nbsp;", " ").Replace("&quot;", """").Replace("&apos;", _ ""), "<[^>]*>", "").Replace("&lt;", "<").Replace("&gt;", ">").Replace("&amp;", "&").Replace(";;", ";")End FunctionThe above function will also remove all the extra data within the HTML tags. Just invoke it like this:“Dim PlainText As String = QConvertHTML2Text(HtmlText)”.NOTE: In a pinch, copy from the HTML display of a WebBrowser control, paste it to Notepad, then copy it as plain text, butthis does not provide for line formatting, and can sometimes look almost as disorganized as a college dorm room.However, the following enhanced method does 99% of the work that any commercial package offers:******************************************************************************* Function Name : ConvertHTML2Text Purpose : Convert HTML formatted text to plain text : Returns : Provided a complex HTML string, it will return a Plain Text string : with all HTML codes and formatting removed from it. : NOTE : Numerous of these conversions will convert the text to 8-bit, : though most of these sysmbols will not be encountered in most : HTML documents we produce. But regardless of that, if you wish : to make this conversion the main body message of an email, you : may have to further convert this using ForceQuotedPrintable() : to maintain Quoted-Printable encoding and avoid Base64, even : though this is typically not an issue. However, some few really : primitive email readers, typically those that simply allow you : to preview email messages, without fully loading them, will not know how to support Base64, or will not bother with it, but simply : display the raw data. RFC 2045 requires email handlers to support it.*******************************************************************************Public Function ConvertHTML2Text(ByVal HTMLText As String) As String instantiate an initially blank StringBuilder object Dim Sb As New StringBuilder() first remove leading whitespace of each line and append the result to the StringBuilder Dim ary() As String = Split(HTMLText, vbCrLf) For Each S As String In ary Sb.Append(S.TrimStart(Chr(9), " "c)) Next replace reserved entities (except <, >, and &) Sb.Replace("&quot;", """").Replace("&apos;", "").Replace("&nbsp;", " ") replace HTML paragraph, line breaks, and table entry terminators with vbCrLf Sb.Replace("<p>", vbCrLf).Replace("<P>", vbCrLf).Replace("</p>", vbCrLf).Replace("</P>", vbCrLf).Replace("<br>", _ vbCrLf).Replace("<BR>", vbCrLf).Replace("</td>", vbCrLf).Replace("</TD>", vbCrLf) replace ISO 8859-1 Symbols (160-255). Note that any matches will make the text 8-bit Sb.Replace("&iexcl;", "¡").Replace("&cent;", "¢").Replace("&pound;", "£").Replace("&curren;", _ "¤").Replace("&yen;", "¥").Replace("&brvbar;", "¦").Repl

Add a comment

Comments

google | 02/03/15
I want to see what what it feels like to have a million dollars in bitcoins. My bitcoin donation address is 3FsNSHj1HTvmTiKdr7NAFBpUo7CGVgsHNe lettheloveflow2015@gmail.com

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET

This sample excerpt show you how to easily process, encode, and decode email. It also shows you how to easily perform complex outbound SMTP email, and ...
Read more

Send (SMTP) and Receive (POP3) Email with Ease under VB ...

Send (SMTP) and Receive (POP3) Email with Ease under VB.NET: Email: ... VB.NET: Views: 11871 ... This Class Library includes an SMTP class that supports ...
Read more

Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET

×Close Share Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET
Read more

recive email message program code in vb.net - CodeProject

recive email message program code in vb.net. ... Send (SMTP) and Receive (POP3) Email with Ease under VB.NET How To Receive Email's
Read more

www.planet-source-code.com

... Send (SMTP) and Receive (POP3) Email with Ease ... and Retrieve (POP3) Email with Ease under VB.NET.pdfVBNetEmail/VBNetEmail/My Project/Application ...
Read more

Retrieve | LinkedIn

Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET. 20,021 Views. suchitmoon. Sprocket -Side Stand Retrieve System. 10,182 Views. LianaLi5.
Read more

Vb.net | LinkedIn

View 408261 Vb.net posts ... do not hesitate to get in contact and I can send you on ... Send (SMTP) and Retrieve (POP3) Email with Ease under VB.NET.
Read more

ImageMixer 3 SE Guide v6 D1 ENG Rev0 - scribd.com

... screen captures of the software under ... Send (SMTP) and Retrieve (POP3) Email with Ease ... (SMTP) and Retrieve (POP3) Email with Ease under ...
Read more