Mapi Outlook .. send mail silently

User avatar
Rick Lipkin
Posts: 2397
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Mapi Outlook .. send mail silently

Post by Rick Lipkin »

To All

Below is the code to create a Mapi call to Outlook to create an Outlook e-mail ... however, I would like the whole process be silent and be able to launch the SEND button automatically without being seen nor have any interaction with the user.

Image

When I run the code .. an Outlook e-mail is generated, but the user has to click on the Send button ... unfortunately I can not use CDO .. because my client has a "blurb" "This came from the internet warning" embedded in the CDO text and for security reasons, the client has SMTP closed off but to all registered devices like MFP, multi function printers that scan to e-mail.

The only other option is to use their corporate Outlook client.... as you can see .. I can create the e-mail, but it takes the client to click the send button .. Any idea on how to make the entire process silent and be able to button:Click() the Send button to launch the e-mail ...

Appreciate any advice and help

Thanks
Rick Lipkin

Code: Select all

//----

#Include "FiveWin.ch"
#Include "Mail.ch"

//----------------------------
Func Main()

Local oDlg
Local oSay1,cSay1,oSay2,cSay2
LOCAL oBtn1,oBtn2

Local oSubject,oTo
Local cSubject,cTo
Local oMemo,cMemo
Local oFontB


cSubject := space(50)
cTo      := Space(40)
cMemo    := "Please fund my trip to the Bahamas"
cSubject := "Trip to the Bahamas"
cTo      := substr("r1.1955@live.com"+space(40),1,40)


oFontB  := TFont():New("Ms Sans Serif",,-6,.F.,.T. ,,,,.F. )

DEFINE DIALOG oDlg RESOURCE "MEMO"       ;

       cSay1 := "Subject"
       cSay2 := "To"

       REDEFINE SAY oSay1 var cSay1 ID 301 of oDlg UPDATE
                    oSay1:SetFont( oFontB )
       REDEFINE SAY oSay2 var cSay2 ID 300 of oDlg UPDATE
                    oSay2:SetFont( oFontB )

       REDEFINE GET oSubject var cSubject ID 303 of oDlg UPDATE
       REDEFINE GET oTo      var cTo      ID 302 of oDlg UPDATE


       REDEFINE GET oMEMO VAR cMEMO MEMO ID 304 of oDlg UPDATE



       REDEFINE BTNBMP oBtn1 ID 111 of oDlg   ;
         PROMPT "Create Mail" LEFT 2007;
         ACTION ( _SendMapiMail( cTo, cMemo, cSubject , oDLg ) )


       REDEFINE BTNBMP oBtn2 ID 112 OF oDlg   ;
         PROMPT "Cancel" LEFT 2007;
         ACTION ( oDlg:END() )

ACTIVATE DIALOG oDlg ;
          ON INIT( oDlg:Hide(),oBtn1:Click() );
          VALID (!GETKEYSTATE( 27 ))  // do not allow esc key here

Release Font oFontB

Return( nil )

//---------------------------------
Static Func _SendMAPIMail( MailTo, cText, cSubj,oDlg )

PRIVATE oMail

MailTo := TRIM( MailTo )



DEFINE MAIL oMail ;
       SUBJECT cSubj ;
       TEXT cText ;
       FROM USER ;
       TO MailTo

ACTIVATE MAIL oMail

oMail:ENd()

oDlg:Show()
oDlg:ENd()


RETURN( .t. )
 
Marc Vanzegbroeck
Posts: 1102
Joined: Mon Oct 17, 2005 5:41 am
Location: Belgium
Contact:

Re: Mapi Outlook .. send mail silently

Post by Marc Vanzegbroeck »

Rick,

Maybe you can use blat.exe to send email for this customer.
I also have two options in my program. If the file blat.exe exist in de program-directory, it use blat.exe, otherwise the normal way.
Regards,
Marc

FWH32+xHarbour | FWH64+Harbour | BCC | DBF | ADO+MySQL | ADO+MariaDB | ADO+SQLite
User avatar
Jimmy
Posts: 165
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: Mapi Outlook .. send mail silently

Post by Jimmy »

hi,

i'm a Fivewin Newbiew so excuse my Question :

the Snapshot show Outlook Client which you get with

Code: Select all

   ::oItem := ::oItem:dynamicCast( ActiveXObject() )
   ::oItem:Display()
so you write your Email "in" Outlook :?:

---

i write my Email in a RTF Control and send it via MAPI to Outlook "Out" Basket
Outlook is configure to look for new Email every xxx Minute so it is send "automatic"

there was a Trick to "reduce" Time between Outlook go online to search for new Email.
i have to search it while i do not use it. i doen't matter if a Email is send 1 Hour later

---

now i have written a Email Client using harbour hbTIP LIB which support SSL.
greeting,
Jimmy
User avatar
TimStone
Posts: 2536
Joined: Fri Oct 07, 2005 1:45 pm
Location: Trabuco Canyon, CA USA
Contact:

Re: Mapi Outlook .. send mail silently

Post by TimStone »

Rick,

I wanted to do the same thing. MAPI is an excellent solution, but when we have a series of automated emails, that is just not an option to click on every one of them.

I looked for the option a while back, but could not find one. I shall try to look again.

Tim
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
User avatar
Rick Lipkin
Posts: 2397
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Mapi Outlook .. send mail silently

Post by Rick Lipkin »

Tim

Thanks ... automating Outlook is my clients choice ... I welcome your efforts!

Rick Lipkin
User avatar
Jimmy
Posts: 165
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: Mapi Outlook .. send mail silently

Post by Jimmy »

sorry about 1st Mail ... your Form look like Outlook ;)

i'm still a FiveWin User so i do not know if my Idea work under FiveWin:

Code: Select all

Static Func _SendMAPIMail( MailTo, cText, cSubj,oDlg )
LOCAL nRet := 0
LOCAL oMail := TMail():New(cSubject, cNoteText, cMsgType, cConversationID,;
                           dDate, cTime, lReceipt, lFromUSer, aOrigin, aRecipients,;
                           aFiles )
   oMail:Activate()
   // Result MAPISendMail()
   nRet := oMail:nRetCode 
   oMail:End()
RETURN nRet
 
greeting,
Jimmy
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Mapi Outlook .. send mail silently

Post by karinha »

For new users, C:\FWH\SAMPLES\MAPLOOK.PRG - complete.

Code: Select all

#include "FiveWin.ch"
#include "Mail.ch"

#Define CLR_MENTA       nRGB( 221, 255, 238 ) //-> Cor de Menta
#Define CLR_SOFTYELLOW nRGB( 255, 251, 225 )

MEMVAR oDlg

FUNCTION Main()

   LOCAL oSay1, cSay1, oSay2, cSay2, oSay3, cSay3, oBtn1, oBtn2,             ;
         oSubject, oTo, cSubject, cTo, oMemo, cMemo, oFontB, oFnt, oFont

   cSubject := SPACE( 50 )
   cTo      := SPACE( 40 )

   // cMemo    :=  SPACE(1000) //"Please fund my trip to the Bahamas"
   cMemo    :=  "cMemo - Corpo do email - Email body"
   cSubject := "cSubject -> Assunto do email"
   cTo      := substr( "kapiabafwh@gmail.com" + space( 40 ), 1, 40 )

   cSay1 := "Assunto(Subject):"
   cSay2 := "Para(To):"

   SetBalloon( .T. )
   SkinButtons()
   SetGetColorFocus( CLR_MENTA )

   tGet():lDisColors  := .F.
   tGet():nClrTextDis := CLR_HBLUE
   tGet():nClrPaneDis := CLR_SOFTYELLOW

   DEFINE FONT oFnt    NAME "Ms Sans Serif" SIZE 0,  14 BOLD
   DEFINE FONT oFont   NAME "Ms Sans Serif" SIZE 0, -14 BOLD

   DEFINE DIALOG oDlg RESOURCE "MEMO"

   oDlg:lHelpIcon := .F.

   REDEFINE SAY oSay1 VAR cSay1 ID 401 of oDlg UPDATE

   oSay1:SetFont( oFont )

   REDEFINE SAY oSay2 VAR cSay2 ID 402 of oDlg UPDATE

   oSay2:SetFont( oFont )

   REDEFINE SAY oSay3 VAR cSay3 ID 403 of oDlg UPDATE

   oSay3:SetFont( oFont )

   //    cSubject := "cSubject -> Assunto do email"
   REDEFINE GET oSubject VAR cSubject ID 302 OF oDlg PICTURE "@K" UPDATE     ;
      FONT oFnt COLORS CLR_BLACK, CLR_WHITE

   // cTo      := substr( "kapiabafwh@gmail.com" + space( 40 ), 1, 40 )
   REDEFINE GET oTo      VAR cTo      ID 303 OF oDlg PICTURE "@K" UPDATE     ;
      FONT oFnt COLORS CLR_BLACK, CLR_WHITE

   // cMemo    :=  "cMemo - Corpo do email - Email body"
   REDEFINE GET oMEMO VAR cMEMO MEMO ID 304 OF oDlg UPDATE FONT oFont

   REDEFINE BTNBMP oBtn1 ID 111 of oDlg 2007                                 ;
      ACTION ( _SendMapiMail( cTo, cMemo, cSubject ) )

   oBtn1:cToolTip := "Crie e envie o email"

   REDEFINE BTNBMP oBtn2 ID 112 OF oDlg 2007                                 ;
      ACTION ( oDlg:End() )

   oBtn2:cToolTip := "Saida - Exit"

   SET FONT OF oBtn1 TO oFont
   SET FONT OF oBtn2 TO oFont

   ACTIVATE DIALOG oDlg CENTERED

   RELEASE Font oFnt
   RELEASE Font oFont

RETURN NIL

STATIC FUNC _SendMAPIMail( MailTo, cText, cSubj )

   LOCAL oMail, nRet := .F.

   MailTo := TRIM( MailTo )

   DEFINE MAIL oMail ;
      SUBJECT cSubj  ;
      TEXT cText     ;
      FROM USER      ;
      TO MailTo

   ACTIVATE MAIL oMail

   nRet := oMail:nRetCode

   IF nRet = 0

     MsgInfo( "Email Send", "Email Send" )

   ENDIF

   oMail:End()

RETURN NIL
 

// MAPLOOK.RC

Code: Select all

MEMO DIALOG 209, 93, 187, 200
STYLE DS_ABSALIGN | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Enviar email "
FONT 8, "Arial"
{
 EDITTEXT 302, 0, 20, 187, 12
 EDITTEXT 303, 0, 50, 187, 12
 EDITTEXT 304, 3, 80, 180, 96, ES_MULTILINE | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_TABSTOP
 PUSHBUTTON "&Criar eMail", 111, 32, 179, 70, 16, BS_LEFTTEXT | WS_TABSTOP
 PUSHBUTTON "&Saida", 112, 104, 179, 50, 16, BS_LEFTTEXT | WS_TABSTOP
 LTEXT "Assunto(Subject):", 401, 0, 6, 184, 12, NOT WS_GROUP
 LTEXT "Para(To):", 402, 0, 36, 184, 12, NOT WS_GROUP
 LTEXT "Corpo do Email - Email body", 403, 0, 66, 180, 12, NOT WS_GROUP
}
 
Regards, saludos.
João Santos - São Paulo - Brasil
User avatar
TimStone
Posts: 2536
Joined: Fri Oct 07, 2005 1:45 pm
Location: Trabuco Canyon, CA USA
Contact:

Re: Mapi Outlook .. send mail silently

Post by TimStone »

karinha,

We have no problem with creating emails for MAPI, as your example does.

The problem is that each time you send a MAPI mail, it pops up the email in the client ( Outlook ) and does not send it until you hit the send button.

In my case, I have the system send automatic emails in the middle of the night. These include thank you notes and service reminders. Currently I have to use SMTP for this process, but we would love to have it go through the MAPI client so both the outgoing, and any incoming, emails can be tracked along side all other emails the business may send.

We need to write the email from our application directly to the Outlook outbox where the system will automatically send it when it does it's send/receive cycle. So far we have not found a workable solution for this.

Tim
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Mapi Outlook .. send mail silently

Post by karinha »

Master Tim, in this case, I use the easy to control RMAIL.PRG for mass emailing.

http://forums.fivetechsupport.com/viewt ... il#p219619

Regards.
João Santos - São Paulo - Brasil
User avatar
TimStone
Posts: 2536
Joined: Fri Oct 07, 2005 1:45 pm
Location: Trabuco Canyon, CA USA
Contact:

Re: Mapi Outlook .. send mail silently

Post by TimStone »

In my program, the emails are not "mass", just daily followups. They are sent automatically in the middle of the night.

It works to use SMTP, but then we don't have them in Outlook. Also most of my clients have no idea how to setup SMTP, so that is an issue.

Apparently the API for Outlook does not include a direct method. Most solutions described on the net do have a method for dropping the email in the Outbox, but I have to figure out a translation for that from the old VB code, or C# code, that these folks are calling.

Tim
Tim Stone
http://www.MasterLinkSoftware.com
timstone@masterlinksoftware.com
Using: FWH 19.06 with Harbour 3.2.0 / Microsoft Visual Studio Community 2019
User avatar
Jimmy
Posts: 165
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: Mapi Outlook .. send mail silently

Post by Jimmy »

hi,

sorry to ask again : is your Snapshot Outlook or not :?:

my 1st Msg was about Outlook "Send Mail Form" which is called with Outlook Method Display()

---

what is in your HB_ISLOG( 7 ) when call MAIL :?:

c:\fwh\source\winapi\mapi.c

Code: Select all

HB_FUNC( MAPISENDMAIL )
   ...
      lpfnMAPISendMail = ( LPMAPISENDMAIL ) GetProcAddress( hMapiLib, "MAPISendMail");
// this line  
      nFlags = IF( ( HB_ISLOG( 7 ) && hb_parl( 7 ) ), MAPI_DIALOG, 0 ) ;
 
i guess

Code: Select all

   ( HB_ISLOG( 7 ) && hb_parl( 7 )
is .T. so

Code: Select all

   nFlags = MAPI_DIALOG
if nFlags = 0 you will get no Dialog
greeting,
Jimmy
Jack
Posts: 249
Joined: Wed Jul 11, 2007 11:06 am

Re: Mapi Outlook .. send mail silently

Post by Jack »

Hi ,
I think i have the solution , if you place the instruction oMailItem:Invoke("Send") , it is in silent mode .

Good luk and marry Christmas .

Philippe

#include "fivewin.ch"
function main()
local oOutLook,oMailItem
oOutLook := TOleAuto():New("Outlook.Application")
oMailItem := oOutLook:Invoke("CreateItem", 0)
oMailitem:to:="ph.jacquet@skynet.be"
oMailItem:Recipients:Add("jacquetlg@yahoo.fr")
oMailitem:CC:= "jclip@skynet.be"
oMailItem:Subject := "Sujet de mail en direct"
oMailItem:Body := "Le texte principal"
*if ! empty(cPdf)
* oMailItem:Attachments:Add(cPdf)
*endif
oMailItem:display(.F.)
oMailItem:Invoke("Send")
sysrefresh()
*
return .T.
User avatar
Rick Lipkin
Posts: 2397
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Mapi Outlook .. send mail silently

Post by Rick Lipkin »

Phillippe

Your code works well except .. the e-mail goes to the Outlook Outbox and it is never sent ..

Image

Definitly on the right track ... any suggestions ?

Rick Lipkin

Code: Select all

#Include "FiveWin.ch"

//----------------------------
Func Main()

Local cSubject,cTo,cOther,cBody
Local oOutlook,oMailItem,cCC

cTo      := "dbrown@doi.sc.gov"
cOther   := "mmills@doi.sc.gov"
cCC      := "twatson@doi.sc.gov"
cSubject := "Test Silent Email"
cBody    := "This is the body of the e-mail"


oOutLook  := TOleAuto():New("Outlook.Application")
oMailItem := oOutLook:Invoke("CreateItem", 0)

oMailitem:to := cTo
oMailItem:Recipients:Add( cOther )
oMailitem:CC:= cCC
oMailItem:Subject := cSubject
oMailItem:Body := cBody

*if ! empty(cPdf)
* oMailItem:Attachments:Add(cPdf)
*endif

oMailItem:display(.F.)
oMailItem:Invoke("Send")
sysrefresh()

msginfo( "E-mail Sent" )

return .T.
 
User avatar
Jimmy
Posts: 165
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: Mapi Outlook .. send mail silently

Post by Jimmy »

Rick Lipkin wrote: Your code works well except .. the e-mail goes to the Outlook Outbox and it is never sent ..

Code: Select all

oMailItem:display(.F.)
oMailItem:Invoke("Send")
 
even it you do not o:display(.F.) it will never "send" ... it goes to Out-Basket.
the only Way to "send" it "automatic" by Outlook.

there was a Trick to reduce Time between "automatic" but i did not found it (yet)
greeting,
Jimmy
User avatar
Rick Lipkin
Posts: 2397
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Mapi Outlook .. send mail silently

Post by Rick Lipkin »

To All

As it turns out the code actually works .. I learned that Outlook where I work is blocked .. I tested that with my Outlook client on my laptop .. and when I sent an e-mail with the full version of Outlook .. the message behaved the same way and got stuck in the outbox ..

This is perfect .. Thanks Philippe!!

Rick Lipkin
Post Reply