Do-While loop in Python, with limit on the amount of 'do's
Python has a language feature just for that: else clauses on loops.


  Loop statements may have an else clause; it is executed when the loop terminates through exhaustion of the list (with for) or when the condition becomes false (with while), but not when the loop is terminated by a break statement.


def post_safe(url, params):
    max_tries = 3
    messages = []

    for _ in range(max_tries):
        try:
            response = requests.post(url, data=params)
            return True
        except Exception as e:
            messages.append(e)
            time.sleep(1)

    else:
        print(datetime.now().strftime('%Y-%m-%d %H:%M'))
        print("requests() failed %d times:" % (max_tries))
        for m in messages:
            print(m)
        return False


I'd also make the following changes:


The else clause on the try block is unnecessary; it can be replaced with a break within the try block just after calling .post().  But in the end, you'll just end up returning True, so why not get out of there right away with return True?  (For that matter, the else block that I just suggested is also unnecessary, as the else could be removed and its contents outdented by one level.)
It seems easier to print each line separately than to build a multi-line string to print all at once.  You might want to consider logging instead.