If you have a non-library SendGrid issue, please contact our [support team](https://support.sendgrid.com).
If you can't find a solution below, please open an [issue](https://github.com/sendgrid/sendgrid-go/issues).
## Table of Contents
* [Migrating from v2 to v3](#migrating)
* [Continue Using v2](#v2)
* [Testing v3 /mail/send Calls Directly](#testing)
* [Error Messages](#error)
* [Versions](#versions)
* [Environment Variables and Your SendGrid API Key](#environment)
* [Viewing the Request Body](#request-body)
## Migrating from v2 to v3
Please review [our guide](https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.html) on how to migrate from v2 to v3.
## Continue Using v2
[Here](https://github.com/sendgrid/sendgrid-go/tree/0bf6332788d0230b7da84a1ae68d7531073200e1) is the last working version with v2 support.
Download:
Click the "Clone or download" green button in [GitHub](https://github.com/sendgrid/sendgrid-go/tree/0bf6332788d0230b7da84a1ae68d7531073200e1) and choose download.
## Testing v3 /mail/send Calls Directly
[Here](https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/curl_examples.html) are some cURL examples for common use cases.
## Error Messages
An error is returned if caused by client policy (such as CheckRedirect), or failure to speak HTTP (such as a network connectivity problem).
To read the error message returned by SendGrid's API:
```go
func main() {
from := mail.NewEmail("Example User", "test@example.com")
subject := "Hello World from the SendGrid Go Library"
to := mail.NewEmail("Example User", "test@example.com")
content := mail.NewContent("text/plain", "some text here")
m := mail.NewV3MailInit(from, subject, to, content)
request := sendgrid.GetRequest(os.Getenv("SENDGRID_API_KE"), "/v3/mail/send", "https://api.sendgrid.com")
request.Method = "POST"
request.Body = mail.GetRequestBody(m)
response, err := sendgrid.API(request)
if err != nil {
log.Println(err)
} else {
fmt.Println(response.StatusCode)
fmt.Println(response.Body)
fmt.Println(response.Headers)
}
}
```
__CAUTION__: A non-2xx status code doesn't cause an error on sendgrid.API and the application has to verify the response:
```golang
resp, err := sendgrid.API(request)
if err != nil {
return err
}
if resp.StatusCode >= 400 {
// something goes wrong and you have to handle (e.g. returning an error to the user or logging the problem)
log.Printf("api response: HTTP %d: %s", resp.StatusCode, resp.Body)
// OR
// return fmt.Errorf("api response: HTTP %d: %s", resp.StatusCode, resp.Body)
}
```
## Versions
We follow the MAJOR.MINOR.PATCH versioning scheme as described by [SemVer.org](http://semver.org). Therefore, we recommend that you always pin (or vendor) the particular version you are working with to your code and never auto-update to the latest version. Especially when there is a MAJOR point release, since that is guaranteed to be a breaking change. Changes are documented in the [CHANGELOG](https://github.com/sendgrid/sendgrid-go/blob/master/CHANGELOG.md) and [releases](https://github.com/sendgrid/sendgrid-go/releases) section.
## Environment Variables and Your SendGrid API Key
All of our examples assume you are using [environment variables](https://github.com/sendgrid/sendgrid-go#setup-environment-variables) to hold your SendGrid API key.
If you choose to add your SendGrid API key directly (not recommended):
`os.Getenv("SENDGRID_API_KEY")`
becomes
`"SENDGRID_API_KEY"`
In the first case SENDGRID_API_KEY is in reference to the name of the environment variable, while the second case references the actual SendGrid API Key.
## Viewing the Request Body
When debugging or testing, it may be useful to examine the raw request body to compare against the [documented format](https://sendgrid.com/docs/API_Reference/api_v3.html).
You can do this right before you call `response, err := client.Send(message)` like so:
```go
fmt.Println(string(mail.GetRequestBody(message)))
```