先说原理
首先,我们需要登录到 Google Voice 平台,可以用浏览器、手机都行,然后打开短信转发到邮箱。这一步是必须的,因为我们是通过定时发邮件来达到自动保号的。
流程大概是这样子的:当有人给你发消息时,消息会转发到你的 Gmail 邮箱,如果你回复这个邮件就等于发送消息了。
好了,原理很简单,我们实操一下。
获取收件人
如果你开通了消息转发到邮箱,你就让一个人发送消息给你,然后你就会收到一个邮件。大概如下图所示,我们我们得到了邮箱地址。
如果我们尝试往这个邮箱发送邮件,那么就等同于在 Google Voice 里面发送信息。
发送邮件之后,打开 Google Voice 就可以看到了。
如何全自动?
首先,我们需要获取 Google 的 应用专用密码。
这一步自行获取,如果成功获取你可以得到一个:xxxx xxxx xxxx xxxx
16位的密码。
打开 https://console.rapjob.com/ 去添加一个任务,然后点击“从 cURL 导入”
curl 'https://smtphelper.deeplx.net/send' \
-H 'content-type: application/json' \
--data-raw '{"from": "这里填写你的Gmail邮箱","to": "这里填写收件人邮箱","password": "这里填写16位密码"}'
然后点击“高级”有通知策略可以自行设置。
执行间隔就是多久发一次短信,可以1个月发一次,那就是31天。
设置好之后,点击“测试”看看短信能不能发送过去,能发送成功保存就好了。
安全隐患(很重要)
大家肯定会觉得把应用专用密码泄漏了会造成安全隐患,当然大家可以自己去部署一个服务然后通过 RapJob 调度也是可以的。
如果你信得过我们提供的服务,则可以使用我们提供的 https://smtphelper.deeplx.net/send
。(为了您的账号安全,我们强烈建议自行部署SMTP服务。)
下面是 Golang 代码,你可以把 From、To、Password 写死在代码里面这样就可以避免了账号密码在网络上传输。
go get -u github.com/gin-gonic/gin
go get github.com/gin-contrib/cors
package main
import (
"encoding/base64"
"flag"
"fmt"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"log"
"mime"
"net/http"
"net/smtp"
)
type EmailRequestBody struct {
// 发送者
From string `json:"from"`
// 接收者
To string `json:"to"`
// 发送邮件服务器
Smtp string `json:"smtp"`
// 发送邮件服务器端口
Port int `json:"port"`
// 密码
Password string `json:"password"`
// 标题
Subject string `json:"subject"`
// 内容
Text string `json:"text"`
}
var port = 19056
var Form = ""
var To = ""
var Smtp = "smtp.gmail.com"
var Port = 587
var Password = ""
var Subject = "Send a new message"
var Text = "这是一条基于 RapJob.com 的自动保号消息,您可以忽略。(This is an auto-bailout message based on RapJob.com that you can ignore.) "
func init() {
flag.IntVar(&port, "p", port, "set up the port")
flag.IntVar(&port, "port", port, "set up port")
log.SetFlags(log.LstdFlags | log.Lshortfile)
}
func main() {
gin.SetMode(gin.ReleaseMode)
flag.Parse()
r := gin.Default()
config := cors.DefaultConfig()
config.AllowOriginWithContextFunc = func(c *gin.Context, origin string) bool {
return true
}
config.AllowCredentials = true
r.Use(cors.New(config))
r.POST("/send", func(c *gin.Context) {
body := EmailRequestBody{}
if err := c.BindJSON(&body); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"message": err.Error(),
})
return
}
if body.From == "" {
body.From = Form
}
if body.To == "" {
body.To = To
}
if body.Smtp == "" {
body.Smtp = Smtp
}
if body.Password == "" {
body.Password = Password
}
if body.Subject == "" {
body.Subject = Subject
}
if body.Text == "" {
body.Text = Text
}
if body.Port <= 0 {
body.Port = Port
}
if body.From == "" || body.To == "" || body.Smtp == "" || body.Password == "" || body.Subject == "" || body.Text == "" || body.Port <= 0 {
c.JSON(http.StatusBadRequest, gin.H{
"message": "Parameter Error",
})
return
}
header := make(map[string]string)
header["From"] = body.From
header["To"] = body.To
header["Subject"] = mime.QEncoding.Encode("UTF-8", body.Subject)
header["MIME-Version"] = "1.0"
header["Content-Type"] = "text/plain; charset=\"utf-8\""
header["Content-Transfer-Encoding"] = "base64"
message := ""
for k, v := range header {
message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + base64.StdEncoding.EncodeToString([]byte(body.Text))
err := smtp.SendMail(fmt.Sprintf("%s:%d", body.Smtp, body.Port),
smtp.PlainAuth("", body.From, body.Password, body.Smtp),
body.From, []string{body.To}, []byte(message))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
})
return
}
log.Println(fmt.Sprintf("Successfully send email %s from %s to %s", body.Subject, body.From, body.To))
})
_ = r.Run(fmt.Sprintf(":%v", port))
}