mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			575 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
			
		
		
	
	
			575 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			OpenEdge ABL
		
	
	
	
	
	
| 
 | |
|  /*------------------------------------------------------------------------
 | |
|     File        : Email
 | |
|     Purpose     : Abstraction of an Email message
 | |
|     Description : Holds information needed for an email message - senders,
 | |
|                   recipients, subject, a message body, attachment files, and
 | |
|                   other extra information such as importance, priority,
 | |
|                   sensitivity, custom reply-to addresses, delivery receipts,
 | |
|                   read receipts, custom sent date, reply-by date, and expire date.
 | |
|     Author(s)   : Abe Voelker
 | |
|     Created     : Sat Jul 17 16:27:05 CDT 2010
 | |
|   ----------------------------------------------------------------------*/
 | |
| 
 | |
| USING Progress.Lang.*.
 | |
| 
 | |
| 
 | |
| CLASS email.Email  USE-WIDGET-POOL:
 | |
| 
 | |
|     &SCOPED-DEFINE QUOTES                """"
 | |
|     &SCOPED-DEFINE CR                    CHR(13)
 | |
|     &SCOPED-DEFINE LF                    CHR(10)
 | |
|     &SCOPED-DEFINE DEFAULT_MIME_BOUNDARY "!@#$%^&*+-._MIME_BOUNDARY_.-+*&^%$#@!"
 | |
| 
 | |
|     /*------------------------------------------------------------------------------
 | |
|             Purpose:
 | |
|             Notes:
 | |
|     ------------------------------------------------------------------------------*/
 | |
| 
 | |
|     DEFINE PRIVATE VARIABLE objSendEmailAlgorithm AS email.SendEmailAlgorithm NO-UNDO.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttSenders NO-UNDO
 | |
|       FIELD cEmailAddress AS CHARACTER
 | |
|       FIELD cRealName     AS CHARACTER INITIAL ?
 | |
|       INDEX IXPK_ttSenders cEmailAddress.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttToRecipients NO-UNDO
 | |
|       FIELD cEmailAddress AS CHARACTER
 | |
|       FIELD cRealName     AS CHARACTER INITIAL ?
 | |
|       INDEX IXPK_ttToRecipients cEmailAddress.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttCCRecipients NO-UNDO
 | |
|       FIELD cEmailAddress AS CHARACTER
 | |
|       FIELD cRealName     AS CHARACTER INITIAL ?
 | |
|       INDEX IXPK_ttCCRecipients cEmailAddress.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttBCCRecipients NO-UNDO
 | |
|       FIELD cEmailAddress AS CHARACTER
 | |
|       FIELD cRealName     AS CHARACTER INITIAL ?
 | |
|       INDEX IXPK_ttBCCRecipients cEmailAddress.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttReplyToRecipients NO-UNDO
 | |
|       FIELD cEmailAddress AS CHARACTER
 | |
|       FIELD cRealName     AS CHARACTER INITIAL ?
 | |
|       INDEX IXPK_ttReplyToRecipients cEmailAddress.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttReadReceiptRecipients NO-UNDO
 | |
|       FIELD cEmailAddress AS CHARACTER
 | |
|       FIELD cRealName     AS CHARACTER INITIAL ?
 | |
|       INDEX IXPK_ttReadReceiptRecipients cEmailAddress.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttDeliveryReceiptRecipients NO-UNDO
 | |
|       FIELD cEmailAddress AS CHARACTER
 | |
|       FIELD cRealName     AS CHARACTER INITIAL ?
 | |
|       INDEX IXPK_ttDeliveryReceiptRecipients cEmailAddress.
 | |
| 
 | |
|     DEFINE PRIVATE TEMP-TABLE ttAttachments NO-UNDO
 | |
|       FIELD cFileName     AS CHARACTER
 | |
|       FIELD lcData        AS Object    /* Longchar object */
 | |
|       FIELD lBase64Encode AS LOGICAL.
 | |
| 
 | |
|     DEFINE PRIVATE VARIABLE cMimeBoundary     AS CHARACTER   NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE lcBody            AS LONGCHAR    NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE lBodyIsBase64     AS LOGICAL     NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE cSubject          AS CHARACTER   NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE mptrAttachments   AS MEMPTR      NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE cImportance       AS CHARACTER   NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE cSensitivity      AS CHARACTER   NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE cPriority         AS CHARACTER   NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE dttmtzSentDate    AS DATETIME-TZ INITIAL ? NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE dttmtzReplyByDate AS DATETIME-TZ INITIAL ? NO-UNDO.
 | |
|     DEFINE PRIVATE VARIABLE dttmtzExpireDate  AS DATETIME-TZ INITIAL ? NO-UNDO.
 | |
| 
 | |
|     DEFINE PRIVATE VARIABLE cNewLine          AS CHARACTER   NO-UNDO.
 | |
| 
 | |
|     /* Other email headers: */
 | |
| 
 | |
|     CONSTRUCTOR PUBLIC Email (INPUT ipobjSendEmailAlgorithm AS email.SendEmailAlgorithm):
 | |
|         SUPER ().
 | |
|         ASSIGN objSendEmailAlgorithm = ipobjSendEmailAlgorithm
 | |
|                cMimeBoundary         = {&DEFAULT_MIME_BOUNDARY}
 | |
|                lBodyIsBase64         = TRUE.
 | |
|         IF (OPSYS BEGINS "WIN") THEN
 | |
|             ASSIGN cNewLine          = {&CR} + {&LF}.
 | |
|         ELSE
 | |
|             ASSIGN cNewLine          = {&LF}.
 | |
|     END CONSTRUCTOR.
 | |
| 
 | |
|     DESTRUCTOR PUBLIC Email ():
 | |
|         FOR EACH ttAttachments:
 | |
|             IF VALID-OBJECT(ttAttachments.lcData) THEN
 | |
|                 DELETE OBJECT ttAttachments.lcData NO-ERROR.
 | |
|         END. /* FOR EACH ttAttachments */
 | |
|     END DESTRUCTOR.
 | |
| 
 | |
|     /* Add a sender ("From:" address) to the email */
 | |
|     METHOD PUBLIC VOID addSender(INPUT ipcEmailAddress AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttSenders
 | |
|                         WHERE ttSenders.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttSenders.
 | |
|             ASSIGN ttSenders.cEmailAddress = ipcEmailAddress.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a sender ("From:" address) (with Real Name) to the email */
 | |
|     METHOD PUBLIC VOID addSender(INPUT ipcEmailAddress AS CHARACTER,
 | |
|                                  INPUT ipcRealName     AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttSenders
 | |
|                         WHERE ttSenders.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttSenders.
 | |
|             ASSIGN ttSenders.cEmailAddress = ipcEmailAddress
 | |
|                    ttSenders.cRealName     = ipcRealName.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a "To:" recipient to the email */
 | |
|     METHOD PUBLIC VOID addToRecipient(INPUT ipcEmailAddress AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttToRecipients
 | |
|                         WHERE ttToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttToRecipients.
 | |
|             ASSIGN ttToRecipients.cEmailAddress = ipcEmailAddress.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a "To:" recipient (with Real Name) to the email */
 | |
|     METHOD PUBLIC VOID addToRecipient(INPUT ipcEmailAddress AS CHARACTER,
 | |
|                                       INPUT ipcRealName     AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttToRecipients
 | |
|                         WHERE ttToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttToRecipients.
 | |
|             ASSIGN ttToRecipients.cEmailAddress = ipcEmailAddress
 | |
|                    ttToRecipients.cRealName     = ipcRealName.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a "CC:" recipient to the email */
 | |
|     METHOD PUBLIC VOID addCCRecipient(INPUT ipcEmailAddress AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttCCRecipients
 | |
|                         WHERE ttCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttCCRecipients.
 | |
|             ASSIGN ttCCRecipients.cEmailAddress = ipcEmailAddress.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a "CC:" recipient (with Real Name) to the email */
 | |
|     METHOD PUBLIC VOID addCCRecipient(INPUT ipcEmailAddress AS CHARACTER,
 | |
|                                       INPUT ipcRealName     AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttCCRecipients
 | |
|                         WHERE ttCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttCCRecipients.
 | |
|             ASSIGN ttCCRecipients.cEmailAddress = ipcEmailAddress
 | |
|                    ttToRecipients.cRealName     = ipcRealName.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a "BCC:" recipient to the email */
 | |
|     METHOD PUBLIC VOID addBCCRecipient(INPUT ipcEmailAddress AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttBCCRecipients
 | |
|                         WHERE ttBCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttBCCRecipients.
 | |
|             ASSIGN ttBCCRecipients.cEmailAddress = ipcEmailAddress.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a "BCC:" recipient (with Real Name) to the email */
 | |
|     METHOD PUBLIC VOID addBCCRecipient(INPUT ipcEmailAddress AS CHARACTER,
 | |
|                                        INPUT ipcRealName     AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttBCCRecipients
 | |
|                         WHERE ttBCCRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttBCCRecipients.
 | |
|             ASSIGN ttBCCRecipients.cEmailAddress = ipcEmailAddress
 | |
|                    ttToRecipients.cRealName      = ipcRealName.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a reply-to recipient to the email */
 | |
|     METHOD PUBLIC VOID addReplyToRecipient(INPUT ipcEmailAddress AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttReplyToRecipients
 | |
|                         WHERE ttReplyToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttReplyToRecipients.
 | |
|             ASSIGN ttReplyToRecipients.cEmailAddress = ipcEmailAddress.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a  reply-to recipient (with Real Name) to the email */
 | |
|     METHOD PUBLIC VOID addReplyToRecipient(INPUT ipcEmailAddress AS CHARACTER,
 | |
|                                            INPUT ipcRealName     AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttReplyToRecipients
 | |
|                         WHERE ttReplyToRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttReplyToRecipients.
 | |
|             ASSIGN ttReplyToRecipients.cEmailAddress = ipcEmailAddress
 | |
|                    ttReplyToRecipients.cRealName     = ipcRealName.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a delivery receipt recipient to the email */
 | |
|     METHOD PUBLIC VOID addDeliveryReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttDeliveryReceiptRecipients
 | |
|                         WHERE ttDeliveryReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttDeliveryReceiptRecipients.
 | |
|             ASSIGN ttDeliveryReceiptRecipients.cEmailAddress = ipcEmailAddress.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a delivery receipt recipient (with Real Name) to the email */
 | |
|     METHOD PUBLIC VOID addDeliveryReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER,
 | |
|                                                    INPUT ipcRealName     AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttDeliveryReceiptRecipients
 | |
|                         WHERE ttDeliveryReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttDeliveryReceiptRecipients.
 | |
|             ASSIGN ttDeliveryReceiptRecipients.cEmailAddress = ipcEmailAddress
 | |
|                    ttDeliveryReceiptRecipients.cRealName     = ipcRealName.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a read receipt recipient to the email */
 | |
|     METHOD PUBLIC VOID addReadReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttReadReceiptRecipients
 | |
|                         WHERE ttReadReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttReadReceiptRecipients.
 | |
|             ASSIGN ttReadReceiptRecipients.cEmailAddress = ipcEmailAddress.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a read receipt recipient (with Real Name) to the email */
 | |
|     METHOD PUBLIC VOID addReadReceiptRecipient(INPUT ipcEmailAddress AS CHARACTER,
 | |
|                                                INPUT ipcRealName     AS CHARACTER):
 | |
|         IF NOT CAN-FIND(FIRST ttReadReceiptRecipients
 | |
|                         WHERE ttReadReceiptRecipients.cEmailAddress EQ ipcEmailAddress) THEN DO:
 | |
|             CREATE ttReadReceiptRecipients.
 | |
|             ASSIGN ttReadReceiptRecipients.cEmailAddress = ipcEmailAddress
 | |
|                    ttReadReceiptRecipients.cRealName     = ipcRealName.
 | |
|         END.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the subject of the email */
 | |
|     METHOD PUBLIC VOID setSubject(INPUT ipcSubject AS CHARACTER):
 | |
|         ASSIGN cSubject = ipcSubject.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the importance of the email. H = High, L = Low, anything else = Medium/None */
 | |
|     METHOD PUBLIC VOID setImportance(INPUT ipcImportance AS CHARACTER):
 | |
|         ASSIGN cImportance = ipcImportance.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the sensitivity of the email. */
 | |
|     /* Possible values (from RFC 2156): "Personal", "Private", or "Company confidential" ("Company-confidential") */
 | |
|     METHOD PUBLIC VOID setSensitivity(INPUT ipcSensitivity AS CHARACTER):
 | |
|         ASSIGN cSensitivity = ipcSensitivity.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the priority of the email (to affect transmission speed and delivery) */
 | |
|     /* Possible values (from RFC 2156): "normal", "urgent", or "non-urgent" */
 | |
|     METHOD PUBLIC VOID setPriority(INPUT ipcPriority AS CHARACTER):
 | |
|         ASSIGN cPriority = ipcPriority.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the date/time the email was sent */
 | |
|     METHOD PUBLIC VOID setSentDate(INPUT ipdttmtzSentDate AS DATETIME-TZ):
 | |
|         ASSIGN dttmtzSentDate = ipdttmtzSentDate.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the date/time recipient(s) should reply by */
 | |
|     METHOD PUBLIC VOID setReplyByDate(INPUT ipdttmtzReplyByDate AS DATETIME-TZ):
 | |
|         ASSIGN dttmtzReplyByDate = ipdttmtzReplyByDate.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the date/time the message expires */
 | |
|     METHOD PUBLIC VOID setExpireDate(INPUT ipdttmtzExpireDate AS DATETIME-TZ):
 | |
|         ASSIGN dttmtzExpireDate = ipdttmtzExpireDate.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* If send email algorithm not set in constructor, you must set it using this method before the email can be sent */
 | |
|     METHOD PUBLIC VOID setSendEmailAlgorithm(INPUT ipobjSendEmailAlgorithm AS email.SendEmailAlgorithm):
 | |
|         ASSIGN objSendEmailAlgorithm = ipobjSendEmailAlgorithm.
 | |
|     END METHOD.
 | |
| 
 | |
|     METHOD PUBLIC VOID setBodyText(INPUT ipcBodyText AS CHARACTER):
 | |
|         ASSIGN lcBody = ipcBodyText.
 | |
|     END METHOD.
 | |
| 
 | |
|     METHOD PUBLIC VOID setBodyText(INPUT iplcBodyText AS LONGCHAR):
 | |
|         ASSIGN lcBody = iplcBodyText.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Set the body by reading in an external file */
 | |
|     METHOD PUBLIC CHARACTER setBodyFile(INPUT ipcBodyFile AS CHARACTER):
 | |
|         FILE-INFO:FILE-NAME = ipcBodyFile.
 | |
|         IF FILE-INFO:FULL-PATHNAME EQ ? THEN
 | |
|             RETURN "Cannot locate file '" + ipcBodyFile + "' in the filesystem!".
 | |
|         IF INDEX(FILE-INFO:FILE-TYPE, "R") EQ 0 THEN
 | |
|             RETURN "File '" + FILE-INFO:FULL-PATHNAME + "' exists but is not readable!".
 | |
|         COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcBody NO-ERROR.
 | |
|         IF ERROR-STATUS:ERROR THEN
 | |
|             RETURN "Error copying from file: " + ERROR-STATUS:GET-MESSAGE(1).
 | |
|         RETURN "". /* Success */
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Body defaults to base64 encoding, but can be manually disabled */
 | |
|     METHOD PUBLIC VOID setBodyEncoding(INPUT iplBase64Encode AS LOGICAL):
 | |
|         ASSIGN lBodyIsBase64 = iplBase64Encode.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Add a non-encoded file attachment to the email */
 | |
|     METHOD PUBLIC CHARACTER addTextAttachment(INPUT ipcFileName AS CHARACTER):
 | |
|         DEFINE VARIABLE lcTemp AS LONGCHAR NO-UNDO.
 | |
|         FILE-INFO:FILE-NAME = ipcFileName.
 | |
|         IF FILE-INFO:FULL-PATHNAME EQ ? THEN
 | |
|             RETURN "Cannot locate file '" + ipcFileName + "' in the filesystem!".
 | |
|         IF INDEX(FILE-INFO:FILE-TYPE, "R") EQ 0 THEN
 | |
|             RETURN "File '" + FILE-INFO:FULL-PATHNAME + "' exists but is not readable!".
 | |
|         /* Load file into memory */
 | |
|         COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcTemp NO-ERROR.
 | |
|         IF ERROR-STATUS:ERROR THEN
 | |
|             RETURN "Error copying from file: " + ERROR-STATUS:GET-MESSAGE(1).
 | |
|         CREATE ttAttachments.
 | |
|         ASSIGN ttAttachments.cFileName     = ipcFileName
 | |
|                ttAttachments.lcData        = NEW email.LongcharWrapper(lcTemp)
 | |
|                ttAttachments.lBase64Encode = FALSE.
 | |
|         RETURN "". /* Success */
 | |
|     END.
 | |
| 
 | |
|     /* Add a file attachment to the email; it defaults to base-64 encoding */
 | |
|     METHOD PUBLIC CHARACTER addAttachment(INPUT ipcFileName AS CHARACTER):
 | |
|         DEFINE VARIABLE lcTemp AS LONGCHAR NO-UNDO.
 | |
|         FILE-INFO:FILE-NAME = ipcFileName.
 | |
|         IF FILE-INFO:FULL-PATHNAME EQ ? THEN
 | |
|             RETURN "Cannot locate file '" + ipcFileName + "' in the filesystem!".
 | |
|         IF INDEX(FILE-INFO:FILE-TYPE, "R") EQ 0 THEN
 | |
|             RETURN "File '" + FILE-INFO:FULL-PATHNAME + "' exists but is not readable!".
 | |
|         /* Load file into memory */
 | |
|         COPY-LOB FROM FILE FILE-INFO:FULL-PATHNAME TO OBJECT lcTemp NO-ERROR.
 | |
|         IF ERROR-STATUS:ERROR THEN
 | |
|             RETURN "Error copying from file: " + ERROR-STATUS:GET-MESSAGE(1).
 | |
|         CREATE ttAttachments.
 | |
|         ASSIGN ttAttachments.cFileName     = ipcFileName
 | |
|                ttAttachments.lcData        = NEW email.LongcharWrapper(EmailClient.Util:ConvertDataToBase64(lcTemp))
 | |
|                ttAttachments.lBase64Encode = TRUE.
 | |
|         RETURN "". /* Success */
 | |
|     END.
 | |
| 
 | |
|     /* Override default MIME boundary */
 | |
|     METHOD PUBLIC VOID setMimeBoundary(INPUT ipcMimeBoundary AS CHARACTER):
 | |
|         ASSIGN cMimeBoundary = ipcMimeBoundary.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Return a concatenated list of To:, CC:, and BCC: recipients */
 | |
|     METHOD PUBLIC CHARACTER getRecipients():
 | |
|         DEFINE VARIABLE cRecipients AS CHARACTER NO-UNDO.
 | |
| 
 | |
|         FOR EACH ttToRecipients
 | |
|           BREAK BY ttToRecipients.cEmailAddress:
 | |
|             ASSIGN cRecipients = cRecipients + ttToRecipients.cEmailAddress.
 | |
|             IF NOT LAST(ttToRecipients.cEmailAddress) THEN DO:
 | |
|                 ASSIGN cRecipients = cRecipients + ", ".
 | |
|             END.
 | |
|         END.
 | |
|         FOR EACH ttCCRecipients
 | |
|           BREAK BY ttCCRecipients.cEmailAddress:
 | |
|             IF FIRST(ttCCRecipients.cEmailAddress) AND
 | |
|                cRecipients NE "" THEN
 | |
|                 ASSIGN cRecipients = cRecipients + ", ".
 | |
|             ASSIGN cRecipients = cRecipients + ttCCRecipients.cEmailAddress.
 | |
|             IF NOT LAST(ttCCRecipients.cEmailAddress) THEN
 | |
|                 ASSIGN cRecipients = cRecipients + ttCCRecipients.cEmailAddress.
 | |
|         END.
 | |
|         FOR EACH ttBCCRecipients
 | |
|           BREAK BY ttBCCRecipients.cEmailAddress:
 | |
|             IF FIRST(ttBCCRecipients.cEmailAddress) AND
 | |
|                cRecipients NE "" THEN
 | |
|                 ASSIGN cRecipients = cRecipients + ", ".
 | |
|             ASSIGN cRecipients = cRecipients + ttBCCRecipients.cEmailAddress.
 | |
|             IF NOT LAST(ttBCCRecipients.cEmailAddress) THEN
 | |
|                 ASSIGN cRecipients = cRecipients + ttBCCRecipients.cEmailAddress.
 | |
|         END.
 | |
|         RETURN cRecipients.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Dumps all email message headers to CHAR */
 | |
|     METHOD PUBLIC CHARACTER getHeaders():
 | |
|         DEFINE VARIABLE cReturnData AS CHARACTER NO-UNDO.
 | |
| 
 | |
|         /* Write the "From:" header */
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "From:".
 | |
|         FOR EACH ttSenders
 | |
|           BREAK BY ttSenders.cEmailAddress:
 | |
|             IF ttSenders.cRealName NE ? THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ttSenders.cRealName + " <" + ttSenders.cEmailAddress + ">".
 | |
|             ELSE
 | |
|                 ASSIGN cReturnData = cReturnData + ttSenders.cEmailAddress.
 | |
|             IF NOT LAST(ttSenders.cEmailAddress) THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ", ".
 | |
|         END.
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "\n".
 | |
|         /* Write the "To:" header */
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "To:".
 | |
|         FOR EACH ttToRecipients
 | |
|           BREAK BY ttToRecipients.cEmailAddress:
 | |
|             IF ttToRecipients.cRealName NE ? THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ttToRecipients.cRealName + " <" + ttToRecipients.cEmailAddress + ">".
 | |
|             ELSE
 | |
|                 ASSIGN cReturnData = cReturnData + ttToRecipients.cEmailAddress.
 | |
|             IF NOT LAST(ttToRecipients.cEmailAddress) THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ", ".
 | |
|         END.
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "\n".
 | |
|         /* Write the "Reply-To:" header */
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "Reply-To:".
 | |
|         IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS THEN DO:
 | |
|             /* Use manually-overridden reply-to addresses */
 | |
|             FOR EACH ttReplyToRecipients
 | |
|               BREAK BY ttReplyToRecipients.cEmailAddress:
 | |
|                 IF ttReplyToRecipients.cRealName NE ? THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ttReplyToRecipients.cRealName + " <" + ttReplyToRecipients.cEmailAddress + ">".
 | |
|                 ELSE
 | |
|                     ASSIGN cReturnData = cReturnData + ttReplyToRecipients.cEmailAddress.
 | |
|                 IF NOT LAST(ttReplyToRecipients.cEmailAddress) THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ", ".
 | |
|             END. /* FOR EACH ttReplyToRecipients ... */
 | |
|         END. /* IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS */
 | |
|         ELSE DO:
 | |
|             /* Write reply-to using sender addresses if reply-to addresses not manually overriddden */
 | |
|             FOR EACH ttSenders
 | |
|               BREAK BY ttSenders.cEmailAddress:
 | |
|                 IF ttSenders.cRealName NE ? THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ttSenders.cRealName + " <" + ttSenders.cEmailAddress + ">".
 | |
|                 ELSE
 | |
|                     ASSIGN cReturnData = cReturnData + ttSenders.cEmailAddress.
 | |
|                 IF NOT LAST(ttSenders.cEmailAddress) THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ", ".
 | |
|             END.
 | |
|         END. /* ELSE / IF TEMP-TABLE ttReplyToRecipients:HAS-RECORDS */
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "\n".
 | |
|         /* Write the "Cc:" header */
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "Cc:".
 | |
|         FOR EACH ttCCRecipients
 | |
|           BREAK BY ttCCRecipients.cEmailAddress:
 | |
|             IF ttCCRecipients.cRealName NE ? THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ttCCRecipients.cRealName + " <" + ttCCRecipients.cEmailAddress + ">".
 | |
|             ELSE
 | |
|                 ASSIGN cReturnData = cReturnData + ttCCRecipients.cEmailAddress.
 | |
|             IF NOT LAST(ttCCRecipients.cEmailAddress) THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ", ".
 | |
|         END.
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "\n".
 | |
|         /* Write the "Bcc:" header */
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "Bcc:".
 | |
|         FOR EACH ttBCCRecipients
 | |
|           BREAK BY ttBCCRecipients.cEmailAddress:
 | |
|             IF ttBCCRecipients.cRealName NE ? THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ttBCCRecipients.cRealName + " <" + ttBCCRecipients.cEmailAddress + ">".
 | |
|             ELSE
 | |
|                 ASSIGN cReturnData = cReturnData + ttBCCRecipients.cEmailAddress.
 | |
|             IF NOT LAST(ttBCCRecipients.cEmailAddress) THEN
 | |
|                 ASSIGN cReturnData = cReturnData + ", ".
 | |
|         END.
 | |
|         ASSIGN cReturnData = cReturnData + {"ES} + "\n".
 | |
|         /* If delivery recipients specified, write each recipient out */
 | |
|         IF TEMP-TABLE ttDeliveryReceiptRecipients:HAS-RECORDS THEN DO:
 | |
|             ASSIGN cReturnData = cReturnData + {"ES} + "Return-Receipt-To:".
 | |
|             FOR EACH ttDeliveryReceiptRecipients
 | |
|               BREAK BY ttDeliveryReceiptRecipients.cEmailAddress:
 | |
|                 IF ttDeliveryReceiptRecipients.cRealName NE ? THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ttDeliveryReceiptRecipients.cRealName + " <" + ttDeliveryReceiptRecipients.cEmailAddress + ">".
 | |
|                 ELSE
 | |
|                     ASSIGN cReturnData = cReturnData + ttDeliveryReceiptRecipients.cEmailAddress.
 | |
|                 IF NOT LAST(ttDeliveryReceiptRecipients.cEmailAddress) THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ", ".
 | |
|             END. /* FOR EACH ttDeliveryReceiptRecipients */
 | |
|             ASSIGN cReturnData = cReturnData + {"ES}.
 | |
|         END. /* IF TEMP-TABLE ttDeliveryReceiptRecipients:HAS-RECORDS */
 | |
|         /* If read recipients specified, write each recipient out */
 | |
|         IF TEMP-TABLE ttReadReceiptRecipients:HAS-RECORDS THEN DO:
 | |
|             ASSIGN cReturnData = cReturnData + {"ES} + "Disposition-Notification-To:".
 | |
|             FOR EACH ttReadReceiptRecipients
 | |
|               BREAK BY ttReadReceiptRecipients.cEmailAddress:
 | |
|                 IF ttReadReceiptRecipients.cRealName NE ? THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ttReadReceiptRecipients.cRealName + " <" + ttReadReceiptRecipients.cEmailAddress + ">".
 | |
|                 ELSE
 | |
|                     ASSIGN cReturnData = cReturnData + ttReadReceiptRecipients.cEmailAddress.
 | |
|                 IF NOT LAST(ttReadReceiptRecipients.cEmailAddress) THEN
 | |
|                     ASSIGN cReturnData = cReturnData + ", ".
 | |
|             END. /* FOR EACH ttReadReceiptRecipients */
 | |
|             ASSIGN cReturnData = cReturnData + {"ES}.
 | |
|         END. /* IF TEMP-TABLE ttReadReceiptRecipients:HAS-RECORDS */
 | |
|         /* Write the "Subject:" header */
 | |
|         ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Subject:" + cSubject + {"ES}.
 | |
|         /* Write the "Importance:" header */
 | |
|         IF cImportance BEGINS "H" THEN
 | |
|             ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Importance:High" + {"ES}.
 | |
|         ELSE IF cImportance BEGINS "L" THEN
 | |
|             ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Importance:Low" + {"ES}.
 | |
|         /* Write the "Sensitivity" header */
 | |
|         IF cSensitivity NE "" THEN
 | |
|             ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Sensitivity:" + cSensitivity + {"ES}.
 | |
|         /* Write the "Priority" header */
 | |
|         IF cPriority NE "" THEN
 | |
|             ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Priority:" + cPriority + {"ES}.
 | |
|         /* Write the "Date" (sent date) header */
 | |
|         IF dttmtzSentDate NE ? THEN
 | |
|             ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Date:" + email.Util:ABLDateTimeToEmail(dttmtzSentDate) + {"ES}.
 | |
|         IF dttmtzReplyByDate NE ? THEN
 | |
|             ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Reply-By:" + email.Util:ABLDateTimeToEmail(dttmtzReplyByDate) + {"ES}.
 | |
|         /* Write the "Expiry-Date" header */
 | |
|         IF dttmtzExpireDate NE ? THEN
 | |
|             ASSIGN cReturnData = cReturnData + "\n" + {"ES} + "Expiry-Date:" + email.Util:ABLDateTimeToEmail(dttmtzExpireDate) + {"ES}.
 | |
|         RETURN cReturnData.
 | |
|     END METHOD.
 | |
| 
 | |
|     /* Dumps all email message payload data (body and attachments) to LONGCHAR */
 | |
|     METHOD PUBLIC LONGCHAR getPayload():
 | |
|         DEFINE VARIABLE lcReturnData AS LONGCHAR NO-UNDO.
 | |
| 
 | |
|         /* If no body and no text, then return empty string ("") */
 | |
|         IF lcBody EQ "" AND NOT TEMP-TABLE ttAttachments:HAS-RECORDS THEN
 | |
|             RETURN lcReturnData.
 | |
| 
 | |
|         /* Write payload header */
 | |
|         ASSIGN lcReturnData = "Mime-Version: 1.0" + cNewLine +
 | |
|                               "Content-Type: multipart/mixed; boundary=" + cMimeBoundary + cNewLine + cNewLine.
 | |
| 
 | |
|         /* Write out the email body, if it exists */
 | |
|         IF lcBody NE "" THEN DO:
 | |
|             ASSIGN lcReturnData = lcReturnData + "--" + cMimeBoundary + cNewLine +
 | |
|                                   "Content-Type: text/plain; charset=~"us-ascii~"" + cNewLine.
 | |
|             IF lBodyIsBase64 THEN DO:
 | |
|                 ASSIGN lcReturnData = lcReturnData + "Content-Transfer-Encoding: base64" + cNewLine +
 | |
|                                       cNewLine +
 | |
|                                       email.Util:ConvertDataToBase64(lcBody) + cNewLine.
 | |
|             END.
 | |
|             ELSE DO:
 | |
|                 ASSIGN lcReturnData = lcReturnData + "Content-Transfer-Encoding: 7bit"   + cNewLine +
 | |
|                                       cNewLine +
 | |
|                                       lcBody + cNewLine.
 | |
|             END.
 | |
|         END.
 | |
| 
 | |
|         /* Write out each email attachment */
 | |
|         FOR EACH ttAttachments:
 | |
|             ASSIGN lcReturnData = lcReturnData + "--" + cMimeBoundary + cNewLine.
 | |
|             IF ttAttachments.lBase64Encode THEN DO:
 | |
|                 ASSIGN lcReturnData = lcReturnData + "Content-Type: application/octet-stream" + cNewLine +
 | |
|                                       "Content-Disposition: attachment; filename=~"" + ttAttachments.cFileName + "~"" + cNewLine +
 | |
|                                       "Content-Transfer-Encoding: base64" + cNewLine + cNewLine +
 | |
|                                       CAST(ttAttachments.lcData, email.LongcharWrapper):getLongchar() + cNewLine.
 | |
|             END.
 | |
|             ELSE DO:
 | |
|                 ASSIGN lcReturnData = lcReturnData + "Content-Type: text/plain; charset=~"us-ascii~"" + cNewLine +
 | |
|                                       "Content-Disposition: attachment; filename=~"" + ttAttachments.cFileName + "~"" + cNewLine +
 | |
|                                       "Content-Transfer-Encoding: 7bit" + cNewLine + cNewLine +
 | |
|                                       CAST(ttAttachments.lcData, email.LongcharWrapper):getLongchar() + cNewLine.
 | |
|             END.
 | |
|         END.
 | |
| 
 | |
|         /* Write payload footer */
 | |
|         ASSIGN lcReturnData = lcReturnData + "--" + cMimeBoundary + "--" + cNewLine.
 | |
| 
 | |
|         RETURN lcReturnData.
 | |
|     END METHOD.
 | |
| 
 | |
|     METHOD PUBLIC CHARACTER send():
 | |
|         RETURN objSendEmailAlgorithm:sendEmail(INPUT THIS-OBJECT).
 | |
|     END METHOD.
 | |
| 
 | |
| END CLASS.
 |