【问题标题】:Erlang SMTP client WITH attachments带有附件的 Erlang SMTP 客户端
【发布时间】:2021-08-30 13:01:38
【问题描述】:

我正在寻找以下两件事之一:

  1. 一个支持发送带有附件的电子邮件的 Erlang 库
  2. 使用 gen_smtp 发送带有附件的电子邮件的示例,因为我已经使用此库成功发送了电子邮件

虽然有很多模块可以通过 SMTP 发送纯文本电子邮件,但似乎很少有 SMTP 客户端支持带有附件。有人有什么建议吗?

另外,使用 Windows - 我不确定 sendmail 路由是否可用?



Agus,当我尝试该确切代码以及类似代码时,我不断收到以下错误,有什么想法吗?:

** exception error: {badmap,[]}
     in function  maps:get/3
        called as maps:get(content_type_params,[],[])
     in call from mimemail:ensure_content_headers/7 (c:/temp/erlang/myapp/_build/default/lib/gen_smtp/src/mimemail.erl, line 667)
     in call from mimemail:encode/2 (c:/temp/erlang/myapp/_build/default/lib/gen_smtp/src/mimemail.erl, line 161)
     in call from email_test:send_email_with_attachment/0 (c:/temp/erlang/myapp/src/email_test.erl, line 14)

我在 rebar.config 中使用的 gen_smtp 版本:

{gen_smtp, ".*", {git, "git://github.com/gen-smtp/gen_smtp.git", {branch, master}}}

【问题讨论】:

  • 请查看更新后的答案

标签: smtp erlang


【解决方案1】:

简短回答:您可以使用 gen_smtp 发送带有附件的电子邮件。

如果您使用过gen_smtp_client:send(Email, Options)gen_smtp_client:send_blocking(Email, Options),那么您实际上可以使用mimemail:encode/2 生成Body's Email 变量。

%% @doc Encode a MIME tuple to a binary.
encode({Type, Subtype, Headers, ContentTypeParams, Parts}, Options) ->
...

下面的代码显示了如何发送带有电子邮件内联正文和 2 个附件(分别为test1.txterlang.png)的消息。这里的关键是使用multipart/mixed MIME 类型并相应地构造电子邮件正文。

send_email_with_attachment() ->
    From = "noreply@mydomain.com", 
    ToList = ["target_email@mydomain.com"],
    
    Part2Filename = "/tmp/test1.txt",
    {ok, Part2Binary} = file:read_file(Part2Filename),
    
    Part3Filename = "/tmp/erlang.png",
    {ok, Part3Binary} = file:read_file(Part3Filename),
        
    Email = mimemail:encode(
                            {
                             <<"multipart">>, %%Type, 
                             <<"mixed">>, %%Subtype,
                             %%Headers,  
                             [
                              {<<"From">>, <<"No-Reply <noreply@mydomain.com>">>},
                              {<<"To">>, <<"target_email@mydomain.com">>},
                              {<<"Subject">>, <<"Mail Subject">>}
                             ], 
                             #{}, %%[], %%ContentTypeParams, 
                             %%(Multi)Parts
                             [
                                %%Part 1: this is the inline mail body, note the {<<"disposition">>, <<"inline">>} tag
                                {
                                     <<"text">>, %%Type, 
                                     <<"plain">>, %%Subtype,
                                     %%Headers
                                     [],
                                     %%ContentTypeParams
                                     #{
                                       disposition => <<"inline">>
                                       },
                                     %%Part
                                     <<"Email body (inline) is here blah blah..">>
                                },
                                
                                %%Part 2: this is the text file as attachment, note the {<<"disposition">>, <<"attachment">>} tag
                                {
                                     <<"text">>, %%Type, 
                                     <<"plain">>, %%Subtype,
                                     %%Headers
                                     [],
                                     %%ContentTypeParams
                                     #{
                                       disposition => <<"attachment">>,
                                       disposition_params => [{<<"filename">>, <<"test1.txt">>}]
                                      },
                                     %%Part
                                     Part2Binary
                                },
                                
                                %%Part 3: this is the PNG file as attachment, note the {<<"disposition">>, <<"attachment">>} tag
                                {
                                     <<"image">>, %%Type, 
                                     <<"png">>, %%Subtype,
                                     %%Headers
                                     [],
                                     %%ContentTypeParams 
                                     #{
                                       disposition => <<"attachment">>,
                                       disposition_params => [{<<"filename">>, <<"erlang.png">>}] 
                                      },
                                     %%Part
                                     Part3Binary
                                }
                              ]
                            },
                            [] %%Options
                           ),
    Opts =  [{relay, "smtp.mydomain.com"},
              {tls, never}
             ], 
    gen_smtp_client:send({From, ToList, Email}, Opts).

这是您将在邮箱中看到的内容

【讨论】:

  • Agus,这很好地代表了我需要放入体内的东西。但是,当我完全尝试此代码和另一个类似示例时,我总是会收到此错误(请参阅我的编辑以获取完整错误)-您有什么想法吗? ** exception error: {badmap,[]} in function maps:get/3
  • 显然我们使用了不同的代码库版本;函数参数有一些变化——最新的一个是使用 maps 而不是 list 用于 ContentTypeParams。我已经更新了答案以反映这一变化。
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2014-11-13
  • 2011-03-06
相关资源
最近更新 更多