Perl Net::SMTP发送邮件至自身时跳过收件箱问题求助
问题描述
我用Google账号的“应用密码”,通过Perl的Net::SMTP模块给自己发Gmail,但发送方、接收方和验证账号都是同一个Google账号时,邮件只会出现在已发送箱,不会进入收件箱,也收不到通知。想知道怎么让邮件正常进收件箱并触发通知?
环境信息
- 操作系统:Windows 10 + WSL + Ubuntu 22.04.4 LTS
- 开发语言:Perl 5.34.0
当前使用的代码
#!/usr/bin/perl -w use Net::SMTP; $user = 'my_mail_at_gmail_dot_com'; $pass = 'application password string'; $sender = 'my_mail_at_gmail_dot_com'; $receiver = 'my_mail_at_gmail_dot_com'; $smtp = Net::SMTP->new('smtp.gmail.com', Port => 587, Timeout => 30, Debug => 1, #Debug => 0, ); $smtp->starttls(); $smtp->auth($user, $pass); $smtp->mail($sender); $smtp->to($receiver); $smtp->data(); while(my $data = <DATA>){ $smtp->datasend($data); } $smtp->dataend(); $smtp->quit; __DATA__ Subject: mail testing From: NEW_NEWS <my_mail_at_gmail_dot_com> mail test
解决办法
Gmail默认会把同一账号发给自己的邮件直接归到已发送文件夹,不会进收件箱。可以试试以下几种方法:
1. 添加特殊邮件头
在邮件的__DATA__部分添加X-Forwarded-For头,模拟外部发送的邮件:
Subject: mail testing From: NEW_NEWS <my_mail_at_gmail_dot_com> X-Forwarded-For: external-sender@example.com mail test
2. 使用非关联的发件人别名
把From字段改成一个和当前Gmail账号无关的邮箱(不需要真实存在),比如:
From: 系统通知 <notify@myapp.com>
这样Gmail会更倾向于把邮件当成外部邮件,送入收件箱。
3. 改用密送(BCC)发送
把代码里的$smtp->to($receiver);改成$smtp->bcc($receiver);,用密送的方式给自己发邮件,可能绕过Gmail的同一账号检测。
4. 设置Gmail过滤器
手动在Gmail里创建过滤器:
- 过滤条件:填你发送邮件的主题关键词或者发件人邮箱
- 操作:勾选“不要将其归档”,并可以设置“标记为重要”,确保邮件进入收件箱。不过这种方法需要手动配置,不如修改代码灵活。
验证步骤
修改代码后发送测试邮件,先检查收件箱是否收到,再确认通知是否触发。如果没找到,去垃圾邮件文件夹看看,必要时把发件人加入白名单。
内容的提问来源于stack exchange,提问作者Chihiro Fukazawa
相关产品推荐
相关产品推荐

