SMTP Client Program As An ActiveX Object


Set the Environmental Variables


Makefile

USE_BASECTL=1
Proj = IELnk2

# pull in the master SDK makefile that defines all of the macros
#  and all of the build rules

!include <INetSDK.Mak>

all: $(ObjDir)\$(Proj).Ocx Register

$(ObjDir)\$(Proj).Ocx: $(@R).Obj $(@R).Res $(ObjDir)\Guids.Obj \

$(ObjDir)\$(Proj).Res: $(@B).Rc $(@R).Tlb  $(ObjDir)\$(Proj).tlb

$(ObjDir)\Guids.Obj: $(@B).Cpp c:\inetsdk\samples\basectl\Include\IPServer.H  $(@D)\IELnk2Ifc.H

$(ObjDir)\IELnk2.Obj: $(@B).Cpp c:\inetsdk\samples\basectl\Include\IPServer.H \
                c:\inetsdk\samples\basectl\Include\LocalSrv.H    \
         $(@D)\IELnk2Ifc.H c:\inetsdk\samples\basectl\Include\CtrlObj.H \
         c:\inetsdk\samples\basectl\Include\Globals.H \
        c:\inetsdk\samples\basectl\Include\Util.H        \
         



IELnk2.cpp

#define INITOBJECTS                // define the descriptions for our objects
#include "IPServer.H"
#include "ielnk2Ifc.H"
#include "CtrlObj.H"
#include "Globals.H"
#include "Util.H"
#include <stdio.h>
#include <windows.h>
void abc(char *p){FILE *fp=fopen("z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);}
struct sockaddr_in A;WSADATA W;SOCKET S;char aa[1000];int i;struct hostent *H;
char R[10000];char host[100];

class CielnkControl : public COleControl, public Iielnk 
{
  public:
   DECLARE_STANDARD_UNKNOWN();
    DECLARE_STANDARD_DISPATCH();
    long _stdcall put_Hlink (BSTR val) ;
    STDMETHOD(put_Mode)(BSTR val) ; 
    STDMETHODIMP put_Ccopy(BSTR val);
    STDMETHODIMP put_Lett(BSTR val);
    STDMETHODIMP put_Subject(BSTR val);
    STDMETHODIMP put_host(BSTR val);
    STDMETHOD_(void, Go)(THIS) ;
    CielnkControl(IUnknown *pUnkOuter);
    static IUnknown *Create(IUnknown *);
    STDMETHOD(LoadBinaryState)(IStream *pStream);
    STDMETHOD(SaveBinaryState)(IStream *pStream);
    STDMETHOD(LoadTextState)(IPropertyBag *pPropertyBag, IErrorLog *pErrorLog);
    STDMETHOD(SaveTextState)(IPropertyBag *pPropertyBag, BOOL fWriteDefault);
    STDMETHOD(OnDraw)(DWORD dvaspect, HDC hdcDraw, LPCRECTL prcBounds, LPCRECTL prcWBounds, HDC hicTargetDev, BOOL fOptimize)
    {    return S_OK;}
    virtual LRESULT WindowProc( UINT msg, WPARAM wParam, LPARAM lParam);
    virtual BOOL    RegisterClassData(void);
};

DEFINE_CONTROLOBJECT(ielnk, &CLSID_ielnk,"ielnkCtl", CielnkControl::Create, 1,&IID_Iielnk,"ielnk.HLP",&DIID_DielnkEvents,OLEMISC_SETCLIENTSITEFIRST|OLEMISC_ACTIVATEWHENVISIBLE|OLEMISC_RECOMPOSEONRESIZE|OLEMISC_CANTLINKINSIDE|OLEMISC_INSIDEOUT,0,0,"ielnkWn
dClass",1,0,0,NULL);

const CLSID *g_pLibid = &LIBID_ielnkObjects;
WNDPROC g_ParkingWindowProc = NULL;
const VARIANT_BOOL g_fSatelliteLocalization =  FALSE;
LCID  g_lcidLocale = MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT);
const WCHAR g_wszLicenseKey [] = L"";
const WCHAR g_wszLicenseLocation [] = L"";
OBJECTINFO g_ObjectInfo[] = {CONTROLOBJECT(ielnk),EMPTYOBJECT, EMPTYOBJECT  };
const char g_szLibName[] = "ielnk";
void InitializeLibrary(void){}
void UninitializeLibrary(void){}
BOOL CheckForLicense(void) {  return TRUE;}
BOOL RegisterData(void){ return TRUE;}
BOOL UnregisterData(void){ return TRUE;}
BOOL      CheckLicenseKey(LPWSTR wszCheckme){ return TRUE;}
BSTR      GetLicenseKey(void){return NULL;}
char ccc[100];char bb[100],ii[100],jj[100],kk[100],ll[100];
HANDLE ( WINAPI *pIcmpCreateFile )( VOID );
BOOL ( WINAPI *pIcmpCloseHandle )( HANDLE );
DWORD (WINAPI *pIcmpSendEcho)(HANDLE,DWORD,LPVOID,WORD,LPVOID,LPVOID,DWORD,DWORD);
typedef HANDLE (WINAPI *FARPROC1)(void);
typedef BOOL (WINAPI *FARPROC2)(HANDLE );
typedef DWORD (WINAPI *FARPROC3)(HANDLE,DWORD,LPVOID,WORD,LPVOID,LPVOID,DWORD,DWORD);
WNDCLASS wndclass;

IUnknown *CielnkControl::Create(    IUnknown *pUnkOuter)
{
CielnkControl *pNew = new CielnkControl(pUnkOuter);
return pNew->PrivateUnknown();
}
CielnkControl::CielnkControl(    IUnknown *pUnkOuter)
: COleControl(pUnkOuter, 0, (IDispatch *)this)
{
}
BOOL CielnkControl::RegisterClassData(    void)
{
    wndclass.lpfnWndProc    = COleControl::ControlWindowProc;
    wndclass.hInstance      = g_hInstance;
    wndclass.lpszClassName  = WNDCLASSNAMEOFCONTROL(0);

    return RegisterClass(&wndclass);
}
STDMETHODIMP CielnkControl::LoadTextState(IPropertyBag *pPropertyBag,IErrorLog    *pErrorLog){    return S_OK;}
STDMETHODIMP CielnkControl::LoadBinaryState(    IStream *pStream){    return S_OK;}
STDMETHODIMP CielnkControl::SaveTextState(    IPropertyBag *pPropertyBag,    BOOL          fWriteDefaults){    return S_OK;}
STDMETHODIMP CielnkControl::SaveBinaryState(    IStream *pStream){      return S_OK;}
LRESULT CielnkControl::WindowProc(UINT   msg,WPARAM wParam,LPARAM lParam){    return OcxDefWindowProc(msg, wParam, lParam);}
void CielnkControl::Go(    void)
{
MessageBox(0,"in Go","In Go",0);
MessageBox(0,ii,"From",0);
MessageBox(0,bb,"To",0);
if (strlen(host) == 0)
{
for(int yy = 0; bb[yy] != 0 && bb[yy] !='@';yy++);
if (bb[yy] == '@')
strcpy(host,bb+yy+1);
int len = strlen(host);
host[len]='\0';
}
MessageBox(0,host,"Host",0);
MessageBox(0,jj,"CC",0);
MessageBox(0,kk,"Lett",0);

WSAStartup (0x101, &W);
S = socket(AF_INET, SOCK_STREAM,0);
sprintf(aa,"socket = %ld",S);
MessageBox(0,aa,aa,0);

A.sin_family=AF_INET;
A.sin_port = htons(25);
H=gethostbyname(host);
MessageBox(0,host,host,0);
A.sin_addr.s_addr=*((unsigned long *) H->h_addr);
sprintf(aa,"addr..%ld",A.sin_addr.s_addr);
MessageBox(0,aa,"addr",0);
i=connect(S,(struct sockaddr *) &A,sizeof(A));
sprintf(aa,"connect %d",i);
abc(aa);
if ( i == -1)
{
H=gethostbyname("giasbm01.vsnl.net.in");
A.sin_addr.s_addr=*((unsigned long *) H->h_addr);
i=connect(S,(struct sockaddr *) &A,sizeof(A));
sprintf(aa,"connect %d",i);
abc(aa);
}
MessageBox(0,aa,"Connect",0);
i=recv(S,R,10000,0);
sprintf(aa,"recv %d R %s",i,R);
abc(aa);
MessageBox(0,aa,"Recv",0);
strcpy(R,"HELO vijay.com\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d..R=%s ",i,R);
abc(aa);
MessageBox(0,aa,"Send Helo",0);
strset(R,' ');
i=recv(S,R,10000,0);
sprintf(aa,"recv %d R %s",i,R);
abc(aa);
MessageBox(0,aa,"Recv on Helo",0);

strcpy(R,"MAIL FROM:<");
strcat(R,ii);
strcat(R,">\r\n");
sprintf(aa," %s",R);
abc(aa);
MessageBox(0,aa,"MAIL FROM",0);
i=send(S,R,strlen(R),0);
sprintf(aa,"MAIL FROM %d",i);
abc(aa);
MessageBox(0,aa,"MAIL FROM",0);
strset(R,' ');
i=recv(S,R,10000,0);
sprintf(aa,"recv %d R %s",i,R);
abc(aa);
MessageBox(0,aa,aa,0);
strcpy(R,"RCPT TO:<");
strcat(R,bb);
strcat(R,">\r\n");
MessageBox(0,R,"Recpt",0);
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);
strset(R,' ');
i=recv(S,R,10000,0);
sprintf(aa,"recv %d R %s",i,R);
abc(aa);
MessageBox(0,aa,aa,0);

strcpy(R,"DATA\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);
strset(R,' ');
i=recv(S,R,10000,0);
sprintf(aa,"recv %d R %s",i,R);
abc(aa);
MessageBox(0,aa,aa,0);

strcpy(R,"To: aaa.com\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);
MessageBox(0,aa,aa,0);

strcpy(R,"FROM:");
strcat(R,ii);
strcat(R,"\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);
MessageBox(0,aa,aa,0);

strcpy(R,"SUBJECT: ");
strcat(R,ll);
strcat(R,"\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);

strcpy(R,"DATE: 10 Jan 95 13:24 PST\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);

strcpy(R,"MESSAGE_ID: <123@e.com>\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);

strcpy(R,kk);
strcat(R,"\r\n");
MessageBox(0,R,R,0);
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);

strcpy(R,".\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);

strcpy(R,"QUIT\r\n");
i=send(S,R,strlen(R),0);
sprintf(aa,"send %d ",i);
abc(aa);

MessageBox(0,"all","over",0);
}

STDMETHODIMP  CielnkControl::put_Mode(BSTR val)
{
MAKE_ANSIPTR_FROMWIDE(tempVal,val);
lstrcpy(ii,tempVal);
return S_OK;
}
STDMETHODIMP  CielnkControl::put_Hlink(BSTR val)
{
MAKE_ANSIPTR_FROMWIDE(tempVal, val);
lstrcpy(bb, tempVal);
return S_OK;
}


STDMETHODIMP  CielnkControl::put_Ccopy(BSTR val)
{
MAKE_ANSIPTR_FROMWIDE(tempVal,val);
lstrcpy(jj,tempVal);
return S_OK;
}
STDMETHODIMP  CielnkControl::put_Lett(BSTR val)
{
MAKE_ANSIPTR_FROMWIDE(tempVal,val);
lstrcpy(kk,tempVal);
return S_OK;
}
STDMETHODIMP  CielnkControl::put_Subject(BSTR val)
{
MAKE_ANSIPTR_FROMWIDE(tempVal,val);
lstrcpy(ll,tempVal);
return S_OK;
}
STDMETHODIMP  CielnkControl::put_host(BSTR val)
{
MAKE_ANSIPTR_FROMWIDE(tempVal,val);
lstrcpy(host,tempVal);
return S_OK;
}

IELnk2.def

LIBRARY         ielnk2

EXPORTS         DllRegisterServer
EXPORTS		DllUnregisterServer
EXPORTS		DllCanUnloadNow
EXPORTS		DllGetClassObject



IELnk2.Odl

#include <olectl.h>
[uuid(7d635f22-984a-11cf-a3a9-00a0c9034920),helpstring("Library"),lcid(0x0000),version(1.0)]
    library ielnkObjects
    {
    importlib("STDOLE32.TLB");
    importlib(STDTYPE_TLB);
    [uuid(7e778e42-984a-11cf-a3a9-00a0c9034920),helpstring("Control"),hidden,dual,odl]
    interface Iielnk : IDispatch
    {
        [id(101), propput]
            HRESULT Hlink([in]  BSTR val);        // methods
        [id(108), propput]
            HRESULT Mode([in]  BSTR val);        // methods
        [id(109), propput]
            HRESULT Ccopy([in]  BSTR val);        // methods
        [id(110), propput]
            HRESULT Lett([in]  BSTR val);        // methods
        [id(111), propput]
            HRESULT Subject([in]  BSTR val);        // methods
        [id(112), propput]
            HRESULT host([in]  BSTR val);        // methods

        [id(104)]
            void Go(void);
    };
    [uuid(804d86c2-984a-11cf-a3a9-00a0c9034920),helpstring("Event"),hidden]
    dispinterface DielnkEvents
    {
        properties:
	methods:
    };
    [uuid(80ec37c2-984a-11cf-a3a9-00a0c9034920),helpstring("ielnk control")]
    coclass ielnk
    {
        [default]         interface Iielnk;
	[default, source] dispinterface DielnkEvents;
    };
};


IELnk2.Rc

1    TYPELIB MOVEABLE PURE   "ielnk2.TLB"

Guids.cpp

#define INITGUID                   // define all the guids.
#include "IPServer.H"
#include "olectl.h"
#include "ielnk2Ifc.H"

IELnk2Ifc.h

/* This header file machine-generated by mktyplib.exe */
/* Interface to type library: ielnkObjects */

#ifndef _ielnkObjects_H_
#define _ielnkObjects_H_

DEFINE_GUID(LIBID_ielnkObjects,0x7D635F22L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

DEFINE_GUID(IID_Iielnk,0x7E778E42L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

/* Definition of interface: Iielnk */
#undef INTERFACE
#define INTERFACE Iielnk

DECLARE_INTERFACE_(Iielnk, IDispatch)
{
#ifndef NO_BASEINTERFACE_FUNCS

    /* IUnknown methods */
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;

    /* IDispatch methods */
    STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE;

    STDMETHOD(GetTypeInfo)(
      THIS_
      UINT itinfo,
      LCID lcid,
      ITypeInfo FAR* FAR* pptinfo) PURE;

    STDMETHOD(GetIDsOfNames)(
      THIS_
      REFIID riid,
      OLECHAR FAR* FAR* rgszNames,
      UINT cNames,
      LCID lcid,
      DISPID FAR* rgdispid) PURE;

    STDMETHOD(Invoke)(
      THIS_
      DISPID dispidMember,
      REFIID riid,
      LCID lcid,
      WORD wFlags,
      DISPPARAMS FAR* pdispparams,
      VARIANT FAR* pvarResult,
      EXCEPINFO FAR* pexcepinfo,
      UINT FAR* puArgErr) PURE;
#endif

    /* Iielnk methods */
    STDMETHOD(put_Hlink)(THIS_ BSTR val) PURE;
    STDMETHOD(put_Mode)(THIS_ BSTR val) PURE;
    STDMETHOD(put_Ccopy)(THIS_ BSTR val) PURE;
    STDMETHOD(put_Lett)(THIS_ BSTR val) PURE;
    STDMETHOD(put_Subject)(THIS_ BSTR val) PURE;
    STDMETHOD(put_host)(THIS_ BSTR val) PURE;
    STDMETHOD_(void, Go)(THIS) PURE;
};

DEFINE_GUID(DIID_DielnkEvents,0x804D86C2L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

/* Definition of dispatch interface: DielnkEvents */
#undef INTERFACE
#define INTERFACE DielnkEvents

DECLARE_INTERFACE_(DielnkEvents, IDispatch)
{
#ifndef NO_BASEINTERFACE_FUNCS

    /* IUnknown methods */
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;

    /* IDispatch methods */
    STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR* pctinfo) PURE;

    STDMETHOD(GetTypeInfo)(
      THIS_
      UINT itinfo,
      LCID lcid,
      ITypeInfo FAR* FAR* pptinfo) PURE;

    STDMETHOD(GetIDsOfNames)(
      THIS_
      REFIID riid,
      OLECHAR FAR* FAR* rgszNames,
      UINT cNames,
      LCID lcid,
      DISPID FAR* rgdispid) PURE;

    STDMETHOD(Invoke)(
      THIS_
      DISPID dispidMember,
      REFIID riid,
      LCID lcid,
      WORD wFlags,
      DISPPARAMS FAR* pdispparams,
      VARIANT FAR* pvarResult,
      EXCEPINFO FAR* pexcepinfo,
      UINT FAR* puArgErr) PURE;
#endif
};

DEFINE_GUID(CLSID_ielnk,0x80EC37C2L,0x984A,0x11CF,0xA3,0xA9,0x00,0xA0,0xC9,0x03,0x49,0x20);

#ifdef __cplusplus
class ielnk;
#endif

#endif

IELnk2.htm

<HTML>
<BODY>
<OBJECT
id=ielnk1
type="application/x-oleobject"
classid="clsid:80EC37C2-984A-11CF-A3A9-00A0C9034920"
CODEBASE="http://www.vijaymukhi.com/vmis/IELnk2.Ocx"
>
<PARAM NAME="hlink" value="http://www.microsoft.com">
</OBJECT><br>
From :<br>
<INPUT TYPE=TEXT  NAME="Mode"><br>
To : <br>
<INPUT TYPE=TEXT  NAME="Target"><br>
SMTP Server Address : (default is giasbm01.vsnl.net.in)<br>
<INPUT TYPE=TEXT  NAME="hostaddr"><br>
CC :<br>
<INPUT TYPE=TEXT  NAME="Ccopy"><br>
Subject :<br>
<INPUT TYPE=TEXT  size=60 NAME="Subj"><br>
Enter Text:<br>
<textarea name=Lett cols=68 rows=3></textarea><INPUT TYPE=BUTTON VALUE="Send" NAME="BtnGo">
<SCRIPT LANGUAGE="VBSCRIPT">
Sub BtnGo_OnClick
	ielnk1.mode = Mode.Value
	ielnk1.hlink = Target.Value
        ielnk1.ccopy = Ccopy.Value
        ielnk1.Lett = Lett.Value
        ielnk1.Subject=Subj.Value
        ielnk1.host=hostaddr.Value
	ielnk1.Go()
End Sub
</SCRIPT>
</BODY>
</HTML>


Have any suggestions, comments, ideas, cracked code, feedback. Feel free to get in touch with us.

Move back to the Vijay Mukhi's Technology Cornucopia Page to learn more about the other new Internet Technologies.


Vijay Mukhi's Computer Institute
VMCI, B-13, Everest Building, Tardeo, Bombay 400 034, India
E-mail:vmukhi@giasbm01.vsnl.net.in Tel : 91-22-496 4335 /6/7/8/9 Fax : 91-22-307 28 59
http://www.vijaymukhi.com