A class that creates its own dependencies is tightly coupled to their concrete implementations. DI lets you swap implementations — for example, replace a real mailer with a fake one in tests — without changing the class itself.
Most frameworks include a built-in container that resolves dependencies automatically: it reads the class constructor, finds registered implementations of interfaces, and injects them. You describe "what is needed" — the container decides "where to get it".