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.