如何使用python 2.7发送电子邮件附件

时间:2014-04-13 17:47:49

标签: python email

使用此代码使用localhost ip发送电子邮件时出现错误,有任何建议如何解决套接字错误?

def SendTMail(self):
# Import the email modules we'll need

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
#try:
    fp = open('testint.txt', 'rb')
    # Create a text/plain message
    msg = MIMEText(fp.read())
    testfile = 'TESTING REPORT'
    fp.close()

    me = '124@hotmail.co.uk'
    you = '123@live.com'
    msg['Subject'] = 'The contents of %s' % testfile
    msg['From'] = me
    msg['To'] = you

    # Send the message via our own SMTP server, but don't include the
    # envelope header.
    s = smtplib.SMTP('192.168.1.3')
    s.sendmail(me, [you], msg.as_string())
    s.quit()     

错误如下所示:

File "x:\example.py", line 6, in SendTMail s = smtplib.SMTP('192.168.1.3') 
File "x:\Python27\lib\smtplib.py", line 251, in init (code, msg) = self.connect(host, port)
File "x:\Python27\lib\smtplib.py", line 311, in connect self.sock = self._get_socket(host, port, self.timeout)
File "x:\Python27\lib\smtplib.py", line 286, in _get_socket return socket.create_connection((host, port), timeout)
File "x:\Python27\lib\socket.py", line 571, in create_connection raise err – 
error: [Errno 10051] A socket operation was attempted to an unreachable network

1 个答案:

答案 0 :(得分:2)

在发布原始代码之前,我想根据您对question的评论中发生的对话添加一个小解释。

smtplib连接到现有的SMTP服务器。你可以看到它更像Outlook Express。 Outlook是一个客户端(或Mail User Agent,如果你想获得幻想)。它不会自己发送电子邮件。它连接到它在其帐户中配置的任何SMTP服务器,并告诉服务器“嘿,我是用户xxx@hotmail.com(这是我的密码来证明它)。你能给我发送这个吗?”< / em>的

如果您愿意,拥有自己的SMTP服务器是可行的(例如,在Linux中,一个易于配置的SMTP服务器将是Postfix,我确信有很多用于Windows)一旦你设置了一个,它就是' ll开始侦听其端口25(通常)中的传入连接,如果通过该端口的任何字节跟随SMTP protocol,它将把它发送到目的地。恕我直言,这不是一个好主意(如今)。原因是,现在,每个(体面的)电子邮件提供商都会将来自未经验证的SMTP服务器的电子邮件视为垃圾邮件。如果你想发送电子邮件,最好依靠一个众所周知的SMTP服务器(例如smtp.live.com的那个,hotmail使用的服务器),使用你的用户名和密码进行身份验证,并发送你的电子邮件依赖(就像在SMTP Relay)上一样。

所以这就是说,这里有一些代码可以将带有附件borrajax.jpeg的HTML文本发送到依赖smtp.live.com的电子邮件帐户。

您需要编辑以下代码来设置您的Hotmail密码(如果您的问题中显示的不是124@hotmail.co.uk,也可能是您的hotmail的用户名)和电子邮件收件人。出于明显的安全原因,我在测试后从代码中删除了地雷......对于我: - D 我把你在问题中看到的那些放回去了。此外,此脚本假设它将在运行Python脚本的同一目录中找到名为.jpeg的{​​{1}}图片:

borrajax.jpeg

当我运行示例时(正如我所说,我编辑了收件人和发件人),它使用我的(旧)Hotmail帐户向Gmail帐户发送了一封电子邮件。这是我在Gmail中收到的内容:

Gmail screenshot

你可以用email Python模块做很多事情。玩得开心!!

编辑:

Gorramit !!你对附加文本文件的评论不会让我放松! : - D 我必须自己看。按照详细的in this question,我添加了一些代码来添加文本文件作为附件。

import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def send_mail():
    test_str="This is a test"
    me="124@hotmail.co.uk"
    me_password="XXX"   # Put YOUR hotmail password here
    you="123@live.com"
    msg = MIMEMultipart()
    msg['Subject'] = test_str
    msg['From'] = me
    msg['To'] = you
    msg.preamble = test_str
    msg_txt = ("<html>"
                "<head></head>"
                "<body>"
                    "<h1>Yey!!</h1>"
                    "<p>%s</p>"
                "</body>"
            "</html>" % test_str)
    msg.attach(MIMEText(msg_txt, 'html'))
    with open("borrajax.jpeg") as f:
        msg.attach(MIMEImage(f.read()))
    smtp_conn = smtplib.SMTP("smtp.live.com", timeout=10)
    print "connection stablished"
    smtp_conn.starttls()
    smtp_conn.ehlo_or_helo_if_needed()
    smtp_conn.login(me, me_password)
    smtp_conn.sendmail(me, you, msg.as_string())
    smtp_conn.quit()

if __name__ == "__main__":
    send_mail()

是的,它有效...我在运行脚本的同一目录中有一个msg_txt = ("<html>" "<head></head>" "<body>" "<h1>Yey!!</h1>" "<p>%s</p>" "</body>" "</html>" % test_str) msg.attach(MIMEText(msg_txt, 'html')) with open("borrajax.jpeg", "r") as f: msg.attach(MIMEImage(f.read())) # # Start new stuff # with open("foo.txt", "r") as f: txt_attachment = MIMEText(f.read()) txt_attachment.add_header('Content-Disposition', 'attachment', filename=f.name) msg.attach(txt_attachment) # # End new stuff # smtp_conn = smtplib.SMTP("smtp.live.com", timeout=10) print "connection stablished" 文件,并将其作为附件正确发送。