在此之前,淮军也接收过不少降兵,程学启就是最著名的降将,且已被李鸿章倚为干城。太仓的太平军佐将钱寿仁几个月前率两千多人向淮军投降,也被接纳了,他改名为周寿昌,用降兵组成了昌字营。淮军的建字、玉字、有字、忠字、荣字、群字、义字各营,都是太平军的降军。但太平军这次作用不大的诈降,却把这种信任摧毁了,在后来的战争中,杀俘、杀降,几乎成了普遍现象,代价十分巨大。
淮军上下怒火冲天,求战之心十分迫切。三月十一日,戈登、李恒嵩率常胜军赶到,李鸿章遂调各军合力进攻太仓。程学启与戈登商量后,派三营开字营兵进扎太仓西门外;淮扬水师中营也集结在西门大河上;常胜军把南门外的几座太平军营垒先行摧毁,廓清外围。
十三日,暴雨竟日,各营按兵不动,蓄势待发。
十四日,战斗首先在河上打响,三十多艘太平军的炮艇驶近,向淮扬水师开火,水面上顿时激起条条水柱。程学启派洋枪队与水师配合,水陆夹攻。在猛烈炮火的压制下,太平军的炮艇无路可走,只得缴械投降。但由于吃过诈降的亏,淮军愤恨至极,大肆报复,把十九名首领和上百名降兵,统统押到岸边的树丛中杀死。
冷血、残酷的杀降,就从这时开始,并且愈演愈烈。
十五日,太平军的各路援军都已告败,太仓已成一座耸立于硝烟中的孤城。淮军最后的总攻开始了。李鸿章这样描述战斗经过:
李鸿章承认“围而杀之”万余人,虽然没说杀俘、杀降,但性质并无区别,因为淮军这次根本不接受投降,也不接受俘虏,一律杀死。太仓之屠,比曾国荃在菱湖杀俘,有过之而无不及。这究竟是出于李鸿章的命令,还是前线官兵自作主张的报复行动,今已无法确认,但李鸿章在奏报中,无疑是作为战功上报的。
李鸿章写信给曾国藩说:“城贼实万余人,漏网盖少,惨劫亦快事也。蔡逆新封会王,系伪忠王之婿,在贼中著名凶狡。忠贼北行,以苏浙一带地方交蔡与慕、听两王防守,歼此渠魁,亦去一患。” 可见他对太仓之屠颇为得意。后人很难把一个杀了上万人以后还觉得“亦快事也”的人,与一个埋头案牍校刊《经史百家杂钞》的儒生形象联系起来。这事让孔夫子来评判,亦当无言。
所报数字与实际屠杀人数相比,显然有所夸张,这是历来写战报的惯例。据说,当时李鸿章接获前线战报,兴奋地对刘秉璋说:“杀寇数万人,可以偿吾将士之命矣。”刘秉璋默不作声,李鸿章问他为什么沉默,刘说:“吾方思所见,吾于南门坡下见一寇逃未出,死于途。他无所知,不敢诳报。”李鸿章大笑置之。
讽刺的是,蔡元隆在这次战斗中,并没有被杀死,翌年他在浙江海宁向闽浙总督兼署浙江巡抚的左宗棠投降,更名元吉。左宗棠不仅接纳了他,还挑选了八营兵勇给他统带。这成了李鸿章与左宗棠交恶最早的一个伏因。后来蔡元隆部在湖州被太平军歼灭,战后蔡元隆返回湖南华容老家,成为当地富绅,居然妻妾成群、儿孙绕膝,安享晚年。