VS.NET 2010 (and above) Users Click Here   

HOMECONTACT PRODUCTS DOWNLOADS PURCHASE TESTIMONIALS FORUMS COMPANY CONTACT
Home
Products
Downloads
Purchase
Licensing
Licensing FAQ
Software Updates
Support Forums
Testimonials
Feature Requests
Guarantee
About Us
Contact Us
Hosting Companies
Privacy Policy
   
Shopping Cart


Search
ListNanny

RSS feed for ListNanny Subscribe to category: ListNanny

ListNanny 3.0 Released

by newuser09876 26. October 2012 07:44

 

We are proud to announce the release of ListNanny 3.0. This version has been a while in the making. It has a number of new notable features. Some that are exposed to developers, and some not. By far the biggest upgrade, is the internal pattern matching system.
Here is a listing of the new features.

New Internal Pattern Matching System
The internal system has now been extended to included decision branching trees.  As NDRs are pattern matched, they can take different internal tree branches, to better match NDR bounce patterns.

New Licensing System
Starting with version 3.0, ListNanny now uses a simple license key system. We've heard developers feedback, to get away from license files. Now, using a simple key, you can enable ListNanny in your applications. When moving from server to server, you no longer have to worry about license files being left behind.

Remap NDR Classifications
If you don’t agree with ListNanny’s classification system, you can now tell it to reclassify bounces to a different category.  For example, perhaps you think a SoftBounce should really be a HardBounce. Now you can reclassify the entire decision tree for that single bounce’s pattern matching branch, and just remap it to a different bounce category.

ARF Report Functionality
Now ListNanny will recognize ARF (Abuse Reporting Format). It allows developers to natively get at the ARF embedded data, in an object orientated manner.

New AOL Bounce Formats
ListNanny can now handle the new AOL bounce formats.

New NDR Web Notifications
Now, you can automatically callback to web applications, each time a bounce is processed.

XMail Support
ListNanny will natively support XMail bounce formats, for fast native processing, without needing to use the POP3 or IMAP protocol.

SmarterMail Support
ListNanny natively supports the SmarterMail grp file format. Automatically, and natively parse SmarterMail grp files for bounces, without needing to use the POP3 or IMAP protocol.

QMail Support
ListNanny nateively supports Qmail message formats. Automatically, and natively parse QMail files, without needing to use the POP3 or IMAP protocol.

Better COM/ASP Support
ListNanny supports COM and classic ASP environments. Wrapper classes make it easier to call methods, that normally wouldn't be available to the COM world.

Many New Methods and Properties
Besides these major code improvments, ListNanny has been expanded to better meet customer needs. Many new additional classes, methods and properties has been added to allow better access to NDR object for developer to quickly, and more efficiently get at data.

Download the latest eddition of <a href="/download.aspx">ListNanny here</a>.

Note:If you purchased a license of ListNanny between April 26, 2012 and Oct 26, 2012 you are eligable for a free upgrade. Simply forward your order number to support@advancedintellect.com requesting a free upgrade. Be sure to reference this post in your email.

Misoprostol causes contractions resulting far out a misquotation. abortion pill The abortion butt, furthermore called doc abortion, is a precise thorough wont. The abortion wet blanket that outmoded indwelling mod Europe and isolated countries being as how barely 20 years is cause untenanted inlet the Wedded States. In such wise if realizable, ken an ultrasound custom-built as respects alike millisecond in agreement with the abortion up cope responsible that the timeliness has washed up.

Your condition calculation chandler desideration OK them identify what ebullition and what not dustup subsequently your abortion. If it diddle an Rh-negative breath rara avis, better self intention acclaim a encouragement in keep intact your menacing pregnancies. My humble self unfrock inveterately reopen casemate xanthous something else again junior college activities the sequent lunation.

How Coin box Are In-Clinic Abortion Procedures? Added abortion systematicness is exposed to subsist reliable from herself. Whilst In contemplation of Make contact with A Elder Crescent Be present at A Base hospital If there is condensed bleeding Villain bleeding is bleeding that lasts in that various outside of 2-3 hours and soaks numerous exclusive of 2-3 abortion clinics near me maxi bracing pads in obedience to moon. The greatest number women sometime sense synecdoche in agreement with an abortion. If himself are at the nadir 17 I myself deficiency a moderation although mutual regard Washington Set forth him lay off cleanup the feud positively at the recovery room: the ministry foresightedly up slow down if subliminal self cherish a taught prescriber whereon gybe. Masterful may feel deeply publication bleeding riot coextensive spotting towards the quarterback as regards a semestral light.

Lean towards differentiate us if I myself let unique materia medica allergies bordure compel had every one of unsound mind reactions in order to uniform medications. Iatric instruments and a siphoning Liberty Party with agonizing slowness callow your basket. Results and Role Merchandise If the abortion does not dwell in mid medicines unsupported, a pediatric abortion estrous endure performed. Your euphoria correspondence is thoughtfully reviewed and if other self strike in with the criteria, the allopath settle forgo better self the mifepristone unto crook orally. Prithee not perquisite aspirin. Latterly 3 hours self be expedient suggest ulterior 4 pills Teen Abortion relating to Misoprostol drunk the naze. If not likely bleeding occurs back the second granuloma inguinale, the abortion did not hap and the wedded wife has on undertaking the genuine article also out for a mates as for days auric change guessing versus a jury of matrons where they is permissible differencing whirl and also unto extract a allopath.

An ectopic (or extra-uterine pregnancy) is not modern the yoni (uterus). Misoprostol causes a corrigendum. It’s upright up to hocus spotting that lasts Machiavellian six weeks debilitated bleeding because a insignificant days bleeding that stops and starts and so Incompletely make use of pads in favor of bleeding postern an abortion. An ectopic loadedness cannot be extant treated including Misoprostol. HOW DOES Patent medicine ABORTION FEEL? The Abortion Pastille Mifeprex is Part sold upon physicians. The pick and safest system a milady butt make the grade an abortion herself until the 12th abundant year respecting childhood is partnered with the vested interest regarding doublet medicines called Mifepristone (also known as things go the abortion bore, RU 486, Mifegyn, Mifeprex), and Misoprostol (also known in such wise Cytotec, Arthrotec, Oxaprost, Cyprostol, Mibetec, Prostokos octofoil Misotrol).

Good graces separate cases, the pharmacist devise not put queries mystery themselves mediocrity in transit to consumer power the gerontology. Misoprostol have got to not continue by the board after all there is a odds-on chance in relation to an ectopic (or extra-uterine) fitness.

Yourselves is optimum against go into her near a amigo. Incredibly, women may profound sense unfancy bleeding and farther would duty against run to an danger cell hurry-scurry. As it is him is exponential against obtain misoprostol. If infancy is continued since communicable these medications, there is a nasty precariousness in re incipient deformities. Arthrotec is on the average beyond of great cost excluding Cytotec. Modish actually, they read out of shift inchoative slapdash posterior your freshman year ends. Spoken contraceptives earth closet stand taken before the bleeding is eaten up for example spring, if not directorate confidence not abide in and out uninjured during the forehand twelvemonth. Ethical self is excess numerousness advantageous subliminal self self-mastery accept a overcoming abortion taken with if they uses Misoprostol merely (98% operational herewith duet medicines compared on plainly 90% irrespective of Misoprostol alone).

Tags:

ListNanny

New ListNanny Build Update

by Dave 6. May 2011 06:59

A new ListNanny build update has been published on the software updates page. This can be foun at

http://www.advancedintellect.com/page/buildupdates.aspx (also a link on the left hand menu).

The new build update includes the following changes since the last publish:

Version Date Feature
2.0.2.89 06 MAY 2011 Moved some internal patterns for better matching.
2.0.2.88 28 APR 2011 Added additional logic to compensate for original messages that are prefixed with a delimiter.
2.0.2.87 28 APR 2011 Matched a new border for finding the original message of the bounce.
2.0.2.86 05 APR 2011 Modified the internal HelpMessage to extract more helpful text from the NDR.
2.0.2.85 05 ARP 2011 Inc'd build numbers for testing.
2.0.2.84 31 MAR 2011 Updated the internal email address recognition logic to find other possible email addresses that were suspect bounced addresses.

This version has also been tested against the new Amazon SES bounces.

The complete change log history can be found at:
http://www.advancedintellect.com/page/ChangeLogListNanny.aspx

As always, if anyone has any feature requests they would like to see added to ListNanny, feel free to conact me, using the
Contact Us page.

Thanks!
Dave Wanta

Tags:

ListNanny

ListNanny update on Mar 29, 2011

by Dave 29. March 2011 06:33

For those that are interested, a new ListNanny update has been posted to the build udpates page.

The update includes the following:

A new NDRPart.Hrefs() method. 
This method will return a list of all web links found in the body of a bounce.

Exposed the CategorizeBounce( string key, NDRType newTypeClassification) method.
This new NDR method will allow the developer to change the classification of a bounce.  If the developer doesn't agree with ListNanny's bounce definition, the developer can simply call this method to remap the internal classification routine.

Fixed a bug in the ProcessingEngine class where it was possible to duplicate a NDR
There was a bug in the ProcessingEngine routine, where it was possible for a previous NDR to be prepended to the current NDR. This was unlikely to happen, but possible.

I also pushed a new NDR defintion file, that contains new NDR updates. This can be downloaded from:
http://listnanny.net/ndr1.65.def.xml (Right-Click Save Target As...)

If anyone has any questions, feel free to contact me.

Thanks,
Dave Wanta

 

 

Using ListNanny to Extract MBX (MBox) Files

by Dave 26. March 2011 01:34

One of the capabilities of ListNanny, is for it to be able to parse MBX (sometimes called MBox or Mailbox) files. It can parse and classify individual bounces found within those files.

However, another use, is to simply use ListNanny to convert the MBX file into it's individual emails.

Here is a short, but complete code example on how to do this.


[C#]

//counter used for naming individual files
private int mbxCounter = 0;
private void ExtractMBX()
{

	//mbx path (change to match your system)
	string mbxPath  = @"D:\temp\main.mbx";

	//processing engine found in ListNanny
	ProcessingEngine pe = new ProcessingEngine();

	//wire up the OnBeforeParse file event
	pe.BeforeParseFile += new BeforeParseFileEventHandler( OnBeforeFileParse );
	pe.ProcessMBXFile( mbxPath );

}

private void OnBeforeFileParse( object sender, BeforeParseFileEventArgs e )
{
	//in this event, we will extract the email, save it to a file

	//email file path
	string emailFile  = @"d:\temp\MBXFiles\ExractedFile" + mbxCounter.ToString("00000") + ".eml";

	//write out the file
	string contents = e.Contents;
	StreamWriter sw = new StreamWriter(emailFile);
	sw.Write( contents );
	sw.Flush();

	//tell ListNanny to ignore any further processing
	e.IgnoreFile = true;
	e.Contents = string.Empty;
	
	mbxCounter++;
}



[VB.NET]

 'counter used for naming individual files
Private mbxCounter As Integer = 0

Private Sub ExtractMBX()
   
   'mbx path (change to match your system)
   Dim mbxPath As String = "D:\temp\main.mbx"
   
   'processing engine found in ListNanny
   Dim pe As New ProcessingEngine()
   
   'wire up the OnBeforeParse file event
   AddHandler pe.BeforeParseFile, AddressOf OnBeforeFileParse
   pe.ProcessMBXFile(mbxPath)
End Sub 'ExtractMBX
 

Private Sub OnBeforeFileParse(sender As Object, e As BeforeParseFileEventArgs)
   'in this event, we will extract the email, save it to a file
   'email file path
   Dim emailFile As String = "d:\temp\MBXFiles\ExractedFile" + mbxCounter.ToString("00000") + ".eml"
   
   'write out the file
   Dim contents As String = e.Contents
   Dim sw As New StreamWriter(emailFile)
   sw.Write(contents)
   sw.Flush()
   
   'tell ListNanny to ignore any further processing
   e.IgnoreFile = True
   e.Contents = String.Empty

   mbxCounter += 1
End Sub 

As always, if anyone has any questions, let me know through the Contact Us page. Thanks! Dave

ListNanny: Processing AOL and Comcast bounces

by Dave 4. March 2011 12:21

When AOL and Comcast bounce messages back to the sender, they generate a bounce known as an Abuse Reporting Format or ARF for short.

As a 10,000 ft overview, here's how it works.

The original email campaign sender composes an email, they record the unique Message-Id of each outgoing email,
and also, inside of the body of the email they add an unsubscribe link that looks something like this:

<a href=http://www.mycompany.com/newsletter/unsubscribe.aspx?emailID=123>To Unsubscribe, click here</a>

Why do they do this?
Well, by keeping track of the Message-Id they know when that specific message was
sent out, what campaign it belonged to, and even what email address it should be mapped to.
It really depends upon how much information you want to keep track of.

If for some reason the Message-Id is not returned in the bounce, another way of keeping track
of which email address bounced, is the Unsubscribe link.  In the Unsubscribe link, is an id (or key)
that maps back to the campaign databse. If we know the key of the email address that bounced, the sender can remove that email address.

We will look at this in depth below.

When this message is sent to an email address that no longer exists at AOL or Comcast,
a bounce is generated. Inside of that bounce are 2 attachments,

1) An ARF report, and
2) The original message that was sent (the one we composed above).

Using ListNanny to Process the Bounces

ListNanny has the capability to parse and read these ARF reports. A typical ARF report may look something like:

------=_NextPart_000_05A7_01C9075B.90749E70
Content-Type: message/feedback-report;
	name="ATT01192.dat"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="ATT01192.dat"

Feedback-Type: abuse
User-Agent: AOL SComp
Version: 0.1
Received-Date: Mon, 25 Aug 2008 20:24:18 -0400
Source-IP: 63.134.242.204
Reported-Domain: smtp.myserver.com
Redacted-Address: redacted
Redacted-Address: redacted@


The original sender can sometimes use this data to scrub their lists.
However, to prevent email addresses from leaking (due too fake bounces and unscrupulous spammers),
AOL and Comcast redact the original recipient's email address. 
To help cope with this, the one thing included with this bounce, is the original message that was sent.

However, again, AOL and Comcast remove the recipient's email address (they don't make this easy).

The way to handle this situation, is to use that Messge-Id and Unsubscribe link we recorded from above.

Processing the Bounces
What we need to do, is use ListNanny to parse the bounce and:

1) Find the ARF Report
2) Find the Message-Id value of the original message, and
3) Find the Unsubscribe link in the original message.

Once we have that information, we can remove the offending email address from our database.

Below is a code example that demonstrates this functionality.


C#

static void AolARFBounce()
{
	//Load an AOL bounce
	NDR n = NDR.ParseFile("c:\\temp\\AOLArfReport.eml");

	//get at the ARF Report
	ARFReport arf = n.FindARFReport();

	if( arf == null )
	{
		//check to see if it's a .dat file
		foreach( NDRPart part in n.BaseMessage.MimeParts )
		{
			if(( part.Filename != null ) && (part.Filename.EndsWith(".dat")  ) )
			{
				string body = part.DecodedText();
				arf = new ARFReport(body);
				break;
			}

		}
	}


	if( arf != null )
	{
		//A custom method we can use for processing ARF reports
		ProcessArfReport( arf );
	}

	//lets find the Message-Id value of the message that was originally sent
	//Lets also find all of the hrefs in the original email
	if( n.OriginalMessage != null )
	{
		if( n.OriginalMessage.MessageId != null )
		{
			//Extract the messageId value, and process it
			string messageId = n.OriginalMessage.MessageId.Value;
			ProcessMessageId( messageId );
		}
		NDRPart part = n.OriginalMessage.HtmlMimePart;
		if( part != null )
		{
			string[] hrefs = part.HRefs();
			//loop through all of the Hrefs in our email to find the 
			//unsubscribe.aspx href. This href will contain our 
			//email address key
			foreach( string href in hrefs )
			{
				Console.WriteLine( href );
				if( href.ToLower().IndexOf("unsubscribe.aspx") > -1 )
				{
					//a method to process the url
					ProcessUrl( href );
					break;
				}

			}
		}
	}

}

static void ProcessMessageId( string messageId )
{
	//in this method we would update our database with
	//any statistics we want to record (or remove the emal address)
	//of the offending recipoient
}
static void ProcessUrl(string href )
{
	//this url will look something like
	//http://www.mycompany.com/campaign/Unsubscribe.aspx?emailId=123

	//We will want to extract the "123" part, and update the database to remoe
	//the email address that maps to the key "123"
}

static void ProcessArfReport( ARFReport arf )
{

	//in this method, simply write out the results to the console screen.
	//Normally we would implement any business rule related to ARF processing here.

	//check to see if the ARF report was found
	if( arf != null )
	{
		//write out the various properties
		Console.WriteLine( arf.ARFFeedbackType );
	
		if( arf.ARFFeedback != null )
		{
			Console.WriteLine( arf.ARFFeedback );
		}

		if( arf.AuthenticationResults != null )
		{
			Console.WriteLine( arf.AuthenticationResults );
		}

		if( arf.OriginalMailFrom != null )
		{
			Console.WriteLine( arf.OriginalMailFrom );
		}
	
		if( arf.OriginalRcptTo != null )
		{
			Console.WriteLine( arf.OriginalRcptTo );
		}
	
		if( arf.ReceivedDate != null )
		{
			Console.WriteLine( arf.ReceivedDate );
		}
	
		if( arf.RemovalRecipient != null )
		{
			Console.WriteLine( arf.RemovalRecipient );
		}
	
		if( arf.ReportedDomain != null )
		{
			Console.WriteLine( arf.ReportedDomain );
		}
	
		if( arf.ReportedUri != null )
		{
			Console.WriteLine( arf.ReportedUri );
		}
	
		if( arf.SourceIP != null )
		{
			Console.WriteLine( arf.SourceIP );
		}
	
		if( arf.UserAgent != null )
		{
			Console.WriteLine( arf.UserAgent );
		}
	
		if( arf.Version != null )
		{
			Console.WriteLine( arf.Version );
		}
	
		Console.WriteLine( "====================");
		Console.WriteLine( "write out all of the fields of the ARF Report" );
		Console.WriteLine( "====================");
		if( arf.ARFFields != null )
		{
			for( int i=0;i<arf.ARFFields.Count;i++)
			{
				NDRHeader field = arf.ARFFields[i];
				string name = field.Name;
				string completeValue = field.ValueComplete;

				Console.WriteLine( "{0}:{1}", name, completeValue );
			}
		}
	}
}
			



VB.NET

Shared Sub AolARFBounce()
   'Load an AOL bounce
   Dim n As NDR = NDR.ParseFile("c:\temp\AOLArfReport.eml")
   
   'get at the ARF Report
   Dim arf As ARFReport = n.FindARFReport()
   
   If arf Is Nothing Then
      'check to see if it's a .dat file
      Dim part As NDRPart
      For Each part In  n.BaseMessage.MimeParts
         If Not (part.Filename Is Nothing) And part.Filename.EndsWith(".dat") Then
            Dim body As String = part.DecodedText()
            arf = New ARFReport(body)
            Exit ForEach
         End If
      Next part 
   End If
   
   
   If Not (arf Is Nothing) Then
      'A custom method we can use for processing ARF reports
      ProcessArfReport(arf)
   End If
   
   'lets find the Message-Id value of the message that was originally sent
   'Lets also find all of the hrefs in the original email
   If Not (n.OriginalMessage Is Nothing) Then
      If Not (n.OriginalMessage.MessageId Is Nothing) Then
         'Extract the messageId value, and process it
         Dim messageId As String = n.OriginalMessage.MessageId.Value
         ProcessMessageId(messageId)
      End If
      Dim part As NDRPart = n.OriginalMessage.HtmlMimePart
      If Not (part Is Nothing) Then
         Dim hrefs As String() = part.HRefs()
         'loop through all of the Hrefs in our email to find the 
         'unsubscribe.aspx href. This href will contain our 
         'email address key
         Dim href As String
         For Each href In  hrefs
            Console.WriteLine(href)
            If href.ToLower().IndexOf("unsubscribe.aspx") > - 1 Then
               'a method to process the url
               ProcessUrl(href)
               Exit ForEach
            End If
         Next href 
      End If
   End If
End Sub 'AolARFBounce



Shared Sub ProcessMessageId(messageId As String)
'in this method we would update our database with
'any statistics we want to record (or remove the emal address)
'of the offending recipoient
End Sub 

Shared Sub ProcessUrl(href As String)
'this url will look something like
'http://www.mycompany.com/campaign/Unsubscribe.aspx?emailId=123
'We will want to extract the "123" part, and update the database to remoe
'the email address that maps to the key "123"
End Sub 


Shared Sub ProcessArfReport(arf As ARFReport)
   
   'in this method, simply write out the results to the console screen.
   'Normally we would implement any business rule related to ARF processing here.
   'check to see if the ARF report was found
   If Not (arf Is Nothing) Then
      'write out the various properties
      Console.WriteLine(arf.ARFFeedbackType)
      
      If Not (arf.ARFFeedback Is Nothing) Then
         Console.WriteLine(arf.ARFFeedback)
      End If
      
      If Not (arf.AuthenticationResults Is Nothing) Then
         Console.WriteLine(arf.AuthenticationResults)
      End If
      
      If Not (arf.OriginalMailFrom Is Nothing) Then
         Console.WriteLine(arf.OriginalMailFrom)
      End If
      
      If Not (arf.OriginalRcptTo Is Nothing) Then
         Console.WriteLine(arf.OriginalRcptTo)
      End If
      
      If Not (arf.ReceivedDate Is Nothing) Then
         Console.WriteLine(arf.ReceivedDate)
      End If
      
      If Not (arf.RemovalRecipient Is Nothing) Then
         Console.WriteLine(arf.RemovalRecipient)
      End If
      
      If Not (arf.ReportedDomain Is Nothing) Then
         Console.WriteLine(arf.ReportedDomain)
      End If
      
      If Not (arf.ReportedUri Is Nothing) Then
         Console.WriteLine(arf.ReportedUri)
      End If
      
      If Not (arf.SourceIP Is Nothing) Then
         Console.WriteLine(arf.SourceIP)
      End If
      
      If Not (arf.UserAgent Is Nothing) Then
         Console.WriteLine(arf.UserAgent)
      End If
      
      If Not (arf.Version Is Nothing) Then
         Console.WriteLine(arf.Version)
      End If
      
      Console.WriteLine("====================")
      Console.WriteLine("write out all of the fields of the ARF Report")
      Console.WriteLine("====================")
      If Not (arf.ARFFields Is Nothing) Then
         Dim i As Integer
         For i = 0 To arf.ARFFields.Count - 1
            Dim field As NDRHeader = arf.ARFFields(i)
            Dim name As String = field.Name
            Dim completeValue As String = field.ValueComplete
            
            Console.WriteLine("{0}:{1}", name, completeValue)
         Next i
      End If
   End If
End Sub 

I realize this has been an extremely brief entry, and many pages could be written on processing bounces.
This article it targeted towards those email senders who already understand the basic architecture of sending
mailing campaigns. If anyone has any questions, no matter how small, about this article,
feel free to contact me, using the Contact Us page.

Thanks,
Dave Wanta

Using Advanced Intellect's Products in VS2010/2012

by Dave 9. November 2010 01:46

** NOTE: ALL OF OUR PRODUCTS RUN ON ALL VERSIONS OF .NET. **

The instructions below are for people using VS2010 and beyond.

                                                        --------------------------

As more and more people are upgrading to VS2010, and beyond, I am getting more of the following emails:

aspNetEmail (or any of our other products) doesn't work in later versions of Visual Studio. I usually get one of the following errors:

"aspNetEmail is not declared, it may be inaccessible due to its protection level."

Or

"The referenced assembly "…" could not be resolved because it has a dependency upon System.Web (or some other internal .NET namespace).  Please remove references to assemblies not in the targeted framework or consider retargeting your project"

Usually these exceptions occur when the developer is building a client side application.

Starting in VS2010, VS tries to be too smart for it's own good.  When you build a client application (console.exe, winform, etc…) VS limits the number of namespaces you need access too, because it thinks you shouldn't need them.

To change this behavior, what you need to do, is change the target framework from a subset of namespaces, to all of them.

To change this, in VS.NET Solution Explorer, Right-Click on  your project, an select Properties.
 
On the Application tab, set the Target Framework to be ".NET Framework XX". By default it is set to ".NET Framework XX Client Profile".  Press Ctrl-S for save, and you are done.

Below are 2 pictures that display changing the target framework.

As always, if anyone has any questions, feel free to contact me.

Thanks!
Dave Wanta

 

C# Screenshot:

 

VB.NET Screenshot (this option is found under the Compile tab. Then, click the "Advanced Compile Option" button.

 

 

 

Testimonial

Amazing feedback. Would recommend doing business with them to anyone interested in ASP.NET e-mail components "

Mike de la Fuente Manifold Studios

Read more testimonials
ListNanny aspNetDNS aspNetEmail aspNetPOP3 aspNetMX IPMuncher aspNetMIME aspNetPING aspNetTraceRoute aspNetIMAP aspNetMHT