В корне я конечно алгоритм не улучшу, но на пару мелочей внимание обращу.
1) string path = folder + username; - Вы раз за разом пересчитываете эту переменную. Я не нашел внутри цикла изменений переменных - соответственно вы просто так создаете строку, потом убиваете ссылку и объект продолжает висеть до лучших времен.
2) if (checktextBox.Checked && wordFind(message.Subject, message.Body, message.From.ToString(), message.To)) { continue; }
Вы сначала делаете какие-то телодвижения, а потом, вне зависимости от результатов этих телодвижений, выясняете а есть ли в них смысл. Т. е. это просто лишние телодвижения - if можно поднять в самый верх.
3) writer.Close(); //Хотя в принципе закроется при Dispose - ну и зачем тогда?
4)
try
{}
catch{continue;}
Т.е. вы не имеете ни малейшего представления о том какие ошибки возникают при работе. Большое количество исключений в цикле здорово тормозит производительность, а вы даже не знаете возникают ли они. Возможно что всю конструкцию можно убрать добавив пару проверок для избавления от исключений.
Если честно - я бы переделал весь процесс сохранения файлов. Добавить очередь на сохранение и ряд потоков разбирающих эту очередь. Тогда циклом вы набиваете очередь и закрываете метод, а потом это все сохранится. Хотя не думаю что это лучшее решение, но в принципе имеет право на жизнь.