浏览代码

HPCC-24949 Add cc: and bcc: support to Std.System.Email.SendEmail* ECL functions

Signed-off-by: Dan S. Camper <dan.camper@lexisnexisrisk.com>
Dan S. Camper 4 年之前
父节点
当前提交
16c514e5fd

+ 50 - 12
common/remote/rmtsmtp.cpp

@@ -465,6 +465,8 @@ class CMailInfo
     StringArray *warnings;
     StringArray recipients;
     StringBuffer to;
+    StringBuffer cc;
+    StringBuffer bcc;
     StringAttr subject;
     StringAttr mailServer;
     unsigned port;
@@ -475,10 +477,12 @@ class CMailInfo
     unsigned inlen;
 
     static char const * toHeader;
+    static char const * ccHeader;
+    static char const * bccHeader;
     static char const * subjectHeader;
     static char const * senderHeader;
 public:
-    CMailInfo(char const * _to, char const * _subject, char const * _mailServer, unsigned _port, char const * _sender, StringArray *_warnings) 
+    CMailInfo(char const * _to, char const * _cc, char const * _bcc, char const * _subject, char const * _mailServer, unsigned _port, char const * _sender, StringArray *_warnings)
         : subject(_subject), mailServer(_mailServer), port(_port), sender(_sender), lastAction("process initialization"), inlen(0)
     {
         warnings = _warnings;
@@ -487,10 +491,24 @@ public:
             throw MakeStringException(0, "email sender address too long: %" I64F "u characters",  static_cast<__uint64>(sender.length()));
         validator.validateAddress(sender.get(), "email sender address");
 
-        getRecipients(validator, _to);
+        getRecipients(validator, _to, to);
         if(strlen(toHeader) + to.length() > 998)
             throw MakeStringException(0, "Email recipient address list too long: %u characters", to.length());
 
+        if (_cc && _cc[0])
+        {
+            getRecipients(validator, _cc, cc);
+            if(strlen(ccHeader) + cc.length() > 998)
+                throw MakeStringException(0, "Email cc: recipient address list too long: %u characters", cc.length());
+        }
+
+        if (_bcc && _bcc[0])
+        {
+            getRecipients(validator, _bcc, bcc);
+            if(strlen(bccHeader) + bcc.length() > 998)
+                throw MakeStringException(0, "Email bcc: recipient address list too long: %u characters", cc.length());
+        }
+
         if(strlen(subjectHeader) + subject.length() > 998)
             throw MakeStringException(0, "Email subject too long: %" I64F "u characters",  static_cast<__uint64>(subject.length()));
         validator.validateValue(subject.get(), "email subject");
@@ -574,6 +592,9 @@ public:
     {
         header.append(senderHeader).append(sender.get()).append("\r\n");
         header.append(toHeader).append(to.str()).append("\r\n");
+        if (!cc.isEmpty())
+            header.append(ccHeader).append(cc.str()).append("\r\n");
+        // Do not append bcc (that's what makes it "blind")
         header.append(subjectHeader).append(subject.get()).append("\r\n");
         header.append("MIME-Version: 1.0\r\n");
     }
@@ -600,15 +621,15 @@ public:
     }
 
 private:
-    void getRecipients(CSMTPValidator & validator, char const * _to)
+    void getRecipients(CSMTPValidator & validator, char const * _to, StringBuffer &destBuffer)
     {
         StringBuffer rcpt;
         validator.scanAddressListStart(_to, "recipient email address list");
         while(validator.scanAddressListNext(rcpt.clear()))
         {
-            if(recipients.ordinality())
-                to.append(",");
-            to.append(rcpt.str());
+            if(!destBuffer.isEmpty())
+                destBuffer.append(",");
+            destBuffer.append(rcpt.str());
             recipients.append(rcpt.str());
         }
     }
@@ -616,6 +637,8 @@ private:
 };
 
 char const * CMailInfo::toHeader = "To: ";
+char const * CMailInfo::ccHeader = "Cc: ";
+char const * CMailInfo::bccHeader = "Bcc: ";
 char const * CMailInfo::subjectHeader = "Subject: ";
 char const * CMailInfo::senderHeader = "From: ";
 
@@ -790,28 +813,43 @@ static void doSendEmail(CMailInfo & info, CMailPart const & part)
     info.read();
 }
 
-void sendEmail(const char * to, const char * subject, const char * body, const char * mailServer, unsigned port, const char * sender, StringArray *warnings)
+void sendEmail(const char * to, const char * cc, const char * bcc, const char * subject, const char * body, const char * mailServer, unsigned port, const char * sender, StringArray *warnings)
 {
-    CMailInfo info(to, subject, mailServer, port, sender, warnings);
+    CMailInfo info(to, cc, bcc, subject, mailServer, port, sender, warnings);
     CTextMailPart bodyPart(body, "text/plain; charset=ISO-8859-1", NULL);
     doSendEmail(info, bodyPart);
 }
 
-void sendEmailAttachText(const char * to, const char * subject, const char * body, const char * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings)
+void sendEmail(const char * to, const char * subject, const char * body, const char * mailServer, unsigned port, const char * sender, StringArray *warnings)
 {
-    CMailInfo info(to, subject, mailServer, port, sender, warnings);
+    sendEmail(to, nullptr, nullptr, subject, body, mailServer, port, sender, warnings);
+}
+
+void sendEmailAttachText(const char * to, const char * cc, const char * bcc, const char * subject, const char * body, const char * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings)
+{
+    CMailInfo info(to, cc, bcc, subject, mailServer, port, sender, warnings);
     CTextMailPart inlinedPart(body, "text/plain; charset=ISO-8859-1", NULL);
     CTextMailPart attachmentPart(attachment, mimeType, attachmentName);
     CMultiMailPart multiPart(inlinedPart, attachmentPart);
     doSendEmail(info, multiPart);
 }
 
-void sendEmailAttachData(const char * to, const char * subject, const char * body, size32_t lenAttachment, const void * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings)
+void sendEmailAttachText(const char * to, const char * subject, const char * body, const char * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings)
+{
+    sendEmailAttachText(to, nullptr, nullptr, subject, body, attachment, mimeType, attachmentName, mailServer, port, sender, warnings);
+}
+
+void sendEmailAttachData(const char * to, const char * cc, const char * bcc, const char * subject, const char * body, size32_t lenAttachment, const void * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings)
 {
-    CMailInfo info(to, subject, mailServer, port, sender, warnings);
+    CMailInfo info(to, cc, bcc, subject, mailServer, port, sender, warnings);
     CTextMailPart inlinedPart(body, "text/plain; charset=ISO-8859-1", NULL);
     CDataMailPart attachmentPart(lenAttachment, attachment, mimeType, attachmentName);
     CMultiMailPart multiPart(inlinedPart, attachmentPart);
     doSendEmail(info, multiPart);
 }
 
+void sendEmailAttachData(const char * to, const char * subject, const char * body, size32_t lenAttachment, const void * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings)
+{
+    sendEmailAttachData(to, nullptr, nullptr, subject, body, lenAttachment, attachment, mimeType, attachmentName, mailServer, port, sender, warnings);
+}
+

+ 5 - 0
common/remote/rmtsmtp.hpp

@@ -27,8 +27,13 @@
 #define REMOTE_API DECL_IMPORT
 #endif
 
+extern REMOTE_API void sendEmail( const char * to, const char * cc, const char * bcc, const char * subject, const char * body, const char * mailServer, unsigned port, const char * sender, StringArray *warnings=NULL);
 extern REMOTE_API void sendEmail( const char * to, const char * subject, const char * body, const char * mailServer, unsigned port, const char * sender, StringArray *warnings=NULL);
+
+extern REMOTE_API void sendEmailAttachText(const char * to, const char * cc, const char * bcc, const char * subject, const char * body, const char * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings=NULL);
 extern REMOTE_API void sendEmailAttachText(const char * to, const char * subject, const char * body, const char * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings=NULL);
+
+extern REMOTE_API void sendEmailAttachData(const char * to, const char * cc, const char * bcc, const char * subject, const char * body, size32_t lenAttachment, const void * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings=NULL);
 extern REMOTE_API void sendEmailAttachData(const char * to, const char * subject, const char * body, size32_t lenAttachment, const void * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, StringArray *warnings=NULL);
 
 

+ 28 - 22
ecllibrary/std/system/Email.ecl

@@ -8,48 +8,54 @@ RETURN MODULE
 
 /*
  * Sends an email message using a mail server.
- * 
- * @param sendto        A comma-delimited list of the addresses of the intended recipients.
+ *
+ * @param to            A comma-delimited list of the addresses of the intended recipients.
  * @param subject       The subject line.
  * @param body          The text of the email to send.
- * @param server        The name of the mail server. Defaults to GETENV(SMTPserver).
+ * @param mailServer    The name of the mail server. Defaults to GETENV(SMTPserver).
  * @param port          The port number on the server to connect to. Defaults to GETENV(SMTPport)
  * @param sender        The sender of the email. Defaults to GETENV(emailSenderAddress)
+ * @param cc            Optional comma-delimited addresses of carbon-copy recipients. Defaults to an empty string (none).
+ * @param bcc           Optional comma-delimited addresses of blind-carbon-copy recipients. Defaults to an empty string (none).
  */
 
-EXPORT SendEmail(varstring to, varstring subject, varstring body, varstring mailServer=GETENV('SMTPserver'), unsigned4 port=(unsigned4) GETENV('SMTPport', '25'), varstring sender=GETENV('emailSenderAddress')) :=
-    lib_fileservices.FileServices.SendEmail(to, subject, body, mailServer, port, sender);
+EXPORT SendEmail(varstring to, varstring subject, varstring body, varstring mailServer=GETENV('SMTPserver'), unsigned4 port=(unsigned4) GETENV('SMTPport', '25'), varstring sender=GETENV('emailSenderAddress'), varstring cc='', varstring bcc='') :=
+    lib_fileservices.FileServices.SendEmail(to, subject, body, mailServer, port, sender, cc, bcc);
 
 /*
  * Sends an email message with a text attachment using a mail server.
- * 
- * @param sendto        A comma-delimited list of the addresses of the intended recipients.
+ *
+ * @param to            A comma-delimited list of the addresses of the intended recipients.
  * @param subject       The subject line.
  * @param body          The text of the email to send.
  * @param attachment    The text of the attachment to send.  Must be a valid string with no embedded nulls.
- * @param server        The name of the mail server. Defaults to GETENV(SMTPserver).
+ * @param mailServer    The name of the mail server. Defaults to GETENV(SMTPserver).
  * @param port          The port number on the server to connect to. Defaults to GETENV(SMTPport)
  * @param sender        The sender of the email. Defaults to GETENV(emailSenderAddress)
+ * @param cc            Optional comma-delimited addresses of carbon-copy recipients. Defaults to an empty string (none).
+ * @param bcc           Optional comma-delimited addresses of blind-carbon-copy recipients. Defaults to an empty string (none).
  */
 
-EXPORT SendEmailAttachText(varstring to, varstring subject, varstring body, varstring attachment, varstring mimeType, varstring attachmentName, varstring mailServer=GETENV('SMTPserver'), unsigned4 port=(unsigned4) GETENV('SMTPport', '25'), varstring sender=GETENV('emailSenderAddress')) :=
-    lib_fileservices.FileServices.SendEmailAttachText(to, subject, body, attachment, mimeType, attachmentName, mailServer, port, sender);
+EXPORT SendEmailAttachText(varstring to, varstring subject, varstring body, varstring attachment, varstring mimeType, varstring attachmentName, varstring mailServer=GETENV('SMTPserver'), unsigned4 port=(unsigned4) GETENV('SMTPport', '25'), varstring sender=GETENV('emailSenderAddress'), varstring cc='', varstring bcc='') :=
+    lib_fileservices.FileServices.SendEmailAttachText(to, subject, body, attachment, mimeType, attachmentName, mailServer, port, sender, cc, bcc);
 
 /*
  * Sends an email message with an arbitrary attachment using a mail server.
- * 
- * @param sendto        A comma-delimited list of the addresses of the intended recipients.
- * @param subject       The subject line.
- * @param body          The text of the email to send.
- * @param attachment    The attachment to send.
- * @param mimeType      The mem type of the attachment.  E.g. 'text/plain; charset=ISO-8859-3'
- * @param attachmentName The name of the attachement - often a filename.
- * @param server        The name of the mail server. Defaults to GETENV(SMTPserver).
- * @param port          The port number on the server to connect to. Defaults to GETENV(SMTPport)
- * @param sender        The sender of the email. Defaults to GETENV(emailSenderAddress)
+ *
+ * @param to                A comma-delimited list of the addresses of the intended recipients.
+ * @param subject           The subject line.
+ * @param body              The text of the email to send.
+ * @param attachment        The attachment to send.
+ * @param mimeType          The mime type of the attachment.  E.g. 'text/plain; charset=ISO-8859-3'
+ * @param attachmentName    The name of the attachement - often a filename.
+ * @param mailServer        The name of the mail server. Defaults to GETENV(SMTPserver).
+ * @param port              The port number on the server to connect to. Defaults to GETENV(SMTPport)
+ * @param sender            The sender of the email. Defaults to GETENV(emailSenderAddress)
+ * @param cc                Optional comma-delimited addresses of carbon-copy recipients. Defaults to an empty string (none).
+ * @param bcc               Optional comma-delimited addresses of blind-carbon-copy recipients. Defaults to an empty string (none).
  */
 
-EXPORT SendEmailAttachData(varstring to, varstring subject, varstring body, data attachment, varstring mimeType, varstring attachmentName, varstring mailServer=GETENV('SMTPserver'), unsigned4 port=(unsigned4) GETENV('SMTPport', '25'), varstring sender=GETENV('emailSenderAddress')) :=
-    lib_fileservices.FileServices.SendEmailAttachData(to, subject, body, attachment, mimeType, attachmentName, mailServer, port, sender);
+EXPORT SendEmailAttachData(varstring to, varstring subject, varstring body, data attachment, varstring mimeType, varstring attachmentName, varstring mailServer=GETENV('SMTPserver'), unsigned4 port=(unsigned4) GETENV('SMTPport', '25'), varstring sender=GETENV('emailSenderAddress'), varstring cc='', varstring bcc='') :=
+    lib_fileservices.FileServices.SendEmailAttachData(to, subject, body, attachment, mimeType, attachmentName, mailServer, port, sender, cc, bcc);
 
 END;

文件差异内容过多而无法显示
+ 24 - 9
plugins/fileservices/fileservices.cpp


+ 3 - 0
plugins/fileservices/fileservices.hpp

@@ -46,8 +46,11 @@ FILESERVICES_API bool FILESERVICES_CALL fsFileValidate(ICodeContext *ctx, const
 FILESERVICES_API void FILESERVICES_CALL fsSetReadOnly(ICodeContext *ctx, const char *name, bool ro);
 FILESERVICES_API void FILESERVICES_CALL fsRenameLogicalFile(ICodeContext *ctx, const char *oldname, const char *newname);
 FILESERVICES_API void FILESERVICES_CALL fsRenameLogicalFile_v2(ICodeContext *ctx, const char *oldname, const char *newname, bool overwrite=false);
+FILESERVICES_API void FILESERVICES_CALL fsSendEmail_v2(ICodeContext * ctx, const char *to, const char * subject, const char * body, const char * mailServer, unsigned port, const char * sender, const char *cc, const char *bcc);
 FILESERVICES_API void FILESERVICES_CALL fsSendEmail(ICodeContext * ctx, const char *to, const char * subject, const char * body, const char * mailServer, unsigned port, const char * sender);
+FILESERVICES_API void FILESERVICES_CALL fsSendEmailAttachText_v2(ICodeContext * ctx, const char * to, const char * subject, const char * body, const char * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, const char *cc, const char *bcc);
 FILESERVICES_API void FILESERVICES_CALL fsSendEmailAttachText(ICodeContext * ctx, const char * to, const char * subject, const char * body, const char * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender);
+FILESERVICES_API void FILESERVICES_CALL fsSendEmailAttachData_v2(ICodeContext * ctx, const char * to, const char * subject, const char * body, size32_t lenAttachment, const void * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender, const char *cc, const char *bcc);
 FILESERVICES_API void FILESERVICES_CALL fsSendEmailAttachData(ICodeContext * ctx, const char * to, const char * subject, const char * body, size32_t lenAttachment, const void * attachment, const char * mimeType, const char * attachmentName, const char * mailServer, unsigned int port, const char * sender);
 FILESERVICES_API char * FILESERVICES_CALL fsCmdProcess(const char *prog, const char *src);
 FILESERVICES_API void FILESERVICES_CALL fsCmdProcess2(unsigned & tgtLen, char * & tgt, const char *prog, unsigned srcLen, const char * src);