Google禁用第三方密码登录后如何运行CGI/Perl脚本认证访问Gmail
问题背景
自2022年5月30日起,Google不再支持仅通过用户名和密码请求登录Google账号的第三方应用或设备接入相关服务。
通过cron定时任务运行的Perl程序,核心逻辑为遍历Gmail账号内所有邮件、根据邮件内容执行对应处理操作,目前运行时抛出身份验证错误直接崩溃。在已登录Google账号的环境下手动运行程序同样无法正常执行,需在现有代码基础上集成适配新规则的身份验证逻辑。
原有问题代码如下:
Net::IMAP::Simple; IO::Socket::SSL; Crypt::CBC; Email::Simple; $L = 'GoogleLogin'; $P = 'GooglePassword'; # Connect $imap = Net::IMAP::Simple->new($Server, port => 993, use_ssl => 1,) || die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n"; # Log in if ( !$imap->login( $L, $P ) ) {print "Login failed for $L: " . $imap->errstr . "\n"; exit(64);} # Look in the inbox my $nm = $imap->select('Inbox'); ## Iterate through all messages for ($i = 1 ; $i <= $nm ; $i++ ) { $message = $imap->get( $i ); # or die "For $L Cannot get message number $i " . $imap->errstr . " \n"; @flags = $imap->msg_flags($i); # Copy this message $imap->create_mailbox( "Inbox.Processed" ); $imap->copy( $i, "Inbox.Processed" ); # or die "For $L cannot move message number $i to Processed " . $imap->errstr . " \n"; # Copy to target. $imap2->put( 'Inbox', $message, @flags ) or die "Problem with put of $L - " . $imap2->errstr . "\n"; $imap->delete( $i ); } # Disconnect $imap->quit;
可行方案
登录失败的核心原因是Google已经全面下线低安全性应用的账号密码直登通道,针对cron这类无人值守的运行场景,不需要做复杂的OAuth2改造,使用应用专用密码即可兼容原有代码逻辑,操作步骤如下:
- 开启目标Google账号的两步验证:未开启两步验证的账号不提供应用专用密码生成入口,必须先完成该步骤。
- 生成应用专用密码:进入Google账号安全设置页,找到应用专用密码生成入口,选择应用类型为“邮件”,设备类型匹配运行脚本的服务器即可,确认后会得到16位长度的随机密码,该密码具备IMAP/SMTP服务的完整访问权限,不需要二次校验。
- 调整代码配置:原有IMAP连接、邮件遍历处理的逻辑完全不需要改动,仅需将代码中
$P变量的值替换为刚生成的16位应用专用密码即可,$L变量仍填写完整的Gmail邮箱地址。
注意事项
- 应用专用密码生成后仅展示一次,需妥善保存,存储脚本的文件要配置合理的系统权限,避免未授权访问。
- 该验证链路完全不依赖Web端登录态,不管手动运行还是cron定时触发,都可以正常完成身份校验,不需要保持账号在浏览器的登录状态。
- 原代码开头的模块加载语句缺少
use关键字,补上后可以避免部分Perl环境下的模块加载报错。 Net::IMAP::Simple原生支持该验证方式,不需要更换IMAP客户端依赖库。
替换完成后先在命令行手动执行一次脚本,确认邮件拉取、复制、删除逻辑都正常运行后,再配置cron定时规则即可,整个改造过程不需要额外的交互验证流程,完全适配无人值守的运行场景。
内容的提问来源于stack exchange,提问作者Melchester
相关产品推荐
相关产品推荐

