def set_auto_reply(self, message, status=AutoReplyStatus.ALWAYS_ENABLED, start=None, end=None,
                       external_message=None, audience=AutoReplyAudience.ALL):
        # type: (str, OutlookAccount.AutoReplyStatus, datetime, datetime, str, OutlookAccount.AutoReplyAudience) -> None
        """ Set an automatic reply for the account.
        Args:
            message (str): The message to be sent in replies. If external_message is provided this is the message sent
            to internal recipients
            status (OutlookAccount.AutoReplyStatus): Whether the auto-reply should be always enabled, scheduled, or
            disabled. You can use :class:`AutoReplyStatus <pyOutlook.core.main.OutlookAccount.AutoReplyStatus>` to
            provide the value. Defaults to ALWAYS_ENABLED.
            start (datetime): If status is set to SCHEDULED, this is when the replies will start being sent.
            end (datetime): If status is set to SCHEDULED, this is when the replies will stop being sent.
            external_message (str): If provided, this message will be sent to external recipients.
            audience (OutlookAccount.AutoReplyAudience): Whether replies should be sent to everyone, contacts only,
            or internal recipients only. You can use
            :class:`AutoReplyAudience <pyOutlook.core.main.OutlookAccount.AutoReplyAudience>` to provide the value.

        """

        start_is_none = start is None
        end_is_none = end is None

        if (not start_is_none and end_is_none) or (start_is_none and not end_is_none):
            raise ValueError('Start and End not must both either be None or datetimes')

        start_is_datetime = isinstance(start, datetime)
        end_is_datetime = isinstance(end, datetime)

        if not start_is_datetime and not start_is_none or not end_is_datetime and not end_is_none:
            raise ValueError('Start and End must both either be None or datetimes')

        request_data = dict(Status=status, ExternalAudience=audience)

        # Outlook requires both an internal and external message. For convenience, pyOutlook allows only one message
        # and uses that as the external message if none is provided
        if external_message is None:
            external_message = message

        request_data.update(InternalReplyMessage=message, ExternalReplyMessage=external_message)

        if not start_is_none and not end_is_none:
            request_data.update(ScheduledStartDateTime=dict(DateTime=str(start)))
            request_data.update(ScheduledEndDateTime=dict(DateTime=str(end)))

        data = {
            "@odata.context": "https://outlook.office.com/api/v2.0/$metadata#Me/MailboxSettings",
            "AutomaticRepliesSetting": request_data
        }

        requests.patch('https://outlook.office.com/api/v2.0/me/MailboxSettings',
                       headers=self._headers, data=json.dumps(data))

        self._auto_reply = message
Set an automatic reply for the account.
        Args:
            message (str): The message to be sent in replies. If external_message is provided this is the message sent
            to internal recipients
            status (OutlookAccount.AutoReplyStatus): Whether the auto-reply should be always enabled, scheduled, or
            disabled. You can use :class:`AutoReplyStatus <pyOutlook.core.main.OutlookAccount.AutoReplyStatus>` to
            provide the value. Defaults to ALWAYS_ENABLED.
            start (datetime): If status is set to SCHEDULED, this is when the replies will start being sent.
            end (datetime): If status is set to SCHEDULED, this is when the replies will stop being sent.
            external_message (str): If provided, this message will be sent to external recipients.
            audience (OutlookAccount.AutoReplyAudience): Whether replies should be sent to everyone, contacts only,
            or internal recipients only. You can use
            :class:`AutoReplyAudience <pyOutlook.core.main.OutlookAccount.AutoReplyAudience>` to provide the value.