* @method task:has_recipients([type])
* Return true if there are SMTP or MIME recipients for a task.
* @param {integer|string} type if specified has the following meaning: `0` or `any` means try SMTP recipients and fallback to MIME if failed, `1` or `smtp` means checking merely SMTP recipients and `2` or `mime` means MIME recipients only
- * @return {bool} `true` if there are recipients of the following type
+ * @return {bool,integer} `true` if there are recipients of the following type and a number of such a recipients excluding artificial ones
*/
LUA_FUNCTION_DEF (task, has_recipients);
for (i = 0; i < addrs->len; i ++) {
addr = g_ptr_array_index (addrs, i);
-
if (addr->flags & RSPAMD_EMAIL_ADDR_ORIGINAL) {
if (flags & RSPAMD_ADDRESS_ORIGINAL) {
lua_push_email_address (L, addr);
return 1;
}
+static inline int
+rspamd_check_real_recipients_array_size (GPtrArray *ar)
+{
+ gint ret = 0, i;
+ struct rspamd_email_address *addr;
+
+ PTR_ARRAY_FOREACH(ar, i, addr) {
+ if (!(addr->flags & RSPAMD_ADDRESS_ORIGINAL)) {
+ ret ++;
+ }
+ }
+
+ return ret;
+}
+
static gint
lua_task_has_recipients (lua_State *L)
{
switch (what & RSPAMD_ADDRESS_MASK) {
case RSPAMD_ADDRESS_SMTP:
/* Here we check merely envelope rcpt */
- CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
+ nrcpt = rspamd_check_real_recipients_array_size(task->rcpt_envelope);
+ ret = nrcpt > 0;
break;
case RSPAMD_ADDRESS_MIME:
/* Here we check merely mime rcpt */
- CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD_CHECK (task, rcpt_mime));
+ nrcpt = rspamd_check_real_recipients_array_size(MESSAGE_FIELD_CHECK (task, rcpt_mime));
+ ret = nrcpt > 0;
break;
case RSPAMD_ADDRESS_ANY:
default:
- CHECK_EMAIL_ADDR_LIST (task->rcpt_envelope);
+ nrcpt = rspamd_check_real_recipients_array_size(task->rcpt_envelope);
+ ret = nrcpt > 0;
if (!ret) {
- CHECK_EMAIL_ADDR_LIST (MESSAGE_FIELD_CHECK (task, rcpt_mime));
+ nrcpt = rspamd_check_real_recipients_array_size(MESSAGE_FIELD_CHECK (task, rcpt_mime));
+ ret = nrcpt > 0;
}
break;
}
}
lua_pushboolean (L, ret);
+ lua_pushinteger (L, nrcpt);
- if (ret) {
- lua_pushinteger (L, nrcpt);
- return 2;
- }
-
- return 1;
+ return 2;
}
static gint