直接进入主题
准备工作
1.作为第三方邮件发送系统,需要发送方邮件开启相应权限,以sina为例
我这边使用是smtp协议来进行邮件发送
2.smtp协议沟通流程
我们知道邮件发送其实就是网络数据流的发送,那么我们就可以利用socket来进行发送,选用的方式可以安全加密ssl,还有普通tcp模式。这里介绍也就是ssl发送方式,那么就需要账号跟密码了。对于这些通用网络开发,就不多做介绍。先了解下smtp是如何进行沟通,然后发送邮件的。
准备工作完毕,开始写代码了。先定好框架吧
1.配置文件.app,用于配置邮箱账号发送者发送内容等。
2.头文件.hrl 用来定义常用宏及record(主要用来保存配置)
3.主体代码.erl
3.1 init_config() 初始化配置,保存下来
3.2 send_email() 发送
重点讲send_email() 里面细节
我们了解smtp沟通流程以后,我们在选用ssl,需要通过用户的账号验证。
%%沟通账号
connect_email(Sock, Email) ->
send_socket(Sock, "HELO " ++ Email#email_config.account ++ "\r\n"),
recv_socket(Sock),
send_socket(Sock, "AUTH LOGIN\r\n"),
recv_socket(Sock),
send_socket(Sock, base64:encode(Email#email_config.account)),
send_socket(Sock, "\r\n"),
recv_socket(Sock),
send_socket(Sock, base64:encode(Email#email_config.password)),
send_socket(Sock, "\r\n"),
recv_socket(Sock).
%% 发送邮件头
send_email_head(Sock, Email) ->
send_socket(Sock, "MAIL FROM <" ++ Email#email_config.account ++ ">\r\n"),
recv_socket(Sock),
rcpt_to_emails(Sock, Email#email_config.to_emails),
recv_socket(Sock).
%%发送信息(发送人,发送主题)
send_email_info(Sock, Email) ->
send_socket(Sock, "DATA\r\n"),
recv_socket(Sock),
send_socket(Sock, "FROM:<" ++ Email#email_config.account ++ ">\r\n"),
recv_socket(Sock),
Subject = unicode:characters_to_list(Email#email_config.subject),
send_socket(Sock, "SUBJECT:"++ Subject ++ "\r\n").
%% 发送数据(文本,html,附件)
send_email_data(Sock, Email) when Email#email_config.text =/= undefined;
Email#email_config.html =/= undefined;
Email#email_config.attachment =/= undefined ->
send_socket(Sock, "MIME-VERSION: 1.0\r\n"),
send_socket(Sock, "CONTENT-TYPE: multipart/mixed; BOUNDARY=\"#BOUNDARY#\"\r\n"),
send_socket(Sock, "\r\n"),
case Email#email_config.text of
undefined -> nothing_to_do;
_ -> send_email_text("text/plain", Email#email_config.text, Sock)
end,
case Email#email_config.html of
undefined -> nothing_to_do;
_ -> send_email_text("text/html", Email#email_config.html, Sock)
end,
case Email#email_config.attachment of
undefined -> nothing_to_do;
_ -> send_email_attachment("application/msword", Email#email_config.attachment, Sock)
end;
send_email_data(_Sock, _Email) ->
ok.
%%结束发送
end_email(Sock) ->
send_socket(Sock, "\r\n.\r\n"),
recv_socket(Sock),
send_socket(Sock, "QUIT\r\n"),
recv_socket(Sock).