Mail Server Solution(5)gmail API and Download Attachment

本文介绍如何使用 Gmail API 列出与关键字相关的邮件、获取邮件附件信息并下载附件到本地目录。通过 Java 代码演示了整个过程,包括 Oauth 认证。
Mail Server Solution(5)gmail API and Download Attachment

1. List all the Messages based on Query
// List all the messages related to keywords
ListMessagesResponse listMessageResponse = service.users().messages()
.list(user).setQ("job.craigslist.org").execute();
List<Message> messages = new ArrayList<Message>();
while (listMessageResponse.getMessages() != null) {
messages.addAll(listMessageResponse.getMessages());
if (listMessageResponse.getNextPageToken() != null) {
String pageToken = listMessageResponse.getNextPageToken();
listMessageResponse = service.users().messages().list(user).setQ("job.craigslist.org")
.setPageToken(pageToken).execute();
} else {
break;
}
}

for (Message message : messages) {
System.out.println(message.toPrettyString());
}

2. Get the Message Attach Info
//Get the Message Attach Info
Message message = service.users().messages().get(user, "14eda36adbc0789e").execute();
System.out.println("Message snippet: " + message.getSnippet());
List<MessagePart> parts = null;
if(message.getPayload() != null){
parts = message.getPayload().getParts();
if(parts != null && parts.size() > 0){
for(int i = 0; i< parts.size();i++){
MessagePart part = parts.get(i);
System.out.println("====== part " + i + "==========");
System.out.println("filename: " + part.getFilename());
System.out.println("mimetype: " + part.getMimeType());
if(part.getMimeType().equalsIgnoreCase("application/pdf")){
System.out.println("attachmentId : " + part.getBody().getAttachmentId());
}
}
}
}

3. Get the Attachment File
//Get the attachment file
String attachmentId = "ANGjdJ-T4bVPdCT3gQSW-iuq8Txjofxjo3eNjk5qFawdotTon6Rkv2mjH-8EUehiH71OZJsN_mTFA5cHj05JGvuN3_Ev05_26bxUXvO4NaYxw-aExinNWZbUdpgSYqHq5NmS6QVnOKBbsrwdTau1kGzB5JC1qYNuXMKVRuPvrL49RcYEfBR8iIzHDvskqY8bVcyUHPTSCu0mycCf32-eogP7muMu7TO2MjF1HIYv50kCGG2edaSKrBD_miQU6aTqQJVhDJ4BVP7LiEB2bwkZssRuF8esb1Obu7N702e6Gw";
MessagePartBody attachPart = service.users().messages().attachments().get(user, "14eda36adbc0789e", attachmentId).execute();
byte[] fileByteArray = Base64.decodeBase64(attachPart.getData());
FileOutputStream fileOutFile =
new FileOutputStream("/Users/carl/data/" + "attach1.pdf");
fileOutFile.write(fileByteArray);
fileOutFile.close();

It will query my own email and find the attachment files and save to /Users/carl/data/ Directory.

The output on the console will be:
- SPAM
{
"id" : "14eda36adbc0789e",
"threadId" : "14eda360b8f81792"
}
{
"id" : "14eda365e1ab3916",
"threadId" : "14eda365e1ab3916"
}
{
"id" : "14eda363378de6ba",
"threadId" : "14eda363378de6ba"
}
{
"id" : "14eda360b8f81792",
"threadId" : "14eda360b8f81792"
}
Message snippet: From: Amber Link [mailto:amber@jobs2careers.com] Sent: Wednesday, July 29, 2015 9:27 AM To: Suong Luu
====== part 0==========
filename:
mimetype: multipart/alternative
====== part 1==========
filename: JMRES12.ADB.aptx.cc.aus.pdf
mimetype: application/pdf
attachmentId : ANGjdJ-qQ-YVPp8li1c9UG1_dDZcLVIGi44z2wWsz8wOl9Ic3Y9z5yBrlGw-xXW1QIoCmQNHlltmj-AvwlrqvwR9IofMDCJJbQS43VZSRg71raq3vHpPBu_5gFRZnQMd_SSHsWs_duBtrHFXfpPjc_wu-aoxEqLl-HcaCFn3cRMwj2wa1MrpoDKpyzXlGQiKb4Y8afvbHTPa63wVYgNtnBlVlQVl3z1JDADTYazKS8_E0D0Kajktdnc5ezq0E8wMAS6OOBM-fOYm09_NGoEzKCb9zD3q93CnkhvCh49A2g

BUILD SUCCESSFUL

About the Oauth authentication Part
private static final List<String> SCOPES = Arrays.asList(
GmailScopes.GMAIL_READONLY);

References:
https://developers.google.com/gmail/api/v1/reference/users/messages/list
### Docker Compose 停止时出现 500 Internal Server Error 和退出状态码为 1 的原因分析 当使用 `docker-compose` 运行多个微服务并尝试通过 `docker-compose stop` 或其他命令停止容器时,如果遇到 **500 Internal Server Error** 并伴随退出状态码为 1,则可能是由以下几个方面引起: #### 1. API 路由配置错误 如果某个微服务依赖于另一个微服务的 API 接口,在关闭过程中可能会触发未处理的异常。例如,某些微服务可能在关闭前仍然试图调用已停止的服务中的 API 路径[^2]。这种情况下,建议检查以下几点: - 确认所有微服务之间的通信路径是否正确设置。 - 验证是否存在硬编码的 IP 地址或端口号,这些可能导致连接失败。 #### 2. 版本兼容性问题 不同版本的 `docker-compose` 文件格式可能存在不兼容的情况。如果使用的 `compose` 文件版本较高而本地安装的工具链较低,或者反之亦然,则可能出现意外行为[^3]。解决方法如下: - 使用匹配当前环境支持的 `version` 字段定义 compose 文件。例如,对于较新的 Docker Engine 及其插件架构推荐采用 `v3.x` 格式;而对于更老的基础设施则应考虑回退至 `v2.x`。 ```yaml version: '3.8' services: web: image: my_web_service_image ports: - "80:80" ``` #### 3. 容器健康检查机制失效 部分框架会在应用正常终止之前执行清理操作(如释放资源)。然而,若此过程未能顺利完成——比如由于数据库锁定或其他外部因素干扰——那么整个流程就有可能中断从而引发 HTTP 错误响应[^4]。针对这种情况可采取措施包括但不限于调整超时参数、优化事务管理逻辑等手段来增强系统的鲁棒性。 #### 4. 日志记录不足影响排查效率 为了更好地定位具体哪个环节出了差错,应该启用详尽的日志输出模式以便收集更多上下文信息用于后续诊断工作[^5]。可以通过修改 docker-compose.yml 中的相关选项实现这一目标: ```yaml logging: driver: "json-file" options: max-size: "10m" max-file: "3" ``` 以上策略能够帮助减少因缺乏足够的调试数据而导致误解的可能性。 --- ### 总结 综上所述,要彻底解决问题需从四个方面入手:一是审查各组件间交互关系确保无遗漏之处;二是核实所选用的技术栈规格一致性避免潜在冲突发生;三是强化程序内部防护能力防止中途崩溃现象再现;四是完善监控体系积累必要证据辅助决策制定过程。只有这样才能够有效应对诸如 “stop command returns with exit code 1 and throws a 500 internal server error” 类似的挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值