Note: This is not the complete source code--just the main source file.
You can download the full source (with include files) from our sample code archive by clicking on the diskette icons.
// MXbyHexValidEmail sample
// version 2002-08-21
//
// Demonstrates how to obtain MX records with HexValidEmail.
//
// History:
// 2002-08-21 Created
//
// Copyright 2002 Hexillion Technologies. All rights reserved.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND/OR
// FITNESS FOR A PARTICULAR PURPOSE.
#include "stdafx.h"
#include <iostream>
#include "HexComPtr.h"
#include "HexValidEmail.h"
#import "HexValidEmail.dll" no_namespace
using namespace std;
int main(int argc, char* argv[])
{
int iReturn = 0;
try
{
// If we don't have one argument (aside from utility name)...
if( 2 != argc )
{
// Display usage and exit
cout << "Usage: MXbyHexValidEmail domain" << endl;
throw 0;
}
CoInitialize( NULL );
// Declare instance of a licensing-aware _com_ptr_t derivative
HexComPtr< HEX_IIID( IConnectionSync ) > pVE;
// Use this code to get your runtime license key while your license
// file is in place. Then comment the code out and put the runtime
// key in the CreateInstanceLic call below. Your binary will then
// work without the license file.
// _bstr_t bstrKey;
// pVE.RequestLicKey( __uuidof( Connection ), bstrKey );
// cout << "Runtime license key: " << (TCHAR*)bstrKey << endl;
// Create an instance of HexValidEmail.Connection
HRESULT hr = pVE.CreateInstanceLic( __uuidof( Connection ), L"*** Put your runtime license key here ***" );
// If CreateInstance failed...
if( FAILED( hr ) )
{
cout << "Creation of HexValidEmail.Connection instance failed. HRESULT=0x" << hex << hr << endl;
throw -1;
}
// You know you're using the runtime license when the Error property and
// LicensedProcessors property are both zero
bool bUsingRuntimeKey = (0 == pVE->Error) && (0 == pVE->LicensedProcessors);
// Set the timeout
pVE->Timeouts->Item( hexVeTimeoutDnsTotal )->Value = 4000; // 4 seconds
// Require MX records
// This prevents HexValidEmail from allowing domains to just have A records
// and ensures that only real MX records will be returned in the collection.
pVE->Options |= hexVeOptionRequireMx;
// Make up an email address using the supplied domain
_bstr_t bstrEmail = _bstr_t( L"test@" ) + argv[1];
// Do the query by validating to DNS level
pVE->Validate( bstrEmail, hexVeLevelDns );
// If the query failed for a reason other than finding no MX records...
if( hexVeErrSuccess != pVE->Error && hexVeErrNoMxForDomain != pVE->Error )
{
cout << "MX query for " << argv[1] << " failed with error: " << (TCHAR*)GetVeErrorString( pVE->Error ) << endl;
throw -1;
}
// Write an intro
cout << "MX records returned for " << argv[1] << ':' << endl;
// If we didn't get any MX records...
if( hexVeErrNoMxForDomain == pVE->Error )
{
// Say so
cout << "\t(none)" << endl;
throw 0;
}
// Cache pointer to MxRec collection
// This is a 1-based collection
IMxRecsPtr pRecs = pVE->MxRecs;
IMxRecPtr pMX;
long lMax = pRecs->Count;
// For each record in the collection...
for( long l = 1; l <= lMax; l++ )
{
pMX = pRecs->Item( l );
// Print the record
cout << '\t' << pMX->Preference << '\t' << (TCHAR*)(pMX->Exchange);
if( 0 != pMX->Addr )
cout << " [" << (TCHAR*)(pVE->AddrToString( pMX->Addr )) << ']';
cout << endl;
}
}
catch( int i )
{
iReturn = i;
}
CoUninitialize();
return iReturn;
}