Это синонимы, но имеющие различные оттенки. Да, они обозначают повторение чего-то. Но «снова» употребляется в том случае, когда мы нейтрально относимся к ситуации («снова пошел дождь», «снова она пришла»). «Опять» же имеет отрицательный оттенок. Мы его употребляем в том случае, если повторение чего-либо нам нежелательно, неприятно («опять дождь пошёл», «опять она пришла»), при этом делаем ударение на слово «опять», выделяем его, подчеркивая своё недовольство. И чем выразительнее говорим «опять», тем яснее звучит наше недовольство («ОПЯЯЯТЬ дождь пошёл»).
Поэтому «не опять, а снова» говорят в том случае, когда пытаются нейтрализовать недовольство собеседника.
— Опять ты пришёл?
— Не опять, а снова!
Этим самым пришедший пытается нейтрализовать негативный оттенок, как бы говоря: «Успокойся, не злись!».