python中的群发电子邮件

python中的群发电子邮件,python,python-2.7,Python,Python 2.7,我对编程非常陌生,所以我来这里寻求帮助。我正在尝试做一个简单的群发邮件的乐趣,目前不会使用这个,但在未来的某个时候,我可能会在我的IT工作。我的代码似乎不适合我 import sys import smtplib emailfile = raw_input('Please enter the name of the text file that includes all email addresses: ') emailtosendfrom = raw_input('Enter your ema

我对编程非常陌生,所以我来这里寻求帮助。我正在尝试做一个简单的群发邮件的乐趣,目前不会使用这个,但在未来的某个时候,我可能会在我的IT工作。我的代码似乎不适合我

import sys
import smtplib
emailfile = raw_input('Please enter the name of the text file that includes all email addresses: ')
emailtosendfrom = raw_input('Enter your email address to send from:  ')
msgfile = raw_input('Please enter the text file name that includes the message you want to send out  :')
email = open(emailfile, 'r')
toaddrs = email
msg = open(msgfile, 'r')


# Credentials
password = raw_input('Please enter your email password  :  ')

# Send mail
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.login(emailtosendfrom,password)
with open(emailfile) as f:
    emailsort = f.readlines()
    for user in emailsort:
        server.sendmail(emailtosendfrom, user, msg)
f.close()
server.quit()
此代码返回错误:

Traceback (most recent call last):
  File "mail.py", line 26, in <module>
    server.sendmail(emailtosendfrom, line, msg)
  File "C:\Python27\lib\smtplib.py", line 717,
    esmtp_opts.append("size=%d" % len(msg))
TypeError: object of type 'file' has no len()
回溯(最近一次呼叫最后一次):
文件“mail.py”,第26行,在
sendmail(emailtosendfrom、line、msg)
文件“C:\Python27\lib\smtplib.py”,第717行,
esmtp_选择.append(“大小=%d”%len(msg))
TypeError:类型为“file”的对象没有len()

任何帮助都将不胜感激。谢谢

消息应该是字符串,而不是文件。首先通过替换以下内容获取消息正文:

msg = open(emailfile, 'r')
与:

然后用以下方法修复循环本身:

server.sendmail(emailtosendfrom, user, msgbody)

虽然与问题没有直接关系,但以下是我的2个要点:

  • 使用模块向用户询问密码,这样它就不会显示在屏幕上
  • 您正在打开文件,但从未关闭它们。在本例中,这不是一个大问题,因为脚本将在几毫秒后终止。通常,您应该使用块将所有内容包装在
    中。除了关闭文件句柄外,它们还将明确文件的实际使用位置
  • 有些行是多余的,比如
    email=open(emailfile,'r')
    toaddrs=email
  • 最后,您可以替换:

    emailsort = f.readlines()
    for user in emailsort:
    
    与:

    但是一定要去掉最后的
    \n
    (否则电子邮件地址会出错)

    emailsort = f.readlines()
    for user in emailsort:
    
    for user in f: