Вы довольно близки, но регулярное выражение не будет перехватывать все форматы электронной почты, и вам не нужно указывать A-Za-z, вы можете просто использовать флаг "i", чтобы отметить все выражение как регистрнечувствительны.Существуют пропущенные случаи формата электронной почты (особенно субдомены), но это ловит те, которые я тестировал.
$string = file_get_contents("example.txt"); // Load text file contents
// don't need to preassign $matches, it's created dynamically
// this regex handles more email address formats like a+b@google.com.sg, and the i makes it case insensitive
$pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
// preg_match_all returns an associative array
preg_match_all($pattern, $string, $matches);
// the data you want is in $matches[0], dump it with var_export() to see it
var_export($matches[0]);
output:
array (
0 => 'test1+2@gmail.com',
1 => 'test-2@yahoo.co.jp',
2 => 'test@test.com',
3 => 'test@test.co.uk',
4 => 'test@google.com.sg',
)