2015-05-22 18 views
9

Tôi đang gửi email qua API Gmail và muốn biết thời điểm thư bị trả lại. Tôi có thể làm cái này như thế nào?Làm cách nào để biết email được gửi qua API REST của Gmail có bị trả lại không?

Theo tôi được biết, email bị trả về thường chứa một số loại tiêu đề cho thấy một thư bị trả lại như:

X-Failed-Recipients: [email protected] 

Tuy nhiên, có vẻ không phải luôn luôn là một tiêu đề cho thấy những gì MessageID gốc nó được mà bật .

Tôi đã nghĩ về kế hoạch sau đây, nhưng có rất nhiều lỗ mà tôi nghĩ rằng tôi phải tiếp cận điều này sai.

  1. Gửi email (tới một email đã thất bại) thông qua API Gmail ---> Nó đi qua thành công
  2. Nhận email bị trả về hộp thư email
  3. email Quét cho các email có chứa bật tiêu đề
  4. Cố gắng hình trong đó email gốc bị trả lại.

vấn đề

  • Gmail api trả Gmail nhắn ID, không được thông báo ID thực tế
  • Phải liên tục theo dõi hộp thư đến/cuộc thăm dò để xem nếu có của email bị trả về
  • Là nó thậm chí có thể tìm kiếm bởi sự tồn tại của một tiêu đề?
  • Mỗi nhà cung cấp email ngoài kia dường như có tiêu đề nảy khác nhau
  • Các tiêu đề có thể không chỉ gốc tin nhắn ID

Một vài ý tưởng khác mà tôi đã đã đến:

  • Tìm kiếm email với chuỗi "Không gửi được" trong chủ đề?
  • không sử dụng api phần còn lại của gmail để gửi dưới dạng theo dõi thoát không khả thi. có lẽ sử dụng api SMTP thay thế?

Trả lời

11

Thư bị trả về khi được gửi qua API Gmail nhận được phản hồi từ người gửi thư ([email protected]). Bạn có thể liên tục kiểm tra tin nhắn của người dùng để xem một tin nhắn mới từ daemon đã được nhận chưa.

Đảm bảo lưu dấu thời gian trong vài giây kể từ lần kiểm tra cuối cùng của bạn, vì vậy bạn không nhận được bất kỳ bản sao khó chịu nào vào lần sau.

query = from:[email protected] after:<TIME_SINCE_EPOCH_IN_SECONDS> 

GET https://www.googleapis.com/gmail/v1/users/me/messages?q=from%3Amailer-daemon%40googlemail.com+after%3A1437055051&access_token={YOUR_API_KEY} 

đáp ứng:

{ 
"messages": [ 
    { 
    "id": "14e97f7ed03b7e88", 
    "threadId": "14e97f7ea9b794a4" 
    }, 
] 
} 

tôi nhận được một thư bị trả lại! Chúng ta hãy lấy toàn bộ thư và giải mã nó và nhận được Message-ID bạn đang ám chỉ.

GET https://www.googleapis.com/gmail/v1/users/me/messages/14e97f7ed03b7e88?fields=payload%2Fbody%2Fdata&access_token={YOUR_API_KEY} 

đáp ứng:

{ 
"payload": { 
    "body": { 
    "data": "RGVsA0K..." 
    } 
} 
} 

Chuyển đổi qua đường bưu điện đến base64 thường xuyên từ phiên bản an toàn URL của nó (thay thế tất cả "-" với "+" và "_" với "/"), và base64-giải mã nó, chúng ta nhận được:

atob("RGVsA0K...".replace(/\-/g, '+').replace(/\_/g, '/')); 

tử giải mã:

"Delivery to the following recipient failed permanently: 

    [email protected] 

Technical details of permanent failure: 
DNS Error: Address resolution of sadsads.asdsad. failed: Domain name not found 

----- Original message ----- 

. 
. 
. 

Received: from 292824132082.apps.googleusercontent.com named unknown by 
gmailapi.google.com with HTTPREST; Thu, 16 Jul 2015 13:44:43 -0400 
from: [email protected] 
Date: Thu, 16 Jul 2015 13:44:43 -0400 
Message-ID: <[email protected]> 
Subject: Subject Text 
To: [email protected] 
Content-Type: text/plain; charset=UTF-8 

The actual message text goes here 

Ở đây chúng tôi có ID thư! Hãy lấy email bị trả lại!

query = rfc822msgid:<[email protected]>; 

GET https://www.googleapis.com/gmail/v1/users/me/messages?q=rfc822msgid%3A%3CCADsZLRzOs1wT4B5pgR7oHHdbjkQhuaCQQs8CEckhLwVw73QFEQ%40mail.gmail.com%3E&key={YOUR_API_KEY} 

đáp ứng:

{ 
"messages": [ 
    { 
    "id": "14e97f7ea9b794a4", // <-- Here is the message that bounced! 
    "threadId": "14e97f7ea9b794a4" 
    } 
], 
} 
+0

cho các thông tin của bất cứ ai đây có thể là một chút cũ/lỗi thời và không thực sự giới thiệu cách bạn sẽ vượt qua nó ngoài kịch bản java. gmail api kể từ khi đã đưa lên một trang https://developers.google.com/gmail/api/v1/reference/users/messages/list, điều này cũng gần giống như vậy - – Vahid

0

Đây là cách bạn có thể làm điều đó sử dụng công nghệ phụ trợ và cố gắng làm theo hướng dẫn tài liệu hướng dẫn hiện hành. Vì nó xuất hiện sau: và trước đó: thẻ chỉ hỗ trợ ngày không phải là ngày + thời gian. Vì vậy, trong khi trên EPOCH thời gian có thể đã làm việc trên mã trước đó nhiều công việc là cần thiết trong API hiện tại. Một số điều dưới đây chưa được thêm vào dự án thử nghiệm tôi có trên github. Nhưng để đưa ra ý tưởng:

Chúng tôi yêu cầu bạn xem lại mọi thư bị trả lại cũ hơn một ngày, sau đó phân tích cú pháp tiêu đề để tìm chuỗi chuyển đổi ngày nhận được thành ngày thực và so sánh -20 phút trước từ kết quả bổ sung vào danh sách

List verifyBounceList (Gmail service) { 
     List foundResults=[] 

     Date date = new Date() 
     use (groovy.time.TimeCategory) { 
      date= date -20.minute 
     } 
     Date yesterday = new Date()-1 
     def bounceRecords = listMessagesMatchingQuery(service,'me','from:[email protected] after:'+yesterday.format('YYYY/MM/dd')) 
     bounceRecords?.each { 
      Message message = getMessage(service,'me',it.id) 
      String receivedDateString = message.getPayload().headers?.find{it.name=='Received'}.value.split(';')[1].trim() 
      SimpleDateFormat df = new SimpleDateFormat('EEE, dd MMM yyyy HH:mm:ss z (Z)') 
      Date receivedDate=df.parse(receivedDateString) 
      if (receivedDate>date) { 
       foundResults<<[bouncedRecord:it,mapRecord:message] 
      } 
     } 
     return foundResults 
    } 

Message getMessage(Gmail service, String userId, String messageId) throws IOException { 
    Message message = service.users().messages().get(userId, messageId).execute() 
    ///System.out.println("Message snippet: " + message.getSnippet()) 
    return message 
} 
    /** 
* Simply does a query in given mailbox 
* used to query for mail failures 
* @param service 
* @param userId 
* @param query 
* @return 
* @throws IOException 
*/ 
List<Message> listMessagesMatchingQuery(Gmail service, String userId, String query) throws IOException { 
    ListMessagesResponse response = service.users().messages().list(userId).setQ(query).execute() 

    List<Message> messages = new ArrayList<Message>() 
    while (response.getMessages() != null) { 
     messages.addAll(response.getMessages()) 
     if (response.getNextPageToken() != null) { 
      String pageToken = response.getNextPageToken() 
      response = service.users().messages().list(userId).setQ(query).setPageToken(pageToken).execute() 
     } else { 
      break; 
     } 
    } 
    for (Message message : messages) { 
     //System.out.println(message.toPrettyString()); 
    } 

    return messages; 
} 

Trên được trả về như một danh sách iterating thông qua kết quả trả về:

<g:if test="${instance.size()>0}"> 
     <h2>Bounces found : ${instance.size()}</h2><br/> 
     <div class="errors"> 
     <g:each in="${instance}" var="failed"> 
      ${failed.bouncedRecord} --> ${failed.mapRecord?.id} ${failed.mapRecord?.getSnippet()} ${ }<br/> 
      <g:each in="${failed.mapRecord.getPayload().headers}" var="a"> 
      ${a }<br/>--- 
      </g:each> 
     </g:each> 
0

Khi bạn gửi một tin nhắn qua

service.users().messages().send(userId, message).execute(); 

Nó sẽ trả lại Message. Bạn có thể sử dụng số threadId để kiểm tra xem bạn có trả lời thư đó không.

Dưới đây là một cách dễ dàng để kiểm tra nếu nó bị trả (cho một sự chậm trễ 1 giây sau khi gửi):

public static boolean isBounced(Gmail service, String threadId) throws IOException { 
    List<Message> list = service.users().messages().list("me") 
         .setQ("[email protected]") 
         .execute().getMessages(); 

    return list.stream().anyMatch(msg -> msg.getThreadId().equals(threadId)); 
} 
Các vấn đề liên quan