Click here to Skip to main content
12,292,953 members (63,828 online)
Click here to Skip to main content
Add your own
alternative version


109 bookmarked

Send mail without specifying an SMTP server

, 12 Apr 2005 Ms-PL
Rate this:
Please Sign up or sign in to vote.
A class derived from CSMTPConnection that queries the MX record for a target domain and uses that to send mail


Quite frequently, you hear people asking how they can send an email from their applications to a specific email address without prompting the user for a relaying SMTP server. The most commonly suggested solution is to use MAPI and get a list of SMTP servers from the user's registry, but this assumes that the user has configured a MAPI compliant email client on his machine. I always reply with my solution of querying the MX record for the target domain and then SMTP-chatting to that server directly - it's easy to do, it works on any machine and it's also the fastest way to send email (minimum number of SMTP hops).

Starting with VC++ 7, ATL includes the CSMTPConnection class which lets you send mail, provided you give it an SMTP server to connect to. I derived a class (CSMTPConnection2) from CSMTPConnection which lets you pass in the target domain name directly and the class queries the MX records using the default DNS on the client machine, gets a list of SMTP servers (depending on the number of MX records returned) and connects to the first SMTP server that works okay. The only visible change is to the Connect method, and even for the Connect method, the method signature remains the same. The first parameter (an LPCTSTR) now represents the target domain name instead of the SMTP hostname. So it should be pretty easy to modify your existing code. Just change all references to CSMTPConnection in your code to CSMTPConnection2 and you are done.

Using the class

  • #include the header file for the class

    #include "smtpconnection2.h"

    The header file includes a #pragma linker directive to include Dnsapi.lib

  • Use the CSMTPConnection2 class just as you would use the CSMTPConnection class (it's assumed that CoInitialize has been called prior to invoking and using this class)

    CMimeMessage msg;
    msg.SetSubject("Hello World");
    msg.AddText("Hmmm, this should work fine!");
    //msg.AttachFile("some file path");
    CSMTPConnection2 conn;
    //You need to specify the domain name of the recipient email address
        if( conn.SendMessage(msg) == TRUE )
            std::cout << "Mail sent successfully" << std::endl;

Class requirements

  • You'll need VC++ 7 or above (for the ATL classes)

  • This code will run only on Windows 2000 or later (because of the DNS API that's used to query the MX record)

  • You do not need MFC (the CString that's used is shared between MFC/ATL and I specifically used CSimpleArray instead of an MFC array class)


Note that, because the class looks up the MX record and SMTPs directly into the mail server for each domain name, you cannot use this class to send mails to multiple-domains in one go.

Source listings

Header file

    Copyright(C) Nishant Sivakumar (
    Please maintain this copyright notice if you distribute this file
    in original or modified form.

#pragma once
#include <atlsmtpconnection.h>
#include <Windns.h>

#pragma comment(lib,"Dnsapi.lib")

class CSMTPConnection2 : public CSMTPConnection
    BOOL Connect(LPCTSTR lpszHostDomain, DWORD dwTimeout = 10000) throw();
    void _GetSMTPList(LPCTSTR lpszHostDomain, CSimpleArray<CString>& arrSMTP);

Cpp file

    Copyright(C) Nishant Sivakumar (
    Please maintain this copyright notice if you distribute this file
    in original or modified form.

#include "StdAfx.h"
#include "smtpconnection2.h"

BOOL CSMTPConnection2::Connect(LPCTSTR lpszHostDomain, 
                               DWORD dwTimeout /*= 10000*/) throw()
    CSimpleArray<CString> arrSMTP;
    _GetSMTPList(lpszHostDomain, arrSMTP);
    for(int i=0; i<arrSMTP.GetSize(); i++)
        if(CSMTPConnection::Connect(arrSMTP[i], dwTimeout) == TRUE)
            return TRUE;
    return FALSE;

void CSMTPConnection2::_GetSMTPList(LPCTSTR lpszHostDomain, 
                                   CSimpleArray<CString>& arrSMTP)
    if(DnsQuery(lpszHostDomain, DNS_TYPE_MX, DNS_QUERY_STANDARD,
        NULL, &pRec, NULL) == ERROR_SUCCESS)
        PDNS_RECORD pRecOrig = pRec;
            if(pRec->wType == DNS_TYPE_MX)
            pRec = pRec->pNext;


As usual, feedback is welcome and appreciated whether it's constructive or not.


This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


About the Author

Nish Nishant
United States United States
Nish Nishant is a Software Architect/Consultant based out of Columbus, Ohio. He has over 16 years of software industry experience in various roles including Lead Software Architect, Principal Software Engineer, and Product Manager. Nish is a recipient of the annual Microsoft Visual C++ MVP Award since 2002 (14 consecutive awards as of 2015).

Nish is an industry acknowledged expert in the Microsoft technology stack. He authored
C++/CLI in Action for Manning Publications in 2005, and had previously co-authored
Extending MFC Applications with the .NET Framework for Addison Wesley in 2003. In addition, he has over 140 published technology articles on and another 250+ blog articles on his
WordPress blog. Nish is vastly experienced in team management, mentoring teams, and directing all stages of software development.

Contact Nish : You can reach Nish on his google email id voidnish.

Website and Blog

You may also be interested in...

Comments and Discussions

GeneralRe: Send without smtp server Pin
Dipak V Bava24-Apr-09 7:32
memberDipak V Bava24-Apr-09 7:32 
GeneralRe: Send without smtp server Pin
daluu16-Oct-10 20:32
memberdaluu16-Oct-10 20:32 
QuestionWhat about VC++ 2008? Pin
Member 31360566-Feb-09 22:55
memberMember 31360566-Feb-09 22:55 
AnswerRe: What about VC++ 2008? Pin
Dave Calkins28-Feb-09 3:45
memberDave Calkins28-Feb-09 3:45 
GeneralRe: What about VC++ 2008? Pin
Janma16-May-10 21:12
memberJanma16-May-10 21:12 
GeneralRe: What about VC++ 2008? Pin
daluu9-Oct-10 19:16
memberdaluu9-Oct-10 19:16 
GeneralUseful article Pin
om7-Jan-09 12:33
memberom7-Jan-09 12:33 
QuestionCOM and ActiveX implementation? Pin
daluu1-Nov-08 19:40
memberdaluu1-Nov-08 19:40 
General.NET alternative [modified] Pin
daluu3-Oct-08 20:25
memberdaluu3-Oct-08 20:25 
GeneralRe: .NET alternative [modified] Pin
Jamil Hallal13-Feb-16 12:21
professionalJamil Hallal13-Feb-16 12:21 
GeneralQuite useless code! Pin
Elmue17-Jul-08 11:48
memberElmue17-Jul-08 11:48 
Generalatlsmtpconnection.h Pin
theCPkid28-Jun-08 4:06
membertheCPkid28-Jun-08 4:06 
GeneralProps to Nish Pin
bvaghani26-Jan-08 16:31
memberbvaghani26-Jan-08 16:31 
Generalrename Connect to ConnectDomain Pin
Herbert Yu29-Nov-07 10:29
memberHerbert Yu29-Nov-07 10:29 
GeneralRe: rename Connect to ConnectDomain Pin
Yogesh P. Dhakad13-Jan-08 3:03
memberYogesh P. Dhakad13-Jan-08 3:03 
GeneralNot working with all providers [modified] Pin
Manthis18-Nov-07 23:46
memberManthis18-Nov-07 23:46 
GeneralWorks for me on Pin
Herbert Yu29-Nov-07 9:45
memberHerbert Yu29-Nov-07 9:45 
GeneralRe: Not working with all providers Pin
Munahid28-Sep-09 22:47
memberMunahid28-Sep-09 22:47 
QuestionMail subject not working Pin
Manthis18-Nov-07 22:52
memberManthis18-Nov-07 22:52 
AnswerRe: Mail subject not working Pin
Herbert Yu29-Nov-07 9:35
memberHerbert Yu29-Nov-07 9:35 
GeneralSecurity Pin
Mike Booker18-Sep-07 15:57
memberMike Booker18-Sep-07 15:57 
GeneralRe: Security Pin
Herbert Yu29-Nov-07 9:37
memberHerbert Yu29-Nov-07 9:37 
GeneralVirus detection Pin
nat2kus21-May-07 10:38
membernat2kus21-May-07 10:38 
GeneralRe: Virus detection [modified] Pin
nat2kus21-May-07 10:44
membernat2kus21-May-07 10:44 
GeneralRe: Virus detection Pin
Herbert Yu28-Nov-07 8:13
memberHerbert Yu28-Nov-07 8:13 
QuestionHTML msg Pin
RisKhan9-Apr-07 0:49
memberRisKhan9-Apr-07 0:49 
AnswerRe: HTML msg Pin
daluu3-Oct-08 20:30
memberdaluu3-Oct-08 20:30 
QuestionDoes anyone have this in 2005 Pin
wultepjo6-Mar-07 20:52
memberwultepjo6-Mar-07 20:52 
AnswerRe: Does anyone have this in 2005 Pin
daluu17-Jul-08 13:35
memberdaluu17-Jul-08 13:35 
GeneralNot Working Pin
murtazadhari5-Feb-07 5:13
membermurtazadhari5-Feb-07 5:13 
GeneralRe: Not Working Pin
pascal roca3-Apr-07 4:24
memberpascal roca3-Apr-07 4:24 
GeneralMail using VC++ Pin
SyamlalS31-Dec-06 23:53
memberSyamlalS31-Dec-06 23:53 
GeneralRe: Mail using VC++ Pin
RisKhan9-Apr-07 0:52
memberRisKhan9-Apr-07 0:52 
GeneralRe: Mail using VC++ Pin
SyamlalS9-Apr-07 0:56
memberSyamlalS9-Apr-07 0:56 
GeneralRe: Mail using VC++ Pin
xiayuxue12-May-08 23:01
memberxiayuxue12-May-08 23:01 
GeneralAsserting on m_Overlapped.hEvent==0 Pin
harryshcoffee17-Dec-06 3:41
memberharryshcoffee17-Dec-06 3:41 
GeneralGreat correction on CSMTPConnection Pin
Herbert Yu29-Nov-07 9:50
memberHerbert Yu29-Nov-07 9:50 
Generalregarding domain name of the recipient email address Pin
chandrashekar T.J13-Dec-06 19:05
memberchandrashekar T.J13-Dec-06 19:05 
GeneralPlease see [Asserting on m_Overlapped.hEvent==0] above Pin
Herbert Yu29-Nov-07 9:52
memberHerbert Yu29-Nov-07 9:52 
Questionregarding server name. Pin
tj_terror12-Dec-06 22:27
membertj_terror12-Dec-06 22:27 
GeneralGiving Exception For Subject Pin
Mahesh Kulkarni22-Nov-06 0:57
memberMahesh Kulkarni22-Nov-06 0:57 
QuestionRequest to compile the file Pin
sudarshans17-Oct-06 23:59
membersudarshans17-Oct-06 23:59 
AnswerRe: Request to compile the file Pin
daluu5-Nov-06 8:26
memberdaluu5-Nov-06 8:26 
QuestionPython script alternative & cross-platform? Pin
daluu15-Sep-06 9:39
memberdaluu15-Sep-06 9:39 
GeneralWhy yahoo filter... Pin
oasis_i26-Aug-06 23:33
memberoasis_i26-Aug-06 23:33 
General... :( i am going nuts... Pin
k999922-Aug-06 1:12
memberk999922-Aug-06 1:12 
GeneralRe: ... :( i am going nuts... Pin
k999922-Aug-06 14:33
memberk999922-Aug-06 14:33 
Generalthanks very much & one question,:) Pin
djjj0619-Aug-06 23:37
memberdjjj0619-Aug-06 23:37 
GeneralUsage Pin
nat2kus16-Aug-06 17:44
membernat2kus16-Aug-06 17:44 
GeneralRe: Usage Pin
Nishant Sivakumar17-Aug-06 1:25
staffNishant Sivakumar17-Aug-06 1:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.160518.1 | Last Updated 12 Apr 2005
Article Copyright 2005 by Nish Nishant
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid