【问题标题】:Send email with python使用 python 发送电子邮件
【发布时间】:2012-06-30 17:07:31
【问题描述】:

我正在尝试创建一个发送电子邮件的简单 python 脚本。我使用了以下代码:

import subprocess

params = {'from':    'from@example.com',
          'to':      'to@example.com',
          'subject': 'Message subject'}

message = '''From: %(from)s
To: %(to)s
Subject: %(subject)s

Message body

''' % params

sendmail = subprocess.Popen(['/usr/share/sendmail', params['to']])
sendmail.communicate(message)

但是当我尝试运行它时收到以下错误消息:

Traceback (most recent call last):
  File "/home/me/test.py", line 15, in <module>
    sendmail = subprocess.Popen(['/usr/share/sendmail', params['to']])
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 13] Permission denied

谁知道这个问题的解决方案,或者更好的代码?

谢谢!

【问题讨论】:

  • 您可以使用内置的 smtp 库 docs.python.org/library/email-examples.html,而不是调用 sendmail 二进制文件
  • 有什么特殊原因使用python的smtplibemail模块?
  • 对我来说它没有抛出上述错误。在我的系统中,sendmail 位于 /usr/sbin/sendmail,只需从命令提示符中检查您是否可以发送邮件。
  • @guidot 不,我没有特别的理由愿意接受建议。
  • @tuxuday 我把它移到 /usr/sbin/sendmail 没有结果:/

标签: python email send


【解决方案1】:

/usr/share/sendmail 非常不寻常 - 你确定你的 sendmail 二进制文件确实存在吗?通常是/usr/sbin/sendmail

如果我是你,我宁愿使用标准库 smptlib 而不是直接调用 sendmail。

你可以这样使用它来发送消息:

 server = smtplib.SMTP('smtp.example.com')
 server.sendmail(fromaddr, toaddrs, msg)
 server.quit()

【讨论】:

  • 我在终端中写了 whereis sendmail 并且 /usr/share/sendmail 是它的响应。但是我现在已经将 sendmail 文件夹移动到 /usr/sbin 并给出了相同的错误消息。
  • 这有点跑题了,但是 sendmail 真的可以从命令行工作吗?
【解决方案2】:

如果您的邮件被直接配置,您可以使用专用邮件库,而不是调用特定进程:

import smtplib
from email.mime.text import MIMEText

fp = open(textfile, 'rb')
# Create a text/plain message
msg = MIMEText(fp.read())
fp.close()

# Format headers
msg['Subject'] = 'My subject'
msg['From'] = 'from@from.fr'
msg['To'] = 'to@to.com'

# Send the message via Michelin SMTP server, but don't include the envelope header.
s = smtplib.SMTP('your mail server')
s.sendmail('from@from.fr', ['to@to.com'], msg.as_string())
s.quit()

文档中有更多python email examples

【讨论】:

  • 我在尝试运行时收到以下错误消息:错误:[Errno 111] Connection denied.
  • 所以这是一个 SMTP 服务器配置错误。您是否尝试将'localhost' 作为服务器?
【解决方案3】:

这是一些使用 smtplib 发送电子邮件的代码,并且可以执行 TLS/SSL

import smtplib
from email.MIMEText import MIMEText
from email.utils import parseaddr

class Mailer(object):
    def __init__(self, fromAddress, toAddress, password):
        self.fromAddress = parseaddr(fromAddress)[1]
        self.toAddress = parseaddr(toAddress)[1]
        self.password = password

    def send(self, subject, body):
        msg = MIMEText(body)
        msg["From"] = self.fromAddress
        msg["Reply-to"] = self.toAddress
        msg["To"] = self.toAddress
        msg["Subject"] = subject

        sender = msg["From"]
        recipient = msg["To"]

        messageText = "".join(str(msg))
        mxhost = self.lookup(sender) # lookup finds the host that you want to send to

        server = smtplib.SMTP(mxhost, 587) #port 465 or 587
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(sender, self.password)
        server.sendmail(sender, recipient, messageText)
        server.close()

【讨论】:

    【解决方案4】:

    这是我发送电子邮件的代码。

    #coding: utf-8
    
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formatdate
    
    def send_mail(to_list,sub,content):
        mail_host="smtp.example.com"
        mail_user="nvi"
        mail_pass="password"
        mail_postfix="example.com"
        me=mail_user + '555' +"<"+mail_user+"@"+mail_postfix+">"
        msg = MIMEText(content, _subtype='plain', _charset='utf-8')
        msg['Subject'] = sub
        msg['From'] = me
        msg['To'] = to_list
        msg['Date'] = formatdate(localtime=True)
        msg['Bcc'] = '123@example.com'
        try:
            s = smtplib.SMTP()
            s.connect(mail_host)
            s.login(mail_user,mail_pass)
            s.sendmail(me, to_list, msg.as_string())
            s.close()
            return True
        except Exception, e:
            print e
            return False
    
    
    if __name__ == "__main__":
        send_mail('my_email_address', 'subject', 'content')
    

    【讨论】:

      【解决方案5】:

      我的程序适用于 gMail,您可以尝试使用它来处理其他任何事情。您还可以发送短信。我在下面附上我的代码。

      import smtplib
      from email.mime.multipart import MIMEMultipart
      from email.mime.text import MIMEText
      from email.mime.base import MIMEBase
      from email import encoders
      Type = input("Enter 1 for eMail, 2 for SMS: ")
      toaddr = 0
      if Type=='1':
         toaddr = input("Enter to address: ")
      else:
         Provider = input("1 for Sprint, 2 for AT&T, and 3 for Verizon: ")
         Mobile = input("Enter the mobile number: ")
         if Provider=='1': 
            toaddr = str(Mobile) + "@messaging.sprintpcs.com"
         if Provider=='2':
            toaddr = str(Mobile) + '@txt.att.net'
         if Provider=='3':
            toaddr = str(Mobile) + ''
         print (toaddr)      
      head = input("Enter your subject: ")
      body = input("Enter your message: ")
      fromaddr = input("Enter the 'From Address'(example@gmail.com): ")
      msg = MIMEMultipart()
      msg['From'] = fromaddr
      msg['To'] = toaddr
      msg['Subject'] = head
      password = input("Enter the from address password: ")
      msg.attach(MIMEText(body, 'plain'))
      server = smtplib.SMTP('smtp.gmail.com', 587)
      server.starttls()
      server.login(fromaddr, password)
      text = msg.as_string()
      server.sendmail(fromaddr, toaddr, text)
      server.quit()
      

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2019-10-18
        • 2010-10-27
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 2022-12-28
        相关资源
        最近更新 更多