_ _ _ _ _ _ | | | | | | | | (_) | | | __ _ _ __ ___ | |__ __| | __ _ ______ ___ ___ _ __ __| |_ __ ___ __ _ _| | | |/ _` | '_ ` _ \| '_ \ / _` |/ _` |______/ __|/ _ \ '_ \ / _` | '_ ` _ \ / _` | | | | | (_| | | | | | | |_) | (_| | (_| | \__ \ __/ | | | (_| | | | | | | (_| | | | |_|\__,_|_| |_| |_|_.__/ \__,_|\__,_| |___/\___|_| |_|\__,_|_| |_| |_|\__,_|_|_|
Send contact form emails using AWS Lambda
Contact forms. They are all around us. Almost every website has one.
Lambda sendmail a solution where you would use Amazon Web Services (AWS) to make your life simple and handle your contact form in a very efficient and cheap way.
- Build Project
- Get Google reCaptcha Site Key And Secret Key
- Create Lambda function
- Create API gateway endpoint
- Integrate Google reCAPTCHA in your website
- Environment variables
Preparing a binary to deploy to AWS Lambda requires that it is compiled for Linux and placed into a .zip file.
docker run -it --rm -v $(pwd):/work -w /work lambci/lambda:build-go1.x sam build
cd .aws-sam/build/SendmailFunction
zip main.zip main
# Remember to build your handler executable for Linux!
GOOS=linux GOARCH=amd64 go build -o main main.go
zip main.zip main
(docker)Golang Alpine images doesn't build statically linked binary: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, stripped
The interpreter doesn't exist in Lambda environment so that's will throws "no such file or directory error".
To solve that use
GOOS=linux go build -v -ldflags '-d -s -w' -a -tags netgo -installsuffix netgo -o bin/service service/main.go
Windows developers may have trouble producing a zip file that marks the binary as executable on Linux. To create a .zip that will work on AWS Lambda, the build-lambda-zip
tool may be helpful.
Get the tool
go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip
Use the tool from your GOPATH
. If you have a default installation of Go, the tool will be in %USERPROFILE%\Go\bin
.
in cmd.exe:
set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0
go build -o main main.go
%USERPROFILE%\Go\bin\build-lambda-zip.exe -o main.zip main
in Powershell:
$env:GOOS = "linux"
$env:GOARCH = "amd64"
$env:CGO_ENABLED = "0"
go build -o main main.go
~\Go\Bin\build-lambda-zip.exe -o main.zip main
To integrate it into your website you need to put it in the client side as well as in Server side. In client HTML page you need to integrate this line before the tag.
<script src="https://www.google.com/recaptcha/api.js?render=put your site key here"></script>
Google reCAPTCHA v3 is invisible. You won’t see a captcha form of any sort on your web page. You need to capture the google captcha response in your JavaScript code. Here is a small snippet.
<script>
grecaptcha.ready(function() {
grecaptcha.execute('put your site key here', {action: 'homepage'}).then(function(token) {
// pass the token to the backend script for verification
});
});
</script>
Let’s look at the sample code to understand it better.
change the API_Gateway url
to yours
"https://API_Gateway_id.execute-api.ap-northeast-1.amazonaws.com/v1/sendmail";
Key | Value |
---|---|
ReCAPTCHA_SECRET | reCaptcha Secret Key |
SES_REGION | AWS Region (E.g.,'us-west-1') |
MAIL_SUBJECT | email subject |
IS_HTML | true or false |
MAIL_FROM | from(E.g., recipient [email protected] or [email protected]) |
TO_ADDRESSES | recipients (E.g., recipient [email protected],recipient [email protected]) |
CC_ADDRESSES | recipients (E.g., recipient [email protected],recipient [email protected]) |
BCC_ADDRESSES | recipients (E.g., recipient [email protected],recipient [email protected]) |
SMTP_USER | smtp user name |
SMTP_PASSWORD | smtp password |
SMTP_HOST | smtp host(E.g., example.com) |
SMTP_PORT | smtp port(E.g., 587) |
sam init --runtime
sam local invoke SendmailFunction --event test-event.json --env-vars .env
# or
sam local start-api
curl -i -X POST \
-H "content-type:application/json" \
-d \
'{
"name":"にほんご",
"email":"[email protected]",
"message":"にほんご",
"token":"tokenxxxxx"
}' \
'http://127.0.0.1:3000/sendmail'