使用子进程模块在python中发送电子邮件

时间:2013-07-01 07:46:01

标签: python subprocess postfix-mta

我写了一个脚本来检索网站的天气预报,并在早上发送给我的女朋友。

使用Gmail。当然我可以使用我的Postfix服务器发送它。这是脚本。

我不确定如何在有这么多参数的情况下使用Popen()函数。

我可以使用命令发送邮件。

$ mail -s "おお様からの天気予報" abc@gmail.com < foo

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import urllib2
import subprocess

weather_url = "http://www.weather.com.cn/weather/101020100.shtml"
f=urllib2.urlopen(weather_url)
html = f.read()
soup = BeautifulSoup(html)

content = soup.title.string

with open("foo","w") as mail:
    mail.write(content.encode('utf-8'))

command_line = 'mail -s "おお様からの天気予報" abc@gmail.com < foo'

li = command_line.split()

process = subprocess.Popen(li, shell=True)

returncode = process.wait()

天气预报的内容位于foo文件中。有人可以告诉我如何使用Popen()这么多的论点吗?

我尝试了很多。

这个脚本似乎不起作用。

1 个答案:

答案 0 :(得分:2)

使用shell=True时,您不需要传递参数列表,只需传递参数字符串...

command_line = 'mail -s "おお様からの天気予報" abc@gmail.com < foo'
process = subprocess.Popen(command_line, shell=True)

或..你不能使用shell来解释你的参数并传递一个列表......

command_line = 'mail -s "おお様からの天気予報" abc@gmail.com < foo'
li = command_line.split()
process = subprocess.Popen(li)

但你不能传递参数列表使用shell来解释它。

根据命令的性质,我建议将字符串传递给shell进行解释。 (第一个选项)