【问题标题】:Dart Gmail API 'send' method returning DetailedApiRequestErrorDart Gmail API“发送”方法返回DetailedApiRequestError
【发布时间】:2020-12-06 15:56:14
【问题描述】:

我正在重建my personal website in Flutter,需要在填写完表格后发送电子邮件

什么:我正在尝试使用 Gmail API Dart 库发送电子邮件

错误:DetailedApiRequestError(状态:400,消息:'message.raw' (TYPE_BYTES) 处的值无效,Base64 解码失败,调用 'send' 时

身份验证工作正常。我按照googleapis 包中的步骤来实现身份验证,使用服务帐户和'clientViaServiceAccount' 方法。

我遵循Gmail API documentation for sending an email using the send method,创建了一个 MimeMessage,在 RFC 2822 中对其进行格式化并将其编码为 base64url,创建一个 Message 对象并将“原始”属性设置为编码的 MimeMessage,并调用 GmailAPIs 的“发送”方法。

问题似乎与 MimeMessage 的编码有关。

我使用enough_mail package 创建了一个 MimeMessage 并将消息设置为 Base 64 编码

这里是 Github 上项目的链接:https://github.com/ashtonjonesdev/ashton_jones_dev_website 'send' 方法在consulting.dart

感谢您的帮助!如果你能帮我解决这个问题,我会在我的文章中给你一个呐喊

发送电子邮件代码:

sendEmail()  async {

   print('sendEmail');

// Create a Mime Message and encode it using base64

MessageBuilder messageBuilder = MessageBuilder();

messageBuilder.from = [
  MailAddress('Ashton Jones', 'ashton@grapeworks.dev')
];

messageBuilder.to = [MailAddress('Ashton Jones', 'ashtonjonesdev@gmail.com')];

messageBuilder.subject = 'cool subject';

messageBuilder.text = 'cool text';

messageBuilder.encoding = MessageEncoding.base64;

// Added Rfc822 encoding
messageBuilder.contentType = ContentTypeHeader.from(MediaType.fromSubtype(MediaSubtype.messageRfc822));

messageBuilder.messageId = '1';

MimeMessage mimeMessage = messageBuilder.buildMimeMessage();


// Ensure body is also encoded as base64 and Rfc822
mimeMessage.body = BodyPart();
mimeMessage.body.contentType = ContentTypeHeader.from(MediaType.fromSubtype(MediaSubtype.messageRfc822));
mimeMessage.body.encoding = 'base64';

// Create a Message object and set the 'raw' property to the encoded String
Message message = Message();

// TODO Need to set the 'raw' property as the entire encoded MimeMessage
// TODO: Figure out if I need to encode the entire MimeMessage as a base 64 String here again (I already set the encoding of the MimeMessage to base64 on line 156)


// Should return the entire encoded MimeMessage
String encodedMimeMessage = mimeMessage.renderMessage();

// Error happening here
message.raw = encodedMimeMessage;

print('Encoded message: ${message.raw}');

// Send the email using the Gmail API 'send' method
// TODO: When I run this, I get an 'invalid value at 'message.raw' (TYPE_BYTES), Base64 decoding failed' error
Message messageCompleted =
    await _gmailApi.users.messages.send(message, 'me').catchError((error) {
  print(error);
});

print(messageCompleted);

}

初始化状态代码:

  @override
   void initState() {
   super.initState();

      print(
      'CREDENTIALS: Client ID: ${_credentials.clientId.toString()} | Client Secret: ${_credentials.privateKey}');

// Authenticate the credentials with the service account and use them to initialize the GmailAPI
clientViaServiceAccount(_credentials, scopes).then((AuthClient httpClient) {
  _gmailApi = GmailApi(httpClient);

  print('Users: ${_gmailApi.users}');
});

}

【问题讨论】:

    标签: flutter dart gmail-api


    【解决方案1】:

    我认为您可能必须像这样对 mimeMessage 进行编码,

        message.raw = base64.encode(utf8.encode(mimeMessage.renderMessage()));
    

    【讨论】:

      【解决方案2】:

      我使用“mail_to”和“url_launcher”Flutter 包实现了使用“mailto”方法发送电子邮件。它必须打开客户的电子邮件应用程序,但它工作得很好。 Dart 的 Gmail API 很糟糕,而且没有文档,所以我建议采用另一种方法。

        // Send email using mail_to and url_launcher packages
      

      sendEmail() 异步 {

      print('sendEmail');
      
      final mailtoLink = Mailto(
        to: ['ashtonjonesdev@gmail.com'],
        subject: '$_subject',
        body: '$_message',
      );
      // Convert the Mailto instance into a string.
      // Use either Dart's string interpolation
      // or the toString() method.
      await launch('$mailtoLink');
      

      }

      【讨论】:

        猜你喜欢
        • 2018-10-07
        • 1970-01-01
        • 2021-01-27
        • 2015-12-11
        • 2015-10-11
        • 2020-03-08
        • 1970-01-01
        • 2020-09-07
        • 2017-03-03
        相关资源
        最近更新 更多