vapor-community / mailgun

📧 Service to assist with sending emails from Vapor apps
118 stars 31 forks source link

Expecting type `String` for html parameter, getting `Future<View>` #26

Open nickfarrant opened 5 years ago

nickfarrant commented 5 years ago

Hi,

Great library, works really well.

The only issue I am having is using a Leaf template. The example code in the readme is generating an error in Xcode for me.

router.post("mail") { (req) -> Future<Response> in
    let content = try req.view().render("Emails/my-email", [
        "name": "Bob"
    ])

    let message = Mailgun.Message(
        from: "postmaster@example.com",
        to: "example@gmail.com",
        subject: "Newsletter",
        text: "",
        html: content
    )

    let mailgun = try req.make(Mailgun.self)
    return try mailgun.send(message, on: req)
}

content is of type Future<View>, but Mailgun.Message expect a String for the html parameter.

Is there a way around this or am I missing something obvious?

I have tried html: "\(content)", but my Leaf template then generates: NIO.EventLoopFuture in the email.

Thanks in advance, Nick

goamigo commented 5 years ago

Hello,

Same issue for me. I couldn't find any method to convert the view into a String value. Any news on that?

Thanks, Sylvain

twof commented 5 years ago

@joscdk What were you doing to make leaf work?

joscdk commented 5 years ago

@nickfarrant @goamigo try the following

let content = try req.view().render("Emails/my-email", [
    "name": "Bob"
])

return content.flatMap(to: Response.self) { content in
    let contentString = String(data: content.data, encoding: .utf8)
    let message = Mailgun.Message(
        from: "postmaster@example.com",
        to: "example@gmail.com",
        subject: "Newsletter",
        text: "",
        html: contentString ?? ""
    )

    let mailgun = try req.make(Mailgun.self)
    return try mailgun.send(message, on: req)
}
twof commented 5 years ago

Thanks @joscdk ! I've opened a PR that should make life a little easier for folks sending leaf templates. https://github.com/twof/VaporMailgunService/pull/28

Feel free to try that branch out, and if you run into any problems let me know! Code reviews are also always appreciated.

adamzarn commented 4 years ago

Here's how to do it with Vapor 4 and Mailgun 5.0.0:

let content = req.view.render("Emails/my-email", [
    "name": "Bob"
])

return content.flatMapThrowing { content in
    let contentString = String(buffer: content.data)
    let message = MailgunMessage(
        from: "postmaster@example.com",
        to: "example@gmail.com",
        subject: "Newsletter",
        text: "",
        html: contentString
    )
    return req.mailgun.send(message)
}