2015-06-21 8 views
2

Я пытаюсь отправить электронное письмо с помощью SMTP через python. Это мой код:отправка электронной почты с использованием python с использованием smtp

import smtplib 
from email.mime.text import MIMEText 

textfile='msg.txt' 
you='[email protected]' 
me='[email protected]' 

fp = open(textfile, 'rb') 
msg = MIMEText(fp.read()) 
fp.close() 

# me == the sender's email address 
# you == the recipient's email address 
msg['Subject'] = 'The contents of %s' % textfile 
msg['From'] = me 
msg['To'] = you 
print "reached before s" 
s = smtplib.SMTP('127.0.0.1',8000) 
print "reached after s" 
s.sendmail(me, [you], msg.as_string()) 
s.quit() 

, когда я пытаюсь выполнить этот код, «достигнуто до с» напечатан, а затем переходит в бесконечный цикл или так, т.е. «достигается после с» не печатается и программы все еще работает. Это код сервера:

import sys 
import BaseHTTPServer 
from SimpleHTTPServer import SimpleHTTPRequestHandler 

HandlerClass = SimpleHTTPRequestHandler 
ServerClass = BaseHTTPServer.HTTPServer 
Protocol  = "HTTP/1.0" 


if sys.argv[1:]: 
    port = int(sys.argv[1]) 
else: 
    port = 8000 
server_address = ('127.0.0.1', port) 



HandlerClass.protocol_version = Protocol 
httpd = ServerClass(server_address, HandlerClass) 

sa = httpd.socket.getsockname() 
print "Serving HTTP on", sa[0], "port", sa[1], "..." 
httpd.serve_forever() 

кто-то может понять, что это не так?

+2

У вас нет SMTP-сервера, работающего на вашем компьютере ('127.0.0.1'). У вас есть веб-сервер (HTTP). Я ответил на этот вопрос следующим образом: http://stackoverflow.com/a/23047183/289011 Проверьте это. Это может помочь. – BorrajaX

+0

@BorrajaX Возможно, [yagmail] (https://github.com/kootenpv/yagmail) может быть вам интересен, как и в моем ответе :) – PascalVKooten

ответ

0

Я считаю, yagmail (отказ от ответственности: я сопровождающий) может оказать вам большую помощь.

Его цель - упростить отправку писем с вложениями.

import yagmail 
yag = yagmail.SMTP('[email protected]', 'yourpassword') 
yag.send(to = '[email protected]', subject ='The contents of msg.txt', contents = 'msg.txt') 

Это только три строки.

Обратите внимание, что yagmail contents попытается загрузить переданную строку. Если он не может, он будет отправляться как текст, если он может загрузить его, он будет прикреплять его.

Если вы передадите список строк, он попытается загрузить каждую строку в виде файла (или, опять же, просто отобразить текст).

Установить с pip install yagmail или pip3 install yagmail для Python 3.

Больше информации на github.

0

Вот другой подход, который создает класс отправителя электронной почты со всей обработкой ошибок обеспечены:

import getpass 
import smtplib 

class EmailBot(object): 
    # Gets the username and password and sets up the Gmail connection 
    def __init__(self): 
     self.username = \ 
      raw_input('Please enter your Gmail address and hit Enter: ') 
     self.password = \ 
     getpass.getpass('Please enter the password for this email account and hit Enter: ') 
     self.server = 'smtp.gmail.com' 
     self.port = 587 
     print 'Connecting to the server. Please wait a moment...' 

     try: 
      self.session = smtplib.SMTP(self.server, self.port) 
      self.session.ehlo() # Identifying ourself to the server 
      self.session.starttls() # Puts the SMTP connection in TLS mode. All SMTP commands that follow will be encrypted 
      self.session.ehlo() 
     except smtplib.socket.gaierror: 
      print 'Error connecting. Please try running the program again later.' 
      sys.exit() # The program will cleanly exit in such an error 

     try: 
      self.session.login(self.username, self.password) 
      del self.password 
     except smtplib.SMTPAuthenticationError: 
      print 'Invalid username (%s) and/or password. Please try running the program again later.'\ 
       % self.username 
      sys.exit() # program will cleanly exit in such an error 

     def send_message(self, subject, body): 
      try: 
       headers = ['From: ' + self.username, 'Subject: ' + subject, 
        'To: ' + self.username, 'MIME-Version: 1.0', 
        'Content-Type: text/html'] 
       headers = '\r\n'.join(headers) 

       self.session.sendmail(self.username, self.username, headers + '''\r\r''' + body) 
      except smtplib.socket.timeout: 
       print 'Socket error while sending message. Please try running the program again later.' 
       sys.exit() # Program cleanly exits 
      except: 
       print "Couldn't send message. Please try running the program again later." 
       sys.exit() # Program cleanly exits 

Все, что вам нужно сделать, это создать экземпляр EmailBot и вызвать send_message метод на нем, с соответствующие данные в качестве входных данных.

Смежные вопросы