To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables, an objective function, and constraints.

Let's define:
- $x_1$ as the number of postal service pickups.
- $x_2$ as the number of vans hired.

The objective is to maximize the total number of gifts sent out. Since each postal service pickup can take 100 gifts and each van can take 80 gifts, the objective function can be represented as:
\[ \text{Maximize: } 100x_1 + 80x_2 \]

Given the costs and the budget constraint:
- The cost per postal service pickup is $50.
- The cost per van is $40.
- The total budget is $1000.

The budget constraint can be represented as:
\[ 50x_1 + 40x_2 \leq 1000 \]

Additionally, we have the constraint that the number of vans cannot exceed the number of postal service pickups:
\[ x_2 \leq x_1 \]

And, since we cannot have negative numbers of pickups or vans:
\[ x_1 \geq 0, x_2 \geq 0 \]

Also, both $x_1$ and $x_2$ must be integers because you can't have a fraction of a pickup or van.

In symbolic representation with natural language objects:
```json
{
    'sym_variables': [('x1', 'number of postal service pickups'), ('x2', 'number of vans hired')],
    'objective_function': 'Maximize: 100*x1 + 80*x2',
    'constraints': ['50*x1 + 40*x2 <= 1000', 'x2 <= x1', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Gift_Sending_Optimization")

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="postal_service_pickups")
x2 = m.addVar(vtype=GRB.INTEGER, name="vans_hired")

# Set the objective function
m.setObjective(100*x1 + 80*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(50*x1 + 40*x2 <= 1000, "Budget_Constraint")
m.addConstr(x2 <= x1, "Vans_vs_Pickups_Constraint")
m.addConstr(x1 >= 0, "Non_Negativity_x1")
m.addConstr(x2 >= 0, "Non_Negativity_x2")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal Solution Found:")
    print(f"Number of postal service pickups: {x1.x}")
    print(f"Number of vans hired: {x2.x}")
    print(f"Total gifts sent: {100*x1.x + 80*x2.x}")
else:
    print("No optimal solution found.")
```