When it comes to "best practices" to mock interfaces, there's a number of things to consider, not in the least: ease of use. Over the years, I've taken to use a mock generator tool. Rather than just implementing the interface in question, GoMock supports a lot of other useful things. You can read more about it here.
The way to use it in your case ...
This seems fine to me: it's nice and simple, and I've seen this pattern used "in the wild" before. One thing you could do is, in the MockUserRepo proxying functions, if the function variable is nil, either execute a default implementation, or return a more specific error (or even panic). For example:
func (m *MockUserRepo) GetUserByEmail(s string) (...
An alternative way for representing your constants if you don't need their string representations would be to use the iota identifier built into golang to assign auto-incrementing enumerations like so:
Plus = iota // 0
Minus // 1
Number // 2
Skip // 3
Newline // 4
This is ...
A couple thoughts on contact.go.
In general, it's advised to not use global variables like
var mailgunSender string = "email@example.com"
var mailgunReceiver string = "firstname.lastname@example.org"
Instead, there are a few options. You already have a struct definition inside the HandleContact closure, so you could just move them ...