Send mail coding

T

TCLim

Guest
I would like to send mail with attachment by using Progress. Anyone can help me ?
 
U

Unregistered

Guest
Progress sockets are simple and work well.

The following code is the code sample Progress have but I have changed it slightly, so that it can handle attachments. It works if the OS is windows or linux.

Put the following code in an include file. I called it sendmailvp.i

/* path to DOS program used for uuencoding the attachments.
As fcode is a DOS program, all file names should be 8 characters or less */
&SCOPED-DEFINE uuencode "c:\fcode -ue "

DEFINE VARIABLE vSMTP AS CHARACTER NO-UNDO.
DEFINE VARIABLE vTo AS CHARACTER NO-UNDO.
DEFINE VARIABLE vFrom AS CHARACTER NO-UNDO.
DEFINE VARIABLE vSubject AS CHARACTER NO-UNDO.
DEFINE VARIABLE vBody AS CHARACTER NO-UNDO.
DEFINE VARIABLE vFiles AS CHARACTER NO-UNDO.
DEFINE VARIABLE vBodyFile AS CHARACTER NO-UNDO.
DEFINE VARIABLE vChar AS CHARACTER NO-UNDO.
DEFINE VARIABLE hSocket AS HANDLE NO-UNDO.
DEFINE VARIABLE vBuffer AS MEMPTR NO-UNDO.
DEFINE VARIABLE vStatus AS LOGICAL NO-UNDO.
DEFINE VARIABLE vState AS INTEGER NO-UNDO.
DEFINE VARIABLE X AS INTEGER NO-UNDO.

PROCEDURE SendMail:

vstatus = hSocket:CONNECT("-S 25 -H " + vSMTP) NO-ERROR.
IF NOT vstatus THEN
vState = 99.
ELSE
vstate = 1.

REPEAT ON STOP UNDO, LEAVE ON QUIT UNDO, LEAVE:
IF vState < 0 OR vState = 7 OR vState = 99 THEN LEAVE.
WAIT-FOR READ-RESPONSE OF hSocket.
END.

END PROCEDURE.

PROCEDURE NewState:

DEFINE INPUT PARAMETER newState AS INTEGER.
DEFINE INPUT PARAMETER pstring AS CHARACTER.

vState = newState.
IF pstring = "" THEN
RETURN.

SET-SIZE(vBuffer) = LENGTH(pstring) + 1.
PUT-STRING(vBuffer,1) = pstring.
hSocket:WRITE(vBuffer, 1, LENGTH(pstring)).
SET-SIZE(vbuffer) = 0.

END PROCEDURE.

PROCEDURE ReadHandler:

DEFINE VARIABLE vlength AS INTEGER NO-UNDO.
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
DEFINE VARIABLE v AS INTEGER NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.

vlength = hSocket:GET-BYTES-AVAILABLE().
IF vlength > 0 THEN
DO:
SET-SIZE(vBuffer) = vlength + 1.
hSocket:READ(vBuffer, 1, vlength, 1).
str = GET-STRING(vBuffer,1).
SET-SIZE(vBuffer) = 0.

v = INTEGER(ENTRY(1, str," ")).
CASE vState:
WHEN 1 THEN
IF v = 220 THEN
RUN newState(2, "HELO how are you? ~n").
ELSE
vState = -1.

WHEN 2 THEN
IF v = 250 THEN
RUN newState(3, "MAIL From: <" + vFrom + "> ~n").
ELSE
vState = -1.

WHEN 3 THEN
IF v = 250 THEN
DO i = 1 TO NUM-ENTRIES(vTo, ";"):
RUN newState(4, "RCPT TO: <" + ENTRY(i, vTo, ";") + "> ~n").
END.
ELSE
vState = -1.

WHEN 4 THEN
IF v = 250 THEN
RUN newState(5, "DATA" + "~n").
ELSE
vState = -1.

WHEN 5 THEN
IF v = 354 THEN
DO:
RUN newState(6, "From: " + vFrom + " ~n" + "To: " + vTo + " ~n" + "Subject: " + vSubject + " ~n~n"+ vBody + "~n").

DO X = 1 TO NUM-ENTRIES(vFiles,";"):
IF SEARCH(ENTRY(X, vFiles,";")) <> ? THEN
DO:
IF OPSYS = "win32" THEN
DOS SILENT VALUE({&uuencode} + ENTRY(X, vFiles,";")).
ELSE
UNIX SILENT VALUE("uuencode " + ENTRY(X, vFiles, ";")
+ " "
+ SUBSTRING(ENTRY(X, vFiles, ";"), R-INDEX(ENTRY(X, vFiles, ";"),"/") + 1)
+ " > "
+ SUBSTRING(ENTRY(X, vFiles, ";"), 1, R-INDEX(ENTRY(X, vFiles,";"),"."))
+ "uue").

vBodyFile = SUBSTRING(ENTRY(X, vFiles,";"), 1, R-INDEX(ENTRY(X, vFiles,";"),".")) + "uue".

INPUT FROM VALUE(vBodyFile).

REPEAT:
IMPORT UNFORMATTED vChar.
RUN newState(6, vChar + "~n").
END.

INPUT CLOSE.

IF OPSYS = "win32" THEN
DOS SILENT DEL VALUE(vBodyFile).
ELSE
UNIX SILENT rm VALUE(vBodyFile).
END.
END.

RUN newState(6, " ~n~n.~n").

END.
ELSE
vState = -1.

WHEN 6 THEN
IF v = 250 THEN
RUN newState(7,"QUIT~n").
ELSE
vState = -1.
END CASE.
END.

END PROCEDURE.


Then create a simple procedure like the one below:

{sendmailvp.i}

/* setup connection */
CREATE SOCKET hSocket.
hSocket:SET-READ-RESPONSE-PROCEDURE ("ReadHandler",THIS-PROCEDURE).


/* put code here to assign the following variables and send the mail*/
ASSIGN vSMTP = "10.10.10.10" /* ip address of mail server */
vTo = "you@you.com"
vFrom = "me@me.com"
vSubject = "this is the subject"
vBody = "this is the body"
vFiles = "c:\config.sys;c:\autoexec.bat". /* if linux then this will be "/home/example.exe;/home/data/test.sys" for example


/* send mail */
RUN SendMail.

IF vState = 7 THEN
/* message accepted */

IF vState < 0 THEN
/* message aborted */

IF vState = 99 THEN
/* server unavailable */


/* run cleanup */
hSocketISCONNECT() NO-ERROR.
DELETE OBJECT hSocket NO-ERROR.


This code has been tried and tested and works perfectly. If you have problems with it, let me know.

As I have suggested before, you could also use com-handles and connect to Outlook and send mail this way.
 
U

Unregistered

Guest
By the way, fcode is a dos program to uuencode the specified attachment. Under linux/unix there is a encode command so you do not need any other programs.

I am running my sendmail code via webspeed and linux, so I don't use the fcode file, but if you are sending via GUI and windows then you will need to find a program to uuencode the files you want to attach before you send them.
 
Top