Accessing Static Class and Properties in .NET - System.Net.M

Posted by christian.bryan@capita.co.uk on 28-Sep-2017 12:36

HI 

I am trying to use .NET to send an email from Openedge.

To add an attachment you can specify a content type and the content type is expecting a Mimetype which is a constant held in the static class Application 

System.Net.Mime.MediaTypeNames.Application

https://msdn.microsoft.com/en-us/library/system.net.mime.mediatypenames.application(v=vs.110).aspx

I can't work out how to get the values for these fields i.e. Octet, PDF, RTF etc.

Code attached.

Look for:

>>>>>>>>>

oContentType:MediaType = oMediaType:Application:Octet. /* HOW DO I PASS this VALUE??????????????????? */

<<<<<<<<<<

Thanks

Christian.

USING System.Net.*.
USING System.Net.Mail.*.
USING System.Net.Mime.*.


CLASS SMTPhandler:

DEFINE PRIVATE VARIABLE oClient AS SmtpClient NO-UNDO.
DEFINE PRIVATE VARIABLE oMessage AS MailMessage NO-UNDO.
DEFINE PRIVATE VARIABLE lv-Error AS LOGICAL NO-UNDO.
DEFINE PRIVATE VARIABLE lv-ErrorMsg AS CHAR NO-UNDO.

/* CONSTRUCTORS / DESTRUCTOR ------------------------------------------------------*/

CONSTRUCTOR PUBLIC SMTPhandler ():

DEFINE VARIABLE cHost AS CHARACTER NO-UNDO.
DEFINE VARIABLE cUsername AS CHARACTER NO-UNDO.
DEFINE VARIABLE cPassword AS CHARACTER NO-UNDO.
DEFINE VARIABLE iPort AS INTEGER NO-UNDO.


/* Load values from system options */
{loadibsini.si OPENAccess SMTPserver cHost
OPENAccess SMTPserverUsername cUsername
OPENAccess SMTPserverPassword cPassword}
IF cHost = ? THEN cHost = "".
IF cUsername = ? THEN cUsername = "".
IF cPassword = ? THEN cPassword = "".

/* Create handler */
CreateClient (INPUT cHost,
INPUT iPort,
INPUT TRUE,
INPUT cUsername,
INPUT cPassword).

END CONSTRUCTOR.

CONSTRUCTOR PUBLIC SMTPhandler (INPUT pcHost AS CHARACTER,
INPUT piPort AS INTEGER,
INPUT plEnableSSL AS LOGICAL,
INPUT pcUsername AS CHARACTER,
INPUT pcPassword AS CHARACTER):

CreateClient (INPUT pcHost,
INPUT piPort,
INPUT plEnableSSL,
INPUT pcUsername,
INPUT pcPassword).

END CONSTRUCTOR.

DESTRUCTOR SMTPhandler ():

oClient:Dispose() NO-ERROR.
DELETE OBJECT oClient NO-ERROR.
oMessage:Dispose() NO-ERROR.
DELETE OBJECT oMessage NO-ERROR.

END DESTRUCTOR.

/* PUBLIC METHODS ----------------------------------------------------------------*/

METHOD PUBLIC VOID AddEmailAttachment (INPUT pcFiles AS CHARACTER):

DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE cSep AS CHARACTER NO-UNDO INITIAL ",".
DEFINE VARIABLE oAttachment AS Attachment NO-UNDO.

/* Could be semi-colon separated */
IF NUM-ENTRIES(pcFiles,";") > 1 THEN
cSep = ";".

/* Proces each attachment */
DO i = 1 TO NUM-ENTRIES(pcFiles,cSep):
oAttachment = NEW Attachment(ENTRY(i,pcFiles,cSep)).
oMessage:Attachments:Add(oAttachment).
DELETE OBJECT oAttachment NO-ERROR.
END.

END METHOD. /* AddEmailAttachment */

/* CJB01 */
METHOD PUBLIC VOID AddEmailAttachment (INPUT pcFiles AS CHARACTER, INPUT pcFileNames AS CHARACTER):

DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE cSep AS CHARACTER NO-UNDO INITIAL ",".
DEFINE VARIABLE oAttachment AS Attachment NO-UNDO.
DEFINE VARIABLE oContentType AS ContentType.
DEFINE VARIABLE oMediaType AS MediaTypeNames /* */.
DEFINE VARIABLE oApplication AS CLASS oMediaType.Application.

/* Could be semi-colon separated */
IF NUM-ENTRIES(pcFiles,";") > 1 THEN cSep = ";".

/* Proces each attachment */
DO i = 1 TO NUM-ENTRIES(pcFiles,cSep):

oContentType = NEW ContentType().

oContentType:MediaType = oMediaType:Application:Octet. /* HOW DO I PASS this VALUE??????????????????? */

oContentType:Name = ENTRY(i, pcFileNames,cSEP).

oAttachment = NEW Attachment(ENTRY(i,pcFiles,cSep), oContentType).
oMessage:Attachments:Add(oAttachment).
DELETE OBJECT oAttachment NO-ERROR.
END.

END METHOD. /* AddEmailAttachment */


METHOD PUBLIC VOID AddEmailBCC (INPUT pcBCC AS CHARACTER):

DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE cSep AS CHARACTER NO-UNDO INITIAL ",".

/* Could be semi-colon separated */
IF NUM-ENTRIES(pcBCC,";") > 1 THEN
cSep = ";".

/* Proces each BCC address */
DO i = 1 TO NUM-ENTRIES(pcBCC,cSep):
oMessage:bcc:ADD(ENTRY(i,pcBCC,cSep)) NO-ERROR.
END.

END METHOD. /* AddEmailBCC */

METHOD PUBLIC VOID AddEmailCC (INPUT pcCC AS CHARACTER):

DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE cSep AS CHARACTER NO-UNDO INITIAL ",".

/* Could be semi-colon separated */
IF NUM-ENTRIES(pcCC,";") > 1 THEN
cSep = ";".

/* Proces each CC address */
DO i = 1 TO NUM-ENTRIES(pcCC,cSep):
oMessage:cc:ADD(ENTRY(i,pcCC,cSep)) NO-ERROR.
END.

END METHOD. /* AddEmailCC */

METHOD PUBLIC VOID CreateEmail (INPUT pcFrom AS CHARACTER,
INPUT pcTo AS CHARACTER,
INPUT pcSubject AS CHARACTER,
INPUT pcBody AS LONGCHAR):

CreateMessage (INPUT pcFrom,
INPUT pcTo,
INPUT pcSubject,
INPUT pcBody).

END METHOD. /* CreateEmail */

METHOD PUBLIC VOID CreateEmail (INPUT pcTo AS CHARACTER,
INPUT pcSubject AS CHARACTER,
INPUT pcBody AS LONGCHAR):

DEFINE VARIABLE cFrom AS CHARACTER NO-UNDO.

{loadibsini.si OPENAccess DefaultFromEmail cFrom}
IF cFrom = ? THEN cFrom = "".

CreateMessage (INPUT cFrom,
INPUT pcTo,
INPUT pcSubject,
INPUT pcBody).

END METHOD. /* CreateEmail */

METHOD PUBLIC VOID SendEmail ():
DEF VAR iCount AS INT NO-UNDO.

oClient:SEND(oMessage) NO-ERROR.

/* CJB01 */
IF ERROR-STATUS:ERROR THEN DO:

ASSIGN lv-Error = TRUE.
DO iCount = 1 TO ERROR-STATUS:NUM-MESSAGES:
ASSIGN lv-ErrorMsg = lv-ErrorMsg + " " + ERROR-STATUS:GET-MESSAGE(iCount).
END.

END.

END METHOD. /* SendEmail */


METHOD PUBLIC LOGICAL hasError():
RETURN lv-Error.
END METHOD.


METHOD PUBLIC CHAR getErrorMsg():
RETURN lv-ErrorMsg.
END METHOD.

/* PRIVATE METHODS ---------------------------------------------------------------*/

METHOD PRIVATE VOID CreateClient (INPUT pcHost AS CHARACTER,
INPUT piPort AS INTEGER,
INPUT plEnableSSL AS LOGICAL,
INPUT pcUsername AS CHARACTER,
INPUT pcPassword AS CHARACTER):

DEFINE VARIABLE oCredentials AS NetworkCredential NO-UNDO.
DEFINE VARIABLE iCount AS INT NO-UNDO.

/* Setup credentials if username specified */
IF pcUsername <> "" THEN
oCredentials = NEW NetworkCredential(pcUsername,pcPassword).

/* Handle scenario where host is passed including port e.g. smtp.office365.com:123 */
IF NUM-ENTRIES(pcHost,":") > 1 THEN
ASSIGN
piPort = INTEGER(ENTRY(2,pcHost,":"))
pcHost = ENTRY(1,pcHost,":")
NO-ERROR.
/* Use a default port if it's unknown, common default for secure SMTP appears to be 587 */
IF piPort = ? OR piPort = 0 THEN
piPort = 587.

/* Setup client connection to host */
oClient = NEW SmtpClient().
ASSIGN
oClient:Host = pcHost
oClient:Port = piPort
oClient:EnableSSL = plEnableSSL
oClient:DeliveryMethod = SmtpDeliveryMethod:Network
NO-ERROR.

/* CJB01 */
IF ERROR-STATUS:ERROR THEN DO:
ASSIGN lv-Error = TRUE.
DO iCount = 1 TO ERROR-STATUS:NUM-MESSAGES:
ASSIGN lv-ErrorMsg = lv-ErrorMsg + " " + ERROR-STATUS:GET-MESSAGE(iCount).
END.

END.


IF VALID-OBJECT(oCredentials) THEN
ASSIGN
oClient:UseDefaultCredentials = FALSE
oClient:Credentials = oCredentials
NO-ERROR.
ELSE
oClient:UseDefaultCredentials = TRUE.

DELETE OBJECT oCredentials NO-ERROR.

END METHOD. /* CreateClient */

METHOD PUBLIC VOID CreateMessage (INPUT pcFrom AS CHARACTER,
INPUT pcTo AS CHARACTER,
INPUT pcSubject AS CHARACTER,
INPUT pcBody AS LONGCHAR):

oMessage = NEW MailMessage(pcFrom,pcTo,pcSubject,pcBody).

/* CJB01 */
IF pcBody BEGINS "<!DOCTYPE" THEN DO:
oMessage:IsBodyHtml = TRUE.
END.


END METHOD. /* CreateMessage */

END CLASS.

All Replies

Posted by Mike Fechner on 28-Sep-2017 12:57

Nested types (classes contained in another type) need to be referenced in quotes with the final period of the type name replaced by a plus:

MESSAGE "System.Net.Mime.MediaTypeNames+Application":Pdf .

Posted by marian.edu on 28-Sep-2017 13:02

and that’s because a 4gl always brings something plus… feels like a natural language :)




This thread is closed