Italian media quoted witnesses as saying that the regional train began to shake heavily as if it was travelling over rocks, before braking suddenly and derailing.
One of the carriages jack-knifed across the track, bent almost at a right angle.
“Unfortunately the train was full, and if the current toll ends up staying as it is it would almost be a miracle. The train was packed with commuters and students,” said Milan’s police commissioner Marcello Cardona.
The cause of the crash was not immediately clear.
Milan prosecutors have opened a probe, and investigators have begun questioning the driver, Italian media said.
Rescuers spent the morning searching the wreckage for victims and firefighters said 10 people were seriously injured, including five in a life-threatening condition.
According to regional emergency services in Milan, another 100 people sustained light injuries in the incident, which took place at around 7 am (0600 GMT) near Segrate in Milan’s northeastern suburbs.
The derailment is the most serious rail accident in Italy since 23 people were killed in a high-speed head-on collision between two passenger trains in July 2016 in the southern Puglia region.
– ‘Mummy, help!’ –
One woman told the newspaper La Repubblica that her daughter had called her on her phone to say “Mummy, help, the train is derailing” as the accident happened.
Pictures issued by the Italian fire service showed at least one passenger stuck in his seat, closed in by the wreckage.
Firefighters were seen carrying victims into a waiting helicopter.
The regional train was travelling between the town of Cremona and Italy’s business and finance capital.
“We are investigating the dynamics of the incident, the rail structure… everything has to be checked piece by piece,” Cardona said.
An official from Rete Ferroviaria Italiana (RFI), which manages the rail network, said that one of the potential causes of the incident could be a 20-centimetre rupture in the track, but that it was still working to establish whether that was “the cause or a consequence of the incident”.
“There was either a problem with the tracks or the train’s bogie (structure),” said Dario Barlotta, a representative of Italy’s National Public Transport Observatory.
The six-carriage train belonged to the Lombardy regional rail company Trenord, which is owned equally by the public company Trenitalia and Ferrovie Nord Milano and operates principally in the north of Italy.
Trenord informed passengers at 8 am of the interruption to services due to a “technical problem”, sparking sharp criticism on social media.
“In recent years we have invested more in high-speed trains and the main lines than in the network that should take people to work every day,” said Cattaneo Raffaele, president of the Lombardy regional council.
“There needs to be political attention on the need to invest more in suburban rail travel.”