gen_smtp客户端实战:发送带DKIM签名邮件的完整示例代码
gen_smtp客户端实战发送带DKIM签名邮件的完整示例代码【免费下载链接】gen_smtpThe extensible Erlang SMTP client and server library.项目地址: https://gitcode.com/gh_mirrors/ge/gen_smtpgen_smtp是一个强大的Erlang SMTP客户端和服务器库提供了构建邮件系统的完整功能。本文将详细介绍如何使用gen_smtp客户端发送带有DKIM签名的邮件确保邮件的真实性和完整性。准备工作生成DKIM密钥对在开始之前您需要准备DKIM密钥对。DKIMDomainKeys Identified Mail是一种电子邮件认证方法通过使用私钥签名邮件接收方可以使用公钥验证邮件是否被篡改。gen_smtp项目中提供了测试用的DKIM密钥文件位于test/fixtures/目录下RSA密钥对dkim-rsa-private.pem私钥和dkim-rsa-public.pem公钥Ed25519密钥对dkim-ed25519-private.pem私钥和dkim-ed25519-public.pem公钥您可以使用这些测试密钥进行开发在生产环境中建议生成自己的密钥对。核心模块介绍gen_smtp客户端发送DKIM签名邮件主要涉及两个核心模块mimemail模块src/mimemail.erl模块提供了MIME邮件的编码和解码功能其中包含了完整的DKIM签名实现。该模块定义了dkim_options()类型用于配置DKIM签名参数-type dkim_options() :: [ {h, [binary()]} % 要签名的邮件头列表 | {d, binary()} % 域名 | {s, binary()} % 选择器 | {t, now | calendar:datetime()} % 时间戳 | {x, calendar:datetime()} % 过期时间 | {c, {simple | relaxed, simple | relaxed}} % 规范化算法 | {a, rsa-sha256 | ed25519-sha256} % 签名算法 | {private_key, dkim_priv_key()} % 私钥 ].gen_smtp_client模块src/gen_smtp_client.erl模块提供了SMTP客户端功能用于连接SMTP服务器并发送邮件。主要函数包括send/2非阻塞发送邮件send_blocking/2阻塞发送邮件等待服务器响应open/1打开SMTP连接deliver/2在已打开的连接上发送邮件close/1关闭SMTP连接完整示例代码以下是使用gen_smtp客户端发送带DKIM签名邮件的完整示例-module(dkim_email_example). -export([send_signed_email/0]). send_signed_email() - % 读取DKIM私钥 {ok, PrivateKeyBin} file:read_file(test/fixtures/dkim-rsa-private.pem), % 配置DKIM选项 DKIMOptions [ {d, example.com}, % 您的域名 {s, default}, % 选择器 {a, rsa-sha256}, % 签名算法 {c, {simple, simple}}, % 规范化算法 {h, [From, To, Subject]}, % 要签名的邮件头 {private_key, {pem_plain, PrivateKeyBin}} % 私钥 ], % 构建邮件内容 From senderexample.com, To [recipientexample.com], Subject Test DKIM Signed Email, Body This is a test email with DKIM signature., % 构建MIME邮件结构 MimeMail { text, plain, [ {From, From}, {To, list_to_binary(string:join([binary_to_list(T) || T - To], ,))}, {Subject, Subject} ], #{content_type_params [{charset, utf-8}]}, Body }, % 编码MIME邮件并应用DKIM签名 EmailBody mimemail:encode(MimeMail, [{dkim, DKIMOptions}]), % 配置SMTP客户端选项 SMTPOptions [ {relay, smtp.example.com}, % SMTP服务器地址 {port, 587}, % SMTP端口 {tls, if_available}, % 使用TLS如果可用 {auth, if_available}, % 使用认证如果可用 {username, your_username}, % SMTP用户名 {password, your_password} % SMTP密码 ], % 发送邮件 case gen_smtp_client:send_blocking({From, To, EmailBody}, SMTPOptions) of {ok, Receipt} - io:format(Email sent successfully. Receipt: ~p~n, [Receipt]); {error, Reason} - io:format(Failed to send email: ~p~n, [Reason]) end.代码解析1. 读取DKIM私钥示例中使用file:read_file/1函数读取RSA私钥文件{ok, PrivateKeyBin} file:read_file(test/fixtures/dkim-rsa-private.pem),gen_smtp支持两种私钥格式{pem_plain, PrivateKeyBin}未加密的PEM格式私钥{pem_encrypted, PrivateKeyBin, Passphrase}加密的PEM格式私钥需要提供密码2. 配置DKIM选项DKIMOptions参数说明{d, example.com}指定您的域名接收方将使用此域名查询DKIM公钥{s, default}选择器用于构建DKIM DNS记录default._domainkey.example.com{a, rsa-sha256}签名算法支持rsa-sha256和ed25519-sha256{c, {simple, simple}}规范化算法包括头部和主体的规范化方式{h, [...]}指定要签名的邮件头建议至少包含From、To、Subject等关键头{private_key, ...}私钥信息3. 构建MIME邮件使用5元组构建MIME邮件结构{Type, SubType, Headers, Parameters, Body}MimeMail { text, plain, [ {From, From}, {To, list_to_binary(string:join([binary_to_list(T) || T - To], ,))}, {Subject, Subject} ], #{content_type_params [{charset, utf-8}]}, Body },4. 编码邮件并应用DKIM签名使用mimemail:encode/2函数编码MIME邮件并传入DKIM选项EmailBody mimemail:encode(MimeMail, [{dkim, DKIMOptions}]),mimemail:encode/2函数会在编码过程中自动应用DKIM签名生成包含DKIM-Signature头的邮件内容。5. 发送邮件使用gen_smtp_client:send_blocking/2函数发送邮件gen_smtp_client:send_blocking({From, To, EmailBody}, SMTPOptions)send_blocking/2函数会阻塞等待发送结果返回邮件服务器的收据或错误信息。验证DKIM签名发送邮件后您可以通过以下方式验证DKIM签名是否成功查看邮件头在接收的邮件中查找DKIM-Signature头确认其存在且格式正确使用DKIM验证工具如dkimverify命令行工具或在线DKIM验证服务检查邮件服务器日志SMTP服务器通常会记录DKIM验证结果常见问题解决1. DKIM签名验证失败可能原因私钥与公钥不匹配邮件发送后被修改如通过邮件列表DKIM选项配置错误域名、选择器等规范化算法不匹配解决方法检查私钥和公钥是否匹配确保d和s参数与DNS记录一致使用{c, {simple, simple}}简化规范化算法2. 无法连接SMTP服务器可能原因SMTP服务器地址或端口错误网络连接问题防火墙阻止连接TLS配置错误解决方法检查SMTP服务器地址和端口验证网络连接调整TLS选项尝试{tls, never}进行测试检查SMTP服务器日志总结gen_smtp提供了完整的DKIM签名支持通过mimemail模块可以轻松为邮件添加DKIM签名。本文介绍了DKIM签名的基本概念、gen_smtp相关模块、完整示例代码以及常见问题解决方法帮助您快速实现安全的邮件发送功能。要深入了解gen_smtp的更多功能可以查看源代码中的以下文件src/mimemail.erlMIME邮件处理和DKIM签名实现src/gen_smtp_client.erlSMTP客户端实现test/prop_mimemail.erlMIME邮件和DKIM签名的属性测试通过合理配置DKIM选项您可以显著提高邮件的送达率减少被标记为垃圾邮件的可能性。【免费下载链接】gen_smtpThe extensible Erlang SMTP client and server library.项目地址: https://gitcode.com/gh_mirrors/ge/gen_smtp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考