Gmail API - 从 g-suite 服务帐户发送邮件时设置发件人名称

Posted

技术标签:

【中文标题】Gmail API - 从 g-suite 服务帐户发送邮件时设置发件人名称【英文标题】:Gmail API - set sender name when sending mail from a g-suite service account 【发布时间】:2021-06-04 04:32:41 【问题描述】:

我想动态更改显示在收件人邮箱中的名称(显示在电子邮件主题 + 内容的左侧)。

无论我尝试什么,名称总是以'info'结尾,'from'地址总是'info@g-suite-domain'

以下是我正在使用的代码。

import argparse
import base64
import os
import sys
from email.mime.text import MIMEText
from apiclient import errors
from google.oauth2 import service_account
from googleapiclient.discovery import build
from httplib2 import Http


def create_message(sender, to, subject, message_text):
    """Create a message for an email.
    Args:
      sender: Email address of the sender.
      to: Email address of the receiver.
      subject: The subject of the email message.
      message_text: The text of the email message.
    Returns:
      An object containing a base64url encoded email object.
    """
    message = MIMEText(message_text, 'html')
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    raw = base64.urlsafe_b64encode(message.as_bytes())
    raw = raw.decode()
    body = 'raw': raw
    return body


def send_message(service, user_id, message):
    """Send an email message.
    Args:
      service: Authorized Gmail API service instance.
      user_id: User's email address. The special value "me"
      can be used to indicate the authenticated user.
      message: Message to be sent.
    Returns:
      Sent Message.
    """
    try:
        message = (service.users().messages().send(userId=user_id, body=message)
                   .execute())
        print('Message Id: %s' % message['id'])
        return message
    except errors.HttpError as error:
        print('An error occurred: %s' % error)


def service_account_login():
    SCOPES = [
        'https://mail.google.com',
        'https://www.googleapis.com/auth/gmail.compose',
        'https://www.googleapis.com/auth/gmail.modify',
        'https://www.googleapis.com/auth/gmail.readonly',
    ]

    dirname = os.path.dirname(os.path.realpath(__file__))
    SERVICE_ACCOUNT_FILE = dirname + '/service-key.json'

    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    delegated_credentials = credentials.with_subject(
        'info@g-suite-domain')
    service = build('gmail', 'v1', credentials=delegated_credentials)
    return service


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--to', required=True)
    parser.add_argument('--subject', required=True)
    args = parser.parse_args()
    content = sys.stdin.read()

    EMAIL_FROM = "service-acount-id@project-id.iam.gserviceaccount.com"

    service = service_account_login()
# Call the Gmail API
    message = create_message(EMAIL_FROM, args.to, args.subject, content)
    sent = send_message(service, 'me', message)

我试过了……

我可以在网上找到相关的解决方案,但没有任何帮助。 将 EMAIL_FROM 和 with_subject 地址都设置为“Name ”的形式,但没有任何效果。 在 gmail 中为“info@g-suite-domain”更改“发送邮件”选项 在 gmail、google admin 和 google 控制台中指定两个电子邮件帐户的名称。 创建新项目 + 服务帐号 读取 googleapiclient.discovery 库以查找有问题的代码,但找不到任何内容。

【问题讨论】:

delegated_credentials = credentials.with_subject('info@g-suite-domain') @DaImTo 我明白了,但是如何更改发件人姓名?我什至尝试将“发送邮件”选项更改为无济于事。 info@g-suite-domain 是您域中的用户,请转到域并更改名称。您也可以尝试更改 EMAIL_FROM @DaImTo 我更新了问题,但我确实尝试更改名称(gmail、谷歌控制台和谷歌管理员)。更改 EMAIL_FROM 是什么意思?我尝试了rfc 2822 指定的变体,但似乎没有任何效果。 抱歉,我的内存有点大,我无法再访问 gsuite,所以我无法使用服务帐户对其进行测试。这与您对那个用户的委托有很大关系,据我所知,这个用户的名字将是那个用户的名字。 【参考方案1】:

我之前将域提供商从 Wix 转移到 Namecheap,但我没有意识到 MX 记录没有转移。看来,由于缺少 MX 记录,发件人地址总是会重写为 'info@g-suite-domain'(忽略 message['from'] 值)。

【讨论】:

【参考方案2】:

我已经获得了预期的结果:

message["from"] = "info@g-suite-domain <info@g-suite-domain>"

【讨论】:

我在帖子中提到我试过这个但没有任何影响。 您是否检查过您在delegated_credentials = credentials.with_subject('info@g-suite-domain')EMAIL_FROM = "info@g-suite-domain &lt;info@g-suite-domain&gt;" 上使用的电子邮件是否相同?还删除生成的token 以确保您正确生成凭据。 这部分对我有用。当名称有特殊字符时,这对我不起作用,但对于 ascii 字符,这确实有效

以上是关于Gmail API - 从 g-suite 服务帐户发送邮件时设置发件人名称的主要内容,如果未能解决你的问题,请参考以下文章

Gmail API - PHP - 使用服务帐户发送电子邮件

使用委派的全域权限访问 gmail API

如何在 C# 中使用带有服务帐户的 gmail api 或 google Oauth 来发送邮件?

无需 oAuth 即可连接到非 Google 服务的 Gmail 插件

Gmail插件可在没有oAuth的情况下连接到非Google服务

在 Google 日历 API 中开会