使用 Gmail API 发送电子邮件
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
Gmail 是目前最受欢迎的电子邮件服务之一,您很可能希望将其用作网页或移动应用的邮箱。它安全可靠,这对于防止邮件被误判为垃圾邮件至关重要。因此,我们决定详细介绍如何使用 Gmail API 发送电子邮件。
Gmail API – 为什么你应该考虑使用它
该 API 为您提供对 Gmail 通常功能的 RESTful 访问权限:
- 发送和接收HTML 电子邮件
- 发送和接收带附件的电子邮件
- 对消息、草稿、线程和标签执行 CRUD(创建、读取、更新和删除)操作
- 控制您的 Gmail 收件箱
- 网页用户界面具备完整的搜索功能。
- 执行特定查询
- 还有更多……
开发者喜欢 Gmail API,因为它易于实现。我们稍后会详细讨论这一点。此外,您还可以将此选项用于各种场景,例如:
- 自动发送电子邮件
- 邮件备份
- 从其他电子邮件服务迁移邮件
资源类型和方法
使用 Gmail API,您可以处理多种资源类型,并使用以下方法对其进行管理:
如何让你的应用使用 Gmail API 发送电子邮件
步骤 1:在 Google API 控制台中创建项目
如果您想通过手机或网页应用访问 Gmail,首先需要访问Google 开发者控制台。首次访问此页面的用户需要同意服务条款并选择居住国家/地区。然后点击“选择项目”并创建一个新项目。
步骤 2:启用 Gmail API
完成上述步骤后,您可以点击左侧的“库”选项卡,进入 API 库页面。在搜索栏中输入“Gmail API”,找到后点击即可。现在,您需要为您的项目启用该 API。
步骤 3:使用 OAuth 2.0 进行凭据和身份验证
API 启用后,您将看到一个简洁的控制面板,上面显示“要使用此 API,您可能需要凭据”。如果您点击“创建凭据” ,则需要回答一系列问题以确定所需的凭据类型。我们建议您使用另一种方法,因为我们已经知道您需要的凭据类型:OAuth 客户端 ID。因此,请点击左侧的“凭据”选项卡,然后从“创建凭据”按钮的下拉列表中选择“OAuth 客户端 ID” 。

您会看到“配置授权屏幕”按钮。点击后会进入一个包含多个字段的页面。您只需输入应用名称并指定授权域名即可。如有需要,也可以填写其他字段。

点击保存,然后选择您的应用类型(Web 应用、Android 应用、Chrome 应用、iOS 或其他)。之后,为您的 OAuth 客户端 ID 命名。此外,还需要分别输入 JavaScript 来源和重定向域,以便处理来自浏览器或 Web 服务器的请求。点击创建完成。完成!下载包含您凭据的 JSON 文件——稍后您会用到它。
第四步:选择快速入门指南
下一步是根据你的应用所使用的技术选择快速入门指南。目前,有以下几种选择:
对于移动应用,G Suite也提供了适用于iOS和Android 的API。
本快速入门指南首先需要您阅读“先决条件”部分。假设您选择 PHP,请确保您的 PHP 版本与指南中给出的版本相符。此外,如果您尚未安装 JSON 扩展和 Composer 依赖管理工具,请先进行安装。之后,您可以安装 Google 客户端库。对于 Java,您需要创建一个新的项目结构和目录src/main/resources/。然后,将包含凭据的 JSON 文件复制到该目录,并将文件内容替换build.gradle为以下代码。因此,在准备项目时请务必仔细阅读。
步骤 5:API 客户端库
Google 提供了用于操作 API 的客户端库:
Go 语言 API 客户端
Installation:
go get -u google.golang.org/api/gmail/v1
go get -u golang.org/x/oauth2/google
Installation via Gradle
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.api-client:google-api-client:1.30.2'
}
Installation:
gem install google-api-client
Installation via NuGet Package Manager Console:
Install-Package Google.Apis.Gmail.v1
Installation via npm:
npm install googleapis@39 --save
Installation via Composer:
composer require google/apiclient:"^2.0"
Installation:
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
or
easy_install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
步骤 6:访问 Gmail
在此步骤中,我们需要授权应用访问您的 Gmail 帐户,之后您即可管理电子邮件。为此,您需要在工作目录中创建一个文件。下方列出了每项技术的具体文件名。请从所选的快速入门指南中复制粘贴相应的代码示例并运行。以下是代码示例的链接:
去
- 文件名:quickstart.go
- 目录:gmail/quickstart/
- Go 语言代码示例
- 运行方式:
go run quickstart.go
Java
- Flinename: GmailQuickstart.java
- 目录:src/main/java/
- Java 代码示例
- 运行方式:
gradle run
红宝石
- 文件名:quickstart.rb
- 目录:gmail/quickstart/
- Ruby 代码示例
- 运行方式:
ruby quickstart.rb
。网
- 文件名:GmailQuickstart.cs
- 目录:gmail/Gmail快速入门/
- .NET 代码示例
- 单击 Visual Studio 工具栏中的“开始”按钮即可运行。
Node.js
- 文件名:index.js
- 目录:gmail/quickstart/
- Node.js 代码示例
- 运行方式:
node .
PHP
- 文件名:quickstart.php
- 目录:gmail/quickstart/
- PHP 代码示例
- 运行方式:
php quickstart.php
Python
- 文件名:quickstart.py
- 目录:gmail/quickstart/
- Python 代码示例
- 运行方式:
python quickstart.py
JavaScript(浏览器)
- 文件名:index.html
- 目录:gmail/quickstart/
- 浏览器代码示例(JavaScript)
- 将 `<client ID>` 和 `<API 密钥>` 替换为您的客户端 ID 和 API 密钥。运行命令:
python -m SimpleHTTPServer 8000– 适用于 Python 2+python -m http.server 8000– 适用于 Python 3+
成功了……也可能失败了。谷歌会警告你,你运行的示例可能无法在默认浏览器中打开新窗口。如果出现这种情况,你需要手动打开。从控制台复制 URL 并粘贴到浏览器中。它看起来会像这样:
接下来,系统会提示您登录 Google 帐户或选择一个帐户进行授权。点击“允许”后,您将在 SSH shell 中看到所有收件箱标签,如下所示:
恭喜!Gmail API 运行正常,您可以发送第一封电子邮件了。
步骤 7:创建电子邮件
要发送消息,首先需要创建一个消息。为此,您的应用可以使用 drafts.create 方法,该方法包含以下内容:
- 创建 MIME 消息
- 将消息转换为 base64url 编码字符串
- 创建草稿
让我们看看如何在 Python 中实际实现这一点:
def create_message(sender, to, subject, message_text):
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
raw_message = base64.urlsafe_b64encode(message.as_string().encode("utf-8"))
return {
'raw': raw_message.decode("utf-8")
}
def create_draft(service, user_id, message_body):
try:
message = {'message': message_body}
draft = service.users().drafts().create(userId=user_id, body=message).execute()
print("Draft id: %s\nDraft message: %s" % (draft['id'], draft['message']))
return draft
except Exception as e:
print('An error occurred: %s' % e)
return None
和 PHP
/**
* @param $sender string sender email address
* @param $to string recipient email address
* @param $subject string email subject
* @param $messageText string email text
* @return Google_Service_Gmail_Message
*/
function createMessage($sender, $to, $subject, $messageText) {
$message = new Google_Service_Gmail_Message();
$rawMessageString = "From: <{$sender}>\r\n";
$rawMessageString .= "To: <{$to}>\r\n";
$rawMessageString .= 'Subject: =?utf-8?B?' . base64_encode($subject) . "?=\r\n";
$rawMessageString .= "MIME-Version: 1.0\r\n";
$rawMessageString .= "Content-Type: text/html; charset=utf-8\r\n";
$rawMessageString .= 'Content-Transfer-Encoding: quoted-printable' . "\r\n\r\n";
$rawMessageString .= "{$messageText}\r\n";
$rawMessage = strtr(base64_encode($rawMessageString), array('+' => '-', '/' => '_'));
$message->setRaw($rawMessage);
return $message;
}
/**
* @param $service Google_Service_Gmail an authorized Gmail API service instance.
* @param $user string User's email address or "me"
* @param $message Google_Service_Gmail_Message
* @return Google_Service_Gmail_Draft
*/
function createDraft($service, $user, $message) {
$draft = new Google_Service_Gmail_Draft();
$draft->setMessage($message);
try {
$draft = $service->users_drafts->create($user, $draft);
print 'Draft ID: ' . $draft->getId();
} catch (Exception $e) {
print 'An error occurred: ' . $e->getMessage();
}
return $draft;
}
步骤 8:发送电子邮件
创建好消息后,你可以调用messages.send或drafts.send来发送它。以下是消息示例:
Python
def send_message(service, user_id, message):
try:
message = service.users().messages().send(userId=user_id, body=message).execute()
print('Message Id: %s' % message['id'])
return message
except Exception as e:
print('An error occurred: %s' % e)
return None
和 PHP
/**
* @param $service Google_Service_Gmail an authorized Gmail API service instance.
* @param $userId string User's email address or "me"
* @param $message Google_Service_Gmail_Message
* @return null|Google_Service_Gmail_Message
*/
function sendMessage($service, $userId, $message) {
try {
$message = $service->users_messages->send($userId, $message);
print 'Message with ID: ' . $message->getId() . ' sent.';
return $message;
} catch (Exception $e) {
print 'An error occurred: ' . $e->getMessage();
}
return null;
}
步骤 8.1:发送带有附件的电子邮件
您还可以创建并发送多部分 MIME 消息。例如,以下是使用 Python 编写的示例:
def send_message(service, user_id, message):
try:
message = service.users().messages().send(userId=user_id, body=message).execute()
print('Message Id: %s' % message['id'])
return message
except Exception as e:
print('An error occurred: %s' % e)
return None
def create_message_with_attachment(sender, to, subject, message_text, file):
message = MIMEMultipart()
message['to'] = to
message['from'] = sender
message['subject'] = subject
msg = MIMEText(message_text)
message.attach(msg)
content_type, encoding = mimetypes.guess_type(file)
if content_type is None or encoding is not None:
content_type = 'application/octet-stream'
main_type, sub_type = content_type.split('/', 1)
if main_type == 'text':
fp = open(file, 'rb')
msg = MIMEText(fp.read().decode("utf-8"), _subtype=sub_type)
fp.close()
elif main_type == 'image':
fp = open(file, 'rb')
msg = MIMEImage(fp.read(), _subtype=sub_type)
fp.close()
elif main_type == 'audio':
fp = open(file, 'rb')
msg = MIMEAudio(fp.read(), _subtype=sub_type)
fp.close()
else:
fp = open(file, 'rb')
msg = MIMEBase(main_type, sub_type)
msg.set_payload(fp.read())
fp.close()
filename = os.path.basename(file)
msg.add_header('Content-Disposition', 'attachment', filename=filename)
message.attach(msg)
raw_message = base64.urlsafe_b64encode(message.as_string().encode("utf-8"))
return {'raw': raw_message.decode("utf-8")}
步骤 9:阅读收件箱中的一封特定电子邮件
如果不能使用 API 读取 Gmail 邮件,那就太奇怪了。幸运的是,你可以通过邮件 ID 使用 GET 方法来实现。以下是在 Python 应用中的示例:
import base64
import email
def get_messages(service, user_id):
try:
return service.users().messages().list(userId=user_id).execute()
except Exception as error:
print('An error occurred: %s' % error)
def get_message(service, user_id, msg_id):
try:
return service.users().messages().get(userId=user_id, id=msg_id, format='metadata').execute()
except Exception as error:
print('An error occurred: %s' % error)
def get_mime_message(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id,
format='raw').execute()
print('Message snippet: %s' % message['snippet'])
msg_str = base64.urlsafe_b64decode(message['raw'].encode("utf-8")).decode("utf-8")
mime_msg = email.message_from_string(msg_str)
return mime_msg
except Exception as error:
print('An error occurred: %s' % error)
如果邮件包含附件,请在代码中添加以下内容:
def get_attachments(service, user_id, msg_id, store_dir):
try:
message = service.users().messages().get(userId=user_id, id=msg_id).execute()
for part in message['payload']['parts']:
if(part['filename'] and part['body'] and part['body']['attachmentId']):
attachment = service.users().messages().attachments().get(id=part['body']['attachmentId'], userId=user_id, messageId=msg_id).execute()
file_data = base64.urlsafe_b64decode(attachment['data'].encode('utf-8'))
path = ''.join([store_dir, part['filename']])
f = open(path, 'wb')
f.write(file_data)
f.close()
except Exception as error:
print('An error occurred: %s' % error)
Gmail API 与传统 SMTP 相比有哪些优劣之处?
使用的电子邮件协议
简单邮件传输协议(SMTP) 是一套用于发送电子邮件的规则,既可以用于发件人向邮件服务器发送邮件,也可以用于服务器之间的邮件传输。大多数电子邮件服务提供商使用 SMTP 发送邮件,使用 POP3/IMAP4 接收邮件。要了解更多关于这些协议的信息,您可以阅读我们关于 IMAP、POP3 和 SMTP 的博文。谷歌也提供免费的Gmail SMTP 服务器服务。应用程序编程接口 (API) 是应用程序、平台和代码之间相互通信的接口。借助 Gmail API,您可以仅使用超文本传输协议 (HTTP) 发送电子邮件,HTTP 是一套定义邮件格式和传输方式的规则。
邮件是如何发送的?
您可以从应用程序调用 API,与用于从另一个服务器发送电子邮件的电子邮件服务进行通信。
对于 SMTP 协议,客户端与 SMTP 服务器建立 TCP 连接并发送电子邮件。获得授权后,服务器将电子邮件发送到收件人的 SMTP 服务器,收件人的 SMTP 服务器再将其转发到 IMAP4 或 POP3 服务器。客户端和服务器之间使用SMTP 命令和响应进行通信。
验证
Gmail API 使用开放式身份验证 (OAuth2),它只允许您请求所需的访问权限范围。SMTP 则通过客户端登录名和密码进行身份验证,提供对帐户的完全访问权限。
配额
Gmail API 的使用上限为每日 10 亿个配额单位。每个方法都需要特定数量的配额单位。例如,drafts.c reate需要 10 个单位,messages.send需要 100 个单位。Gmail API 强制执行每日邮件发送量限制。此外,请注意Gmail 邮件的最大大小为 25MB。
SMTP 还是 API?
每种方案都有其优缺点。SMTP 是一种应用广泛且易于设置的邮件发送方案。此外,您无需任何编程技能即可操作。您还可以使用Mailtrap等模拟 SMTP 服务器作为安全邮件测试的场所。
此外,它也是实现流程自动化并为应用程序提供丰富功能的绝佳选择。而且,用于发送电子邮件的 API还能提供额外的安全保障,这对于处理电子邮件中的敏感数据至关重要。
希望您喜欢阅读我们关于如何使用Ruby、GoLang、JavaScript、Java、NodeJS、PHP 等语言通过 Gmail API 发送电子邮件的指南,该指南最初发布在 Mailtrap 博客上。
文章来源:https://dev.to/sofiatarhonska/send-emails-with-gmail-api-b55






