erlang邮件系统

本文介绍了如何使用Erlang实现SMTP协议发送邮件,包括SMTP的沟通流程、SSL连接、账号验证以及邮件头、正文和附件的发送过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接进入主题

准备工作

1.作为第三方邮件发送系统,需要发送方邮件开启相应权限,以sina为例

我这边使用是smtp协议来进行邮件发送

2.smtp协议沟通流程

我们知道邮件发送其实就是网络数据流的发送,那么我们就可以利用socket来进行发送,选用的方式可以安全加密ssl,还有普通tcp模式。这里介绍也就是ssl发送方式,那么就需要账号跟密码了。对于这些通用网络开发,就不多做介绍。先了解下smtp是如何进行沟通,然后发送邮件的。

http://wenku.baidu.com/link?url=XjUrYv4iqgDE0lw33Jc1SoC73Tip-gDm2p5kN1fi-4CQdMBWt6ji9--rBv0LomHO4ryVpOcgkrvyuViclXLg-5Qqh50-zffylmAdvipT_8a

准备工作完毕,开始写代码了。先定好框架吧

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).

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值