使用Spring-Boot + Heroku进行邮件发送
简述
使用Spring Boot和Heroku发送电子邮件。
做法 (Correct Method)
将使用Heroku的SendGrid附加功能来发送电子邮件。
事先准备
-
- heroku CLIのインストール済
-
- Spring BootのアプリケーションをHerokuにデプロイする
- Herokuのアカウントにクレジットカードを登録する(ここから登録)(addonが利用できるようになります)
过程
※她在Heroku上的应用程序名称是gosshys-testproject。
增加SendGrid的附加组件
请使用以下命令注册SendGrid的附加功能。请在已部署的Spring Boot应用程序的git存储库中执行该命令。
heroku addons:create sendgrid:starter
执行结果
$ heroku addons:create sendgrid:starter
Creating sendgrid:starter on ⬢ gosshys-testproject... free
Created sendgrid-convex-82110 as SENDGRID_PASSWORD, SENDGRID_USERNAME
Use heroku addons:docs sendgrid to view documentation
成功后,使用以下命令检查是否设置了SendGrid环境变量。将自动设置SendGrid用户(电子邮件地址)和密码。
$ heroku config:get SENDGRID_USERNAME
app99999999@heroku.com
$ heroku config:get SENDGRID_PASSWORD
xxxpasswdxxx
如果没有注册账户的信用卡信息,将无法进行追加操作。
请验证您的帐户以安装此附加计划,有一个错误。
$ heroku addons:create sendgrid:starter
Creating sendgrid:starter on ⬢ gosshys-testproject... !
▸ Please verify your account to install this add-on plan (please enter a credit card) For more information, see https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify
获取SendGrid的API密钥
根据SendGrid文档中的“获取API密钥”部分,获取SendGrid的API密钥。
点击这里,将转到获取SendGrid API密钥的页面。
在最初访问时,会弹出登录页面,请在此处输入之前通过heroku config:get获取的SendGrid的用户名和密码。
登录后会出现这样的界面。
当你点击画面右上角的”创建API密钥”按钮,会出现API密钥生成的界面。
-
- 「API Key Name」にAPIキーの説明を入れます。ここは単純にHerokuのアプリケーション名を入れました。
- 「API Key Permissions」は、「Full Access」と「Restricted Access」のどちらかを選択します。「Billing Access」は、主にエンタープライズ向けのようなので選択しません。また「Restricted Access」は細かくメールの機能を制限できますが、今はどの機能を制限すべきか定かでないので「Full Access」を選択します。
点击「创建并查看」按钮以生成 API 密钥。
生成API密钥
点击「创建和查看」按钮后,以下画面将显示出来。出于安全考虑,该画面只会显示一次,因此请将出现在红字下方的英数字列表复制并记下来。
复制并记录下API密钥后,点击“完成”按钮。然后将会跳转到API密钥列表页面,在那里可以参考“API Key ID”和被掩码处理的“API KEY”。
在Heroku环境变量中设置SendGrid的API密钥ID和API密钥。
按照Heroku环境变量中的”Setup API key environment variable”文件中的步骤,设置SendGrid的API密钥ID和API密钥。
$ heroku config:set SENDGRID_API_KEY=(SendGridのページでメモしたAPIキー、APIキーIDではないので注意)
Setting SENDGRID_API_KEY and restarting ⬢ gosshys-testproject... done, v7
SENDGRID_API_KEY: (SendGridのページでメモしたAPIキーが表示されます)
使用Spring Boot应用程序发送电子邮件。
参照了Java的文件后,我们将向Spring Boot添加电子邮件发送程序。
将 SendGrid 库添加到 pom 文件中。
在maven的pom.xml文件的dependencies中添加以下内容。根据目前的情况,4.1.2似乎是最新的版本,因此我已经添加了它。至于Gradle方面,请参考文档中的示例。
<dependency>
<groupId>com.sendgrid</groupId>
<artifactId>sendgrid-java</artifactId>
<version>4.1.2</version>
</dependency>
在Spring Boot的控制器中添加邮件发送功能
在Spring Boot的RestController中,将文档中的示例直接粘贴。虽然示例使用Kotlin编写,但Java也可以。
package com.koiwaimilk.tsukigaoka.core.controller
import com.sendgrid.*
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import java.io.IOException
@RestController
@RequestMapping(value = "/mail")
class MailSendController {
@RequestMapping(value = "/send")
fun send(@RequestParam(value = "contents", defaultValue = "Hello, Email!") contents: String): String {
val from = Email("test@example.com")
val subject = "Hello World from the SendGrid Java Library!"
val to = Email("(ここに送信先のメールアドレスを設定します)")
val content = Content("text/plain", "Hello, Email!")
val mail = Mail(from, subject, to, content)
val sg = SendGrid(System.getenv("SENDGRID_API_KEY"))
val request = Request()
try {
request.method = Method.POST
request.endpoint = "mail/send"
request.body = mail.build()
val response = sg.api(request)
System.out.println(response.statusCode)
System.out.println(response.body)
System.out.println(response.headers)
} catch (ex: IOException) {
throw ex
}
return "OK"
}
}
设置本地环境的环境变量。
如果在本地运行,需要设置SENDGRID_API_KEY,因此在IDE的应用程序启动时,将SENDGRID_API_KEY设置为环境变量。下面是IntelliJ的一个示例。
Spring Boot的启动和邮件发送
我要启动Spring Boot。
使用`curl`来调用邮件发送控制器。
$ curl localhost:8080/mail/send
数分钟之后
当我检查邮箱时,发现有封邮件到达。