发布于 2026-01-06 0 阅读
0

使用 Gmail API 发送电子邮件 DEV 的全球展示挑战赛,由 Mux 呈现:展示您的项目!

使用 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也提供了适用于iOSAndroid 的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
Enter fullscreen mode Exit fullscreen mode

Java API 客户端

Installation via Gradle
 repositories {
       mavenCentral()
   }
   dependencies {
       compile 'com.google.api-client:google-api-client:1.30.2' 
   }
Enter fullscreen mode Exit fullscreen mode

Ruby API 客户端

Installation:
gem install google-api-client
Enter fullscreen mode Exit fullscreen mode

.NET API 客户端

Installation via NuGet Package Manager Console:
Install-Package Google.Apis.Gmail.v1
Enter fullscreen mode Exit fullscreen mode

Node.js API 客户端

Installation via npm:
npm install googleapis@39 --save
Enter fullscreen mode Exit fullscreen mode

PHP API 客户端

Installation via Composer:
composer require google/apiclient:"^2.0"
Enter fullscreen mode Exit fullscreen mode

Python API 客户端

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
Enter fullscreen mode Exit fullscreen mode

JavaScript API 客户端

Objective-C API 客户端

Dart API 客户端

步骤 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

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.c​​reate 方法,该方法包含以下内容:

  • 创建 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  
Enter fullscreen mode Exit fullscreen mode

和 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;
}
Enter fullscreen mode Exit fullscreen mode

步骤 8:发送电子邮件

创建好消息后,你可以调用messages.senddrafts.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
Enter fullscreen mode Exit fullscreen mode

和 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;
}
Enter fullscreen mode Exit fullscreen mode

步骤 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")}
Enter fullscreen mode Exit fullscreen mode

步骤 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)
Enter fullscreen mode Exit fullscreen mode

如果邮件包含附件,请在代码中添加以下内容:

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)
Enter fullscreen mode Exit fullscreen mode

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