0

我一直在翻阅文档并在互联网上搜索以查找有关如何将附件添加到创建的模板的文档。我正在使用 darrencauthon 的 CSharp-Sparkpost 来处理 API 调用。到目前为止,我没有工作。有没有人有一个可行的解决方案(可能?)或更好的 C# 解决方案?我不反对使用不同的库。这是 CSharp-Sparkpost 的链接

这是我到目前为止所得到的:

var t = new Transmission();

t.Content.From.Email = "from@thisperson.com";
t.Content.TemplateId = "my-template-email";

new Recipient
{
    Address = new Address { Email = recipient }
}
.Apply(t.Recipients.Add);


new Attachment
{
    Data = //CSVDATA,
    Name = "Table.csv",
    Type = "text/csv"
}.Apply(t.Content.Attachments.Add);


var client = new SparkPost.Client(Util.GetPassword("sparkpostapikey"));
client.Transmissions.Send(t).Wait();

我已验证我可以在没有模板的情况下发送此附件,并且还验证我可以在没有附件的情况下发送此模板。所以...电子邮件正在发送;但是,接收到的内容只是模板和替换数据。模板电子邮件没有附件。

4

3 回答 3

2

使用 Darren 的库,并结合我的项目的需求,这是我想出的解决方案。我只是进行了一个额外的 API 调用来获取模板 Html,这样我就可以构建传输而无需发送template_id. 仍在使用CSharp-Sparkpost库进行所有调用。我修改了 Darren 的示例 SendInline 程序,如下所示:

    static async Task ExecuteEmailer()
    {
        var settings = ConfigurationManager.AppSettings;
        var fromAddr = settings["fromaddr"];
        var toAddr = settings["toaddr"];

        var trans = new Transmission();

        var to = new Recipient
        {
            Address = new Address
            {
                Email = toAddr
            },
            SubstitutionData = new Dictionary<string, object>
            {
                {"firstName", "Stranger"}
            }
        };

        trans.Recipients.Add(to);

        trans.SubstitutionData["firstName"] = "Sir or Madam";

        trans.Content.From.Email = fromAddr;
        trans.Content.Subject = "SparkPost sending attachment using template";
        trans.Content.Text = "Greetings {{firstName or 'recipient'}}\nHello from C# land.";

        //Add attachments to transmission object
        trans.Content.Attachments.Add(new Attachment()
        {
            Data = Convert.ToBase64String(System.IO.File.ReadAllBytes(@"C:\PathToFile\ExcelFile.xlsx")),
            Name = "ExcelFile.xlsx",
            Type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        });

        Console.Write("Sending mail...");

        var client = new Client(settings["apikey"]);
        client.CustomSettings.SendingMode = SendingModes.Sync;

        //retrieve template html and set Content.Html
        var templateResponse = await client.Templates.Retrieve("template-email-test");
        trans.Content.Html = templateResponse.TemplateContent.Html;

        //Send transmission 
        var response = client.Transmissions.Send(trans);

        Console.WriteLine("done");
    }

带有附件的模板

于 2017-06-26T21:07:50.790 回答
1

我是该库的主要作者 Darren Cauthon。

我在每次发布之前运行的验收测试中都有附件支持。链接在下面,但代码应该很简单:

// C#

var attachment = File.Create<Attachment>("testtextfile.txt");
transmission.Content.Attachments.Add(attachment);

https://github.com/darrencauthon/csharp-sparkpost/blob/3a8cb1efbb8c9a0448c71c126ce7f88759867fb0/src/SparkPost.Acceptance/TransmissionSteps.cs#L56

于 2017-06-26T15:50:37.817 回答
1

哦,实际上,我现在明白了——您说的是向模板添加附件,而不是附件。

我对此的回答是,当我开发这个库时,SparkPost 本身不支持模板上的附件。

我的库允许您尝试它,但那是因为每个模板和非模板电子邮件都被视为“传输”。因此,如果您创建传输,它可以选择添加附件......但是如果您使用模板 id 发送传输,则附件将被忽略。

我可以抛出错误,或者以某种方式围绕这个限制设计 API,但是如果他们停止忽略附件但我的库抛出错误怎么办?随着 SparkPost Web API 的增长,我设计了该库以实现灵活性,并且我不希望我的库妨碍我。

如果您想测试您是否正确发送附件,请发送不带传输 ID 的传输,而是使用主题和电子邮件正文。如果电子邮件通过并且您收到一个附件,那么您就知道这是因为 SparkPost 的模板/附件限制。

注意:我将这个答案放在 Stack Overflow 上,这个过时的消息将来可能不再有效。

于 2017-06-26T15:57:42.323 回答