def METHOD_NAME(self, users: Iterable, msg: AnyStr, markdown=False, **kwargs):
    """
    https://open.work.weixin.qq.com/api/doc/90000/90135/90236
    对于业务代码，只需要关心由 用户id 或 消息不对 导致的错误，其他错误不予理会
    """
    users = tuple(users)
    extra_params = {
        "safe": 0,
        "enable_id_trans": 0,
        "enable_duplicate_check": 0,
        "duplicate_check_interval": 1800
    }
    update_values(extra_params, kwargs)
    body = {
        "touser": '|'.join(users),
        "msgtype": "text",
        "agentid": self._agentid,
        "text": {
            "content": msg
        },
        **extra_params
    }
    if markdown:
        body['msgtype'] = 'markdown'
        body["markdown"] = {
            "content": msg
        }
        body.pop('text', '')
    logger.info(f'Wecom send text: users={users} msg={msg}')
    data = self._requests.post(URL.SEND_MESSAGE, json=body, check_errcode_is_0=False)
    errcode = data['errcode']
    if errcode in (ErrorCode.RECIPIENTS_INVALID, ErrorCode.RECIPIENTS_EMPTY):
        # 全部接收人无权限或不存在
        return users
    self._requests.check_errcode_is_0(data)
    if 'invaliduser' not in data:
        return ()
    invaliduser = data['invaliduser']
    if not invaliduser:
        return ()
    if isinstance(invaliduser, str):
        logger.error(f'WeCom send text 200, but invaliduser is not str: invaliduser={invaliduser}')
        raise WeComError
    invalid_users = invaliduser.split('|')
    return invalid_users