2012-01-30 30 views
5

Các bạn ổn, tôi đã xem trên internet cho các độ tuổi và không thể tìm thấy câu trả lời cho điều này. Tôi đã thử nhiều gợi ý nhưng tôi dường như không thể làm cho nó hoạt động được. Tôi đang cố gắng gửi email bằng python (smtplib và các mô-đun email) và dịch vụ gmail. Dưới đây là các gói nhập khẩu của tôi:Gửi email bằng Python TypeError: Chuỗi hoặc bộ đệm dự kiến ​​

import time, math, urllib2, urllib, os, shutil, zipfile, smtplib, sys 
from email.mime.text import MIMEText 

và đây là tuyên bố def của tôi để gửi email:

def sendmessage(): 
print('== You are now sending an email to Hoxie. Please write your username below. ==') 
mcusername = str(raw_input('>> Username: ')) 
print('>> Now your message.') 
message = str(raw_input('>> Message: ')) 
print('>> Attempting connection to email host...') 
fromaddr = '[email protected]' 
toaddrs = '[email protected]' 
username = '[email protected]' 
password = '1013513403' 
server = smtplib.SMTP('smtp.gmail.com:587') 
subject = 'Email from',mcusername 
content = message 
msg = MIMEText(content) 
msg['From'] = fromaddr 
msg['To'] = toaddrs 
msg['Subject'] = subject 
try: 
    server.ehlo() 
    server.starttls() 
    server.ehlo() 
except: 
    print('!! Could not connect to email host! Check internet connection! !!') 
    os.system('pause') 
    main() 
else: 
    print('>> Connected to email host! Attempting secure login via SMTP...') 
    try: 
     server.login(username,password) 
    except: 
     print('!! Could not secure connection! Stopping! !!') 
     os.system('pause') 
     main() 
    else: 
     print('>> Login succeeded! Attempting to send message...') 
     try: 
      server.sendmail(fromaddr, toaddrs, msg) 
     except TypeError as e: 
      print e 
      print('Error!:', sys.exc_info()[0]) 
      print('!! Could not send message! Check internet connection! !!') 
      os.system('pause') 
      main() 
     else: 
      server.quit() 
      print('>> Message successfully sent! I will respond as soon as possible!') 
      os.system('pause') 
      main() 

tôi đã sửa lỗi một cách rộng rãi như tôi dám và có được điều này:

>> Login succeeded! Attempting to send message... 
TypeError: expected string or buffer 

Điều đó có nghĩa là nó đã thành công khi đăng nhập nhưng dừng lại khi nó cố gửi tin nhắn. Một điều làm tôi bực mình là nó không chỉ ra đâu. Ngoài ra mã hóa của tôi có thể không phải là tuyệt vời như vậy không có bắt nạt trên mạng.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều! Cảm ơn.

Trả lời

3

tôi đoán là thủ phạm là dòng này:

subject = 'Email from',mcusername 

Nếu bạn đang mong đợi để tạo ra đối tượng như là một chuỗi, nó thực sự được thực hiện vào một tuple vì bạn đang đi qua hai giá trị. Những gì bạn có thể muốn làm là:

subject = 'Email from %s' % mcusername 

Ngoài ra, đối với khía cạnh gỡ lỗi ... Cách bạn đang gói tất cả các trường hợp ngoại lệ của bạn và chỉ cần in thông điệp ngoại lệ được ném đi traceback hữu ích (nếu có một). Bạn đã cố gắng không gói tất cả mọi thứ cho đến khi bạn thực sự biết ngoại lệ cụ thể mà bạn đang cố gắng xử lý? Thực hiện việc xử lý ngoại lệ tất cả các thao tác như vậy sẽ giúp gỡ lỗi khó khăn hơn khi bạn có lỗi cú pháp.

6

Dòng đó là đâm là

server.sendmail(fromaddr, toaddrs, msg) 

Bạn đang đem lại cho nó hai chuỗi và một trường hợp MIMEText; nó muốn thông báo dưới dạng một chuỗi. [Tôi nghĩ rằng nó cũng muốn các địa chỉ dưới dạng một danh sách, nhưng nó đặc biệt trường hợp một chuỗi.] Ví dụ, bạn có thể nhìn vào example in the docs:

s = smtplib.SMTP('localhost') 
s.sendmail(me, [you], msg.as_string()) 
s.quit() 

Bạn cần phải chuyển đổi các MIMEText thành một chuỗi cho sendmail để được hạnh phúc. Sau khi sửa lỗi chủ đề mà @jdi đã chỉ ra (tạo ra một đối tượng "AttributeError: 'tuple' không có thông báo 'lstrip'" thuộc tính) và thay đổi thông điệp thành msg.as_string(), mã của bạn làm việc cho tôi.

Các vấn đề liên quan