如何在Nest JS中使用Gmail API将电子邮件标记为已读?
P粉818306280
P粉818306280 2024-01-10 18:00:25
[JavaScript讨论组]

我正在使用Nest.js进行编码,现在我成功地获取了电子邮件数据。现在,我想通过消息ID逐个获取每封电子邮件,并检查该电子邮件是否已读或未读。如果电子邮件未读,我想将其标记为已读并在数据库中进行更新。 任何了解的人请为此重写代码,


注意:我正在使用Prisma ORM进行数据库操作

// google-sheet.service.ts
    import { Injectable } from '@nestjs/common';
    import { google } from 'googleapis';
    import { JWT } from 'google-auth-library';
    import { EnvironmentService } from 'src/core/environments/environments.service';
    import axios from 'axios';
    @Injectable()
    export class GmailService {
      constructor(private environmentService: EnvironmentService) {}
    
      async getEMails() {
        try {
          const oAuth2Client = new google.auth.OAuth2(
            this.environmentService.clientId(),
            this.environmentService.clientSecret(),
            this.environmentService.googleUri(),
          );
    
          await oAuth2Client.setCredentials({
            refresh_token:this.environmentService.refresh_token() ,
          });
    
          // 获取所有id
          const fetchingIdUrl = `https://gmail.googleapis.com/gmail/v1/users/email@gmail.com/messages/`;
    
          const { token } = await oAuth2Client.getAccessToken();
          const config: any = {
            headers: {
              Authorization: `Bearer ${token}`,
            },
          };
    
          const response = await axios.get(fetchingIdUrl, config);
          // 通过id获取邮件
          const fetchingEmailById = `https://gmail.googleapis.com/gmail/v1/users/eamil@gmail.com/messages/${response.data.id}`;
          const emailResponse = await axios.get(fetchingEmailById, config);
    
          const emailData = response.data;
          console.log(emailData);
    
          // emailData.payload.parts.forEach((part, index) => {
          //   if (part.body.size > 0) {
          //     const bodyContent = Buffer.from(part.body.data, 'base64').toString();
          //     console.log('Body Content:');
          //     console.log(bodyContent);
          //   }
          // });
        } catch (err) {
          console.error('Error fetching emails:', err.message);
        }
      }
    }

P粉818306280
P粉818306280

全部回复(1)
P粉127901279
import { Injectable } from '@nestjs/common';
import { google } from 'googleapis';
import { JWT } from 'google-auth-library';
import { EnvironmentService } from 'src/core/environments/environments.service';
import axios from 'axios';

@Injectable()
export class GmailService {
  constructor(private environmentService: EnvironmentService) {}

  async getEMails() {
    try {
      const oAuth2Client = new google.auth.OAuth2(
        this.environmentService.clientId(),
        this.environmentService.clientSecret(),
        this.environmentService.googleUri(),
      );

      await oAuth2Client.setCredentials({
        refresh_token: this.environmentService.refresh_token(),
      });

      // Fetch all email IDs
      const fetchingIdUrl = 'https://gmail.googleapis.com/gmail/v1/users/email@gmail.com/messages/';

      const { token } = await oAuth2Client.getAccessToken();
      const config: any = {
        headers: {
          Authorization: `Bearer ${token}`,
        },
      };

      const response = await axios.get(fetchingIdUrl, config);
      const emailIds = response.data.messages.map((message: any) => message.id);

      for (const emailId of emailIds) {
        // Fetch individual email by ID
        const fetchingEmailById = `https://gmail.googleapis.com/gmail/v1/users/email@gmail.com/messages/${emailId}`;
        const emailResponse = await axios.get(fetchingEmailById, config);

        const emailData = emailResponse.data;
        console.log(emailData);

        // Check if the email is unread and mark it as read
        if (!emailData.labelIds.includes('UNREAD')) {
          continue; // Skip if the email is already read
        }

        // Mark the email as read
        await markEmailAsRead(emailId, config);

        // Update the email status in the database here
        // Replace the following line with your database update logic
        console.log(`Marked email with ID ${emailId} as read.`);
      }
    } catch (err) {
      console.error('Error fetching emails:', err.message);
    }
  }

  // Helper function to mark an email as read
  async markEmailAsRead(emailId: string, config: any) {
    const markAsReadUrl = `https://gmail.googleapis.com/gmail/v1/users/email@gmail.com/messages/${emailId}/modify`;
    const requestBody = {
      removeLabelIds: ['UNREAD'],
    };
    await axios.post(markAsReadUrl, requestBody, config);
  }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号