Skip to content

Google Voice 保号

首先,我们需要登录到 Google Voice 平台,可以用浏览器、手机都行,然后打开短信转发到邮箱。这一步是必须的,因为我们是通过定时发邮件来达到自动保号的。

流程大概是这样子的:当有人给你发消息时,消息会转发到你的 Gmail 邮箱,如果你回复这个邮件就等于发送消息了。

获取收件人

如果你开通了消息转发到邮箱,你就让一个人发送消息给你,然后你就会收到一个邮件。大概如下图所示,我们我们得到了邮箱地址。

邮件

如果我们尝试往这个邮箱发送邮件,那么就等同于在 Google Voice 里面发送信息。

发送邮件

发送邮件之后,打开 Google Voice 就可以看到了。

GV

如何全自动?

首先,我们需要获取 Google 的 应用专用密码

这一步自行获取,如果成功获取你可以得到一个:xxxx xxxx xxxx xxxx 16位的密码。

打开 https://console.rapjob.com 去添加一个任务,然后点击“从 cURL 导入”

shell
curl 'https://smtphelper.deeplx.net/send' \
-H 'content-type: application/json' \
--data-raw '{"from": "这里填写你的Gmail邮箱","to": "这里填写收件人邮箱","password": "这里填写16位密码"}'

然后点击“高级”有通知策略可以自行设置。

执行间隔就是多久发一次短信,可以1个月发一次,那就是31天。

设置好之后,点击“测试”看看短信能不能发送过去,能发送成功保存就好了。

效果

点击 “测试” 成功之后,可以看到这个。

Test

安全隐患(很重要)

大家肯定会觉得把 应用专用密码 泄漏了会造成安全隐患,当然大家可以自己去部署一个 SMTP 服务然后通过 RapJob 调度也是可以的。

如果你信得过我们提供的服务,则可以使用我们提供的 https://smtphelper.deeplx.net/send。(为了您的账号安全,我们强烈建议自行部署SMTP服务。


下面是 Golang 代码,你可以把 From、To、Password 写死在代码里面这样就可以避免了账号密码在网络上传输。

shell
go get -u github.com/gin-gonic/gin
go get github.com/gin-contrib/cors
go
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))
}