Fun with Gmail and Go

Many of you at the “free” Go programming course have been asking “How do I use Gmail with Go?” To answer that question, we will quickly build a fun Go web app that uses Gmail to send off emails.

I am assuming that you have downloaded and installed Go and have set the GOPATH properly. If new to Go, then my previous article has this covered.

Sign up for a free Gmail account, if you don’t have one already.

In one of my previous articles, we learned about Golang’s package template (namely text/template and html/template). We shall use html/template here. Also, we shall use Golang’s net/smtp package to connect to Gmail.

Create the folder C:/go_projects/go/src/github.com/SatishTalim/webgmail. In this folder, create a file webgmail.go as follows:

package main

import (
        "fmt"
        "html/template"
        "net/http"
        "net/smtp"
        "os"
)

func main() {
        http.HandleFunc("/", root)
        http.HandleFunc("/mail", mail)
        fmt.Println("listening...")
        err := http.ListenAndServe(GetPort(), nil)
        if err != nil {
                panic(err)
        }
}

func GetPort() string {
        var port = os.Getenv("PORT")
        // Set a default port if there is nothing in the environment
        if port == "" {
                port = "4747"
                fmt.Println("INFO: No PORT environment variable detected, defaulting to " + port)
        }
        return ":" + port
}

func root(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, rootForm)
}

const rootForm = `
  <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Enter your mail</title>
        <link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.4.2/pure-min.css">
      </head>
      <body>
        <h2>Enter your Email</h2>
        <form action="/mail" method="post" accept-charset="utf-8" class="pure-form">
          To:<input type="text" name="to" />
          Subject<:input type="text" name="subject" />
          Message:<input type="text" name="msg" />
          <input type="submit" value="... and check the mail!"  class="pure-button pure-button-primary" />
        </form>
        <div>
          <p><b>© 2014 RubyLearning. All rights reserved.</b></p>
        </div>
      </body>
    </html>
`

const mailTemplateHTML = ` 
  <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>Email Result</title>
        <link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.4.2/pure-min.css">
      </head>
      <body>
        <h2>Email Result</h2>
        <p>Your email has been sent to: </p>
        <pre>{{html .}}</pre>
        <p><a href="/">Start again!</a></p>
        <div>
          <p><b>© 2014 RubyLearning. All rights reserved.</b></p>
        </div>
      </body>
    </html>
`

var mailTemplate = template.Must(template.New("mail").Parse(mailTemplateHTML))

func mail(w http.ResponseWriter, r *http.Request) {
        to := r.FormValue("to")
        subject := r.FormValue("subject")
        message := r.FormValue("msg")

        body := "To: " + to + "\r\nSubject: " +
          subject + "\r\n\r\n" + message

        auth := smtp.PlainAuth("", "satish.talim", "password", "smtp.gmail.com")
        err := smtp.SendMail("smtp.gmail.com:587", auth, "satish.talim@gmail.com", 
          []string{to},[]byte(body))
        if err != nil {
                panic(err)
        } 

        err1 := mailTemplate.Execute(w, to)
        if err1 != nil {
                http.Error(w, err1.Error(), http.StatusInternalServerError)
        }
}

From the folder C:/go_projects/go/src/github.com/SatishTalim/webgmail you can now run the program by typing:

$ go run webgmail.go

Point your browser to http://localhost:4747 and you should see something like this in your browser:

webgmail

Note:

  • You call smtp.PlainAuth with your gmail username, password and domain name, and it returns you back an instance of smtp.Auth that you can use to send e-mails.
  • If you have setup the 2-Step Verification process in Gmail, then you need to set an application-specific password. Use this password in the above program.
  • You can send mail with smtp.SendMail.
  • SMTP on port 587 uses TLS. SSL and TLS both provide a way to encrypt a communication channel between two computers (e.g. your computer and a server). TLS is the successor to SSL and the terms SSL and TLS are used interchangeably unless you’re referring to a specific version of the protocol.

You can learn more about writing and deploying web apps with Go from my new book.

I hope you’ve enjoyed this post, please leave any feedback in the comments section.

One thought on “Fun with Gmail and Go

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.