Archive

Posts Tagged ‘mail’

Apple Mail 邮件太多不下载问题的解决

June 29th, 2010 Fwolf No comments

Apple Mail version3.6(936)

原先拿到这个 mac 本本的时候,由于家中网速比较慢,收发邮件比较折磨人,而我又属于对邮件依赖较重的,所以专门申请了个新的 gmail 帐号,专门用在这个机器上,把邮件下载到本地便于处理(平时个人邮件都是自己发给自己的 N 个邮箱共享),顺便体验下 Apple Mail 软件。

Apple Mail 倒算是中规中矩,按下不表,中间有一段时间没怎么用这台 mac,而这个专用 gmail 帐号里面堆积的邮件应该也不少了,简单估计有几百封吧。终于,等到我想用的那一天,突然发现它不下载新邮件了。

逐项检查,系统和软件工作正常,网络正常,gmail 登录进去肯定是有新邮件,而且 pop 设置正常。所有的东西都没有动过,并且原先刚设置好这个帐号的时候,邮件下载都是正常的。Command+0 打开 Activity 窗口监视──连接、登录、查找新邮件、退出,貌似正常,但完全无视我邮箱中赫然在目的新邮件哪。

纯属无意中翻看 gmail 的在线帮助,其实对这类帮助并不报太大希望的,因为一般上面只有一些常规问题的答案,我的问题比较蹊跷,八成没有。帮助里面专门有针对 Apple Mail 3.0 Troubleshooting,列了几个问题,对照我的情况,逐个回答如下:

  • Have you recently used Gmail’s POP service with this client and address?
  • --> Yes, this address just worked recently
  • When are you encountering problems?
  • --> Downloading
  • Does your client display an error?
  • --> No, my mail client does not show an error
  • Downloading issues
  • --> Some or all messages don’t download

然后帮助给了4个解决方法,其中第2条是亮点:

Try enabling recent mode in your POP client by replacing 'username@gmail.com'
in the Username field of your POP client settings with 'recent:username@gmail.com',
and uncheck the box next to Remove copy from server after retrieving a message
in your Advanced POP client settings. Recent mode fetches the last 30 days of mail,
regardless of any other factors. If you don't Leave messages on server your 
messages will be moved to Trash after download.

看仔细了,在邮件帐户前面加上 recent:,只下载最近30天的邮件,这个以前没听说过,从之,我的邮件又愉快的下载了。至于30天以前的邮件如何下载,我是不需要了。至于为什么会这样,还真不明白是 gmail 这里有限制,还是 Apple Mail 无法读取30天以前邮件的邮件头导致无法下载,希望有明白人指点一二。

附 gmail 帮助截图为据:

Gmail帮助中关于Apple Mail的Troubleshooting

Related posts

Categories: Internet Tags: , , , , ,

Wine下运行的广发委托系统退出时可能会误删mail目录

July 25th, 2008 Fwolf No comments

这个问题不是第一次出现了,网上也查不到相关资料,所以感觉有必要说一说,看有没有和我同样遭遇的朋友。

用wine运行广发委托软件,是比较老的版本了,用起来没什么问题的,新版wine下中文的表现还改进了:

stock_trade_client

偶尔的,好像是打开以后发呆时间比较长了更容易出现,点左上角“退出”按钮的时候,原本应该一下子就关闭的,突然变得迟钝、没有响应了。后来一检查,发现$HOME/mail下的文件都没了,把文件删完之后委托程序才正常关闭。

猜测是委托软件为了防病毒、盗号之类的,在进行安全检查的时候,会检查目录下有没有mail文件(因为一般盗号会采用生成邮件,然后发送到自己邮箱的方式),如果有就删除之。windows下一般人很少会用到mail目录的,用wine运行的委托软件不知怎地阴差阳错的就找到了系统默认的mail目录,文件还删得挺干净。

原先想过把mail放到别处,然后ln过来,可并不解决问题;并且mail这个目录也不宜放到别处,因为那样系统生成的邮件就放不过来了,比如crontab里程序运行的输出。

所以现在只能采取两个临时措施,以观后效。一是在用wine启动程序的时候,先cd到委托软件所在目录,即当前目录下就没有mail目录了;二是在winecfg里把到$HOME下的映射都删掉:

wine_remove_my_documents

话再说回来,在$HOME下操作其实也挺危险的,因为对于个人用计算机来说,系统坏了倒是小事,资料丢了才心疼呢。

Related posts

Categories: Tools Tags: , , ,

[Mutt]用msmtp替代esmtp作发信代理

January 12th, 2008 Fwolf 2 comments

刚开始使用mutt的时候,由于也没有什么经验,在MDA选择方面抓了一个esmtp就用上了。说实话,esmtp也一直工作的很好,就是发信的时候需要傻傻等着(参见muttrc的sendmail_wait参数),如果不等待也可以,发送失败你就不知道了。虽然失败的情况比较少,一般都是邮件比较大或者网络不太好的情况才会发生,但我们外发的邮件往往都是比较重要的,真想有一种能够自动重试的发信代理,于是就查到了msmtp。

msmtpesmtp两个软件作者都不多,但msmtp确实更新频繁一些,而esmtp作者说现在已经不需要怎么添加功能了,只是维护bug。在多账户配置方面,好像msmtp的配置方法要“聪明”一些,账号规则有一些”继承”的小把戏。在发信队列方面,esmtp在Features中明显声明不支持,而msmtp有一个msmtpqueue,国内用的人非常少,只看到cu blog上提到了一点,smtpqueue能够把要外发的邮件集中在一起,单独发送,但没有说失败处理的事情;再到msmtp在sf.net上的cvs中查msmtpqueue的README文件,终于搞清楚了,和我的需要比较吻合。

msmtpqueue会”冒充”成一个MDA,当mutt发信时,它接收外发邮件并返回成功信息,而实际上只是把信件保存在QUEUEDIR里了,当调用msmtp-runqueue.sh的时候,再进行实际的发送处理。发送成功一封信,就会从QUEUEDIR中删除,发送失败就继续保持不动,下次再调用msmtp-runqueue.sh的时候自然又会处理(相当于重发)了。比起mutt中的邮件失败重发还会多生成一个邮件副本(我设定了发信的同时record在当前目录)应该是好多了。

Mails sent successfully will be deleted from the queue directory.
Mails whose delivery failed will be left untouched; you may want to edit
them, delete them by hand or simply run msmtp-runqueue.sh at a later time.

工作开始,首先通过apt安装msmtp,很小的,加上TLS/SSL所需的libgsasl7,一共才182k。然后配置账号文件~/.msmtprc,格式和~/.esmtprc比较类似:

# Default value for all following accounts
defaults
#      tls on
    tls_trust_file /etc/ssl/certs/ca-certificates.crt
#   keepbcc on
    logfile ~/log/msmtp.log

# Gmail
account gmail
    host smtp.gmail.com
    port 587
    auth on
    tls on

account mailbox@gmail.com : gmail
    from mailbox@gmail.com
    user "mailbox@gmail.com"
    password "secret"

# Another mail service
account another_mailbox@domain.com
    host smtp.domain.com
    auth on
    from another_mailbox@domain.com
    user "another_mailbox"
    password "another_secret"

# Default account
account default : mailbox@gmail.com

Copy自官方文档,语法很简单,最开始的defaults是默认设置,然后的account就是各个账号的设置了,账号名称最好和邮件中的From:对应,这样msmtp就能知道调用哪个账号了。最有意思的是,account可以用冒号:来”继承”其它已定义账号的设置,使用这个机制,就为所有gmail邮箱指定了host、port、auth、tls四个属性,然后在具体的账号设置中,只要再设定from、user、password就可以了,很方便,”继承”多个账号的话用逗号隔开。最后默认发信账号(匹配寻找account失败时使用)default可以直接”继承”某个账号的设置过来。

然后设置~/.muttrc,用msmtp来发信:

set sendmail="/path/to/msmtp"
set use_from=yes
set from="Fwolf <mailbox@domain.com>"
set envelope_from=yes
set sendmail_wait=0

测试一下,发信正常,现在可以让msmtpqueue出场了。由于msmtpqueue只是在”转达”msmtp发信的命令,所以需要先把msmtp调试好以后再配置。

msmtpqueue已经随msmtp安装上了,放在/usr/share/doc/msmtp/examples下,按照这里README文件的说明,把msmtp-enqueue.shmsmtp-runqueue.sh两个文件加上执行属性,然后ln到$HOME/.mutt下,再在这里创建一个新目录msmtpqueue,ln成~/.msmtpqueue(两个脚本默认的QUEUEDIR),最后修改muttrc中的sendmail:

set sendmail = "~/.mutt/msmtp-enqueue.sh"

好了,现在再来发信,是不是瞬间就完成了?再看~/.mutt/msmtpqueue目录下,也多了两个文件,分别以.mail.msmtp结尾,他们分别包含了刚才所发信件的信件内容和发送命令。现在运行msmtp-runqueue.sh

~/.mutt$ ./msmtp-runqueue.sh 
*** Sending 2008-01-12-23.03.52.mail...
2008-01-12-23.03.52.mail sent successfully

邮件就这样顺利的发出去了。

工作到这里基本就都完成了,发信时按y嗖一下就完成的感觉真不错,为了更方便的发送邮件,还可以在mutt中定义启动邮件发送程序的快捷键:

macro generic S "!~/.mutt/msmtp-runqueue.sh\n"

ubuntu的包里没有,但svn上还有一个msmtp-listqueue.sh脚本,列出当前QUEUEDIR中信件的From/To/主题,凑合能用,但用RFC2047编码方式的中文标题自然是不能正常显示的了。

Update @ 2009-03-27

知道gmail的两个端口,465和587有区别么?还真不完全一样,我用msmtp试出来的结果是这样的:

  • 如果使用465端口,则置tls_starttls off
  • 如果使用587端口,则置tls_starttls on

否则不是连不上就是无回馈数据。是看了标题: 我翻译的 msmtp 的手册页后受启发发现的。

Related posts

Categories: Internet, Linux, Tools Tags: , , , , ,

Message rejected for Sector 5 policy reasons

February 3rd, 2007 Fwolf No comments

用邮件订阅了一些google groups讨论组,发现有些文章值得保存的话,我会用mail forward转发到自己的另外一个讨论组,这样便于以后查找,可有些邮件在转发的时候会失败,gmail会返回一封“Delivery Status Notification (Failure)”发送失败的邮件,内容如下:

This is an automatically generated Delivery Status Notification Delivery to the following recipient failed permanently: somewhere@googlegroups.com Technical details of permanent failure: PERM_FAILURE: Message rejected for Sector 5 policy reasons —– Original message —– ……

退信的原因是“Sector 5“,而这个神秘的“Sector 5“ google并没有给出详细的内容,哪怕是出处也没有。网上也有很多人遇到了类似的情况,甚至在一些google groups中也有讨论,但都没有结果,google官方也没有出面指明。不过,今天在看某个电影的时候,发现了这个:

FBI WARNING

这是大家常见的“FBI WARNING”信息,就是警告信息,一般正规影碟前面都有的,告诉观众不得非法传播、拷贝,否则最高可以判5年徒刑或者罚款25万美元(够恨的),而在这些的法律依据,就是“Title 17 U.S.Code, Section 501, 506 and 508”。

所以我觉得gmail退信的原因,和这个Section 501等等有关系,没准就是同一部法律,或者类似的条款,都是关于版权保护的内容。gmail在我转发邮件的时候,发现转发的内容不是我写的,并且和其他groups中的文章惊人的相似,所以就以“Sector 5”为由,拒绝我传播“盗版”了。

Update @ 2008-03-23

找到一篇和508沾边但仍未完整解答我的疑问的文章:section 508

Related posts

Categories: Internet Tags: , , , ,

让phpmailer支持中文名称的附件

May 23rd, 2006 Fwolf 5 comments

phpmailer设置使用utf-8编码发送邮件以后,已经能够正常的发送中文邮件了,当然你调用时传进去的中文参数必须也是utf-8编码才行,但是我发现,即使这样,发送中文文件名的附件的时候,附件名称不能正确的显示。

比如我们要发送的附件是“测试.txt”,如果在添加附件的时候强制使用指定文件名的方式:

$mail->AddAttachment($attach, $attach);

那么发送过去的附件文件名将会是乱码,如果不指定:

$mail->AddAttachment($attach, $attach);

那么发送过去的文件名中的中文干脆没了,成了“.txt”。

究其原因,打开class.phpmailer.php,在大概第1007行左右,函数AddAttachment中,有一句

$filename = basename($path);

原因就在这里,现在我们使用的php 5.1.2,包括他以前的很多版本,basename函数和dirname函数都是不支持中文文件名的,所以一解析就把中文给过滤掉了。而如果强行指定文件名为什么还乱码呢,这是因为phpmailer虽然会自动根据你设定的编码方式给主题、正文进行utf-8编码化,但是却不会给附件的文件名编码。现在,只需要修改上面这一句,就能够同时解决这两方面的问题了。修改结果如下:

//$filename = basename($path);
if (false === strpos($path, '/'))
    $filename = $this->EncodeHeader($path);
else
    $filename = $this->EncodeHeader(substr($path, strrpos($path, '/') + 1));

不使用basename函数了,改用自己的方法来得到文件名,并且借用了主题Subject的编码函数EncodeHeader来生成utf-8编码形式的附件名称,搞定。

Update @ 2008-04-14

在phpMailer 2.1.0 Beta 2中,这个问题依然没有得到处理,需要作的修改还是一样,不过代码的位置在1018行附近。

另外在发送中文邮件的时候,中文会出现乱码,看了网上有处理的方式,没有讲原因,也粗暴了点,直接把函数截断了,还要改两个地方。

我看了一下源码,乱码的产生大概是在将邮件标题转成几个小的=?utf-8?B?...?=时,可能是无意中把中文给截断了产生的,所以我的修改更简单而又略微温柔一点,修改第1185行:

$maxlen = 75 - 7 - strlen($this->CharSet);
改成:
$maxlen = 75000 - 7 - strlen($this->CharSet);

就行了,把字符串的值设大点,让它不分段就行了。

Related posts

Categories: PHP Tags: , , , , ,