Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
nickfarrant opened this issue Feb 22, 2019 · 5 comments
Open

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

nickfarrant opened this issue Feb 22, 2019 · 5 comments

Comments

@nickfarrant
Copy link

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: "[email protected]",
        to: "[email protected]",
        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
Copy link

goamigo commented Mar 25, 2019

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
Copy link
Collaborator

twof commented Mar 25, 2019

@joscdk What were you doing to make leaf work?

@joscdk
Copy link
Member

joscdk commented Mar 25, 2019

@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: "[email protected]",
        to: "[email protected]",
        subject: "Newsletter",
        text: "",
        html: contentString ?? ""
    )
            
    let mailgun = try req.make(Mailgun.self)
    return try mailgun.send(message, on: req)
}

@twof
Copy link
Collaborator

twof commented Mar 25, 2019

Thanks @joscdk ! I've opened a PR that should make life a little easier for folks sending leaf templates. #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
Copy link

adamzarn commented Oct 8, 2020

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: "[email protected]",
        to: "[email protected]",
        subject: "Newsletter",
        text: "",
        html: contentString
    )
    return req.mailgun.send(message)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

5 participants