Current section

Files

Jump to
maildir_commander src mc_popper.erl
Raw

src/mc_popper.erl

%% pop emails from pop3 servers
-module(mc_popper).
-include_lib("kernel/include/logger.hrl").
%% apis
-export([pop_all/3]).
%% pop a POP3 account. emails are delivered into maildir.
%% throw error if anything wrong happen
-spec pop_all(list(), list(), list()) -> ok.
pop_all(User, Pass, Host) ->
{ok, Connection} = epop_client:connect(User, Pass,
[{addr, Host}, {port, 995}, {user, User}, ssl ]),
{ok, {TotalCount, TotalSize}} = epop_client:stat(Connection),
lists:foreach(fun (Seq) -> pop_one(Seq, Connection) end, lists:seq(1, TotalCount)),
epop_client:quit(Connection),
?LOG_NOTICE("~B mails, ~B bytes downloaded by POP3", [TotalCount, TotalSize]),
ok.
pop_one(Seq, Connection) ->
Filename = make_temp_mail(),
Newdir = mc_mender:maildir_path("/", new),
Tmpdir = mc_mender:maildir_path("/", tmp),
TmpFile = Tmpdir ++ Filename,
NewFile = Newdir ++ Filename,
{ok, File} = file:open(TmpFile, [write, raw, delayed_write]),
{ok, Acc} = epop_client:retrieve_start(Connection, Seq),
NewAcc = write_mail(Acc, File),
file:close(File),
ok = epop_client:retrieve_after(NewAcc),
ok = epop_client:delete(Connection, Seq),
ok = file:rename(TmpFile, NewFile).
make_temp_mail() ->
Time = os:system_time(microsecond),
{ok, Host} = net:gethostname(),
Pid = string:trim(pid_to_list(self()), both, "<>"),
io_lib:format("~B.M~BP~s.~s", [Time div 1_000_000, Time rem 1_000_000, Pid, Host]).
write_mail(Acc, File) ->
case epop_client:retrieve_next(Acc) of
{halt, NewAcc} -> NewAcc;
{Line, NewAcc} ->
Trimmed = string:trim(Line, trailing, ["\r\n"]),
ok = file:write(File, [Trimmed, "\n"]),
write_mail(NewAcc, File)
end.