Как я могу отправить электронную почту, используя Python? - PullRequest
8 голосов
/ 14 февраля 2012

Я пишу программу, которая отправляет электронную почту с использованием Python. На разных форумах я узнал следующий фрагмент кода:

#!/usr/bin/env python
import smtplib
sender = "sachinites@gmail.com"
receivers = ["abhisheks@cse.iitb.ac.in"]
yourname = "Abhishek Sagar"
recvname = "receptionist"
sub = "Testing email"
body = "who cares"
message = "From: " + yourname + "\n" 
message = message + "To: " + recvname + "\n"
message = message + "Subject: " + sub + "\n" 
message = message + body
try:
    print "Sending email to " + recvname + "...",
    server = smtplib.SMTP('smtp.gmail.com:587')
    username = 'XYZ@gmail.com'  
    password = '*****'  
    server.ehlo()
    server.starttls()  
    server.login(username,password)  
    server.sendmail(sender, receivers, message)         
    server.quit()
    print "successfully sent!"
except  Exception:
    print "Error: unable to send email"

Но он просто печатает "" Ошибка: невозможно отправить электронное письмо "и выходит из терминала. Как я могу решить эту проблему?

Я изменил последние две строки на

except Exception, error:
    print "Unable to send e-mail: '%s'." % str(error)

Я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "./2.py", line 45, in <module>
    smtpObj = smtplib.SMTP('localhost')
  File "/usr/lib/python2.6/smtplib.py", line 239, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python2.6/smtplib.py", line 295, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/lib/python2.6/smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "/usr/lib/python2.6/socket.py", line 514, in create_connection
    raise error, msg
socket.error: [Errno 111] Connection refused

Ответы [ 3 ]

16 голосов
/ 14 февраля 2012

Если заголовки сообщений, полезные данные содержат не-ascii символы, тогда они должны быть закодированы:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from email.header    import Header
from email.mime.text import MIMEText
from getpass         import getpass
from smtplib         import SMTP_SSL


login, password = 'user@gmail.com', getpass('Gmail password:')
recipients = [login]

# create message
msg = MIMEText('message body…', 'plain', 'utf-8')
msg['Subject'] = Header('subject…', 'utf-8')
msg['From'] = login
msg['To'] = ", ".join(recipients)

# send it via gmail
s = SMTP_SSL('smtp.gmail.com', 465, timeout=10)
s.set_debuglevel(1)
try:
    s.login(login, password)
    s.sendmail(msg['From'], recipients, msg.as_string())
finally:
    s.quit()
6 голосов
/ 14 февраля 2012

Если вы напечатаете сообщение об ошибке, вы, скорее всего, получите подробное описание ошибки what .Попробуйте (не каламбур):

try:
    # ...
except Exception, error:
    print "Unable to send e-mail: '%s'." % str(error)

Если после прочтения сообщения об ошибке вы все еще не понимаете свою ошибку, обновите ваш вопрос сообщением об ошибке, и мы можем помочь вам еще.


Обновление после дополнительной информации :

сообщение об ошибке

socket.error: [Errno 111] Соединение отклонено

означает, что удаленный конец (например, SMTP-сервер GMail) отказывается от сетевого подключения.Если вы посмотрите на smtplib.SMTP конструктор , похоже, вы должны изменить

server = smtplib.SMTP('smtp.gmail.com:587')

на следующее.

server = smtplib.SMTP(host='smtp.gmail.com', port=587)
0 голосов
/ 14 февраля 2012

Согласно сообщению об ошибке, вы используете localhost в качестве SMTP-сервера, затем соединение было отклонено. На вашем локальном хосте не запущен сервер SMTP. Я полагаю, вам нужно убедиться, что подключенный SMTP-сервер действителен.

...