更新弄清楚为什么,gmail在端口465和587上提供smtp服务器,465是SSL,587是TLS,ESMTP想要TLS,这就是为什么它不能与465一起使用, ssl服务器...我认为(我知道它有效我不知道为什么如果有人能解释为什么请这样做:))
我正在尝试使用SMTP和Twisted发送电子邮件,没有任何反应,没有错误,没有输出,也没有电子邮件.....
输出
MacBookPro:EmailSender User$ python send_mime_email.py
What is your email address? [REMOVED]@gmail.com
What is your username (typically same as email address)? [REMOVED]@gmail.com
What is your password? [REMOVED]
What is your smtp server details? smtp.gmail.com:465
-------Email Details-------
Subject: Hello
Body: Hi, how are you?
Attachment: FTP_Commands.txt
-------Logging-------
2013-01-20 20:43:44-0500 [-] Log opened.
2013-01-20 20:43:44-0500 [-] Creating email
2013-01-20 20:43:44-0500 [-] Created Message.
2013-01-20 20:43:44-0500 [-] Starting factory <twisted.mail.smtp.ESMTPSenderFactory instance at 0xa3c508>
2013-01-20 20:43:44-0500 [-] Sending Email
2013-01-20 20:53:44-0500 [ESMTPSender,client] SMTP Client retrying server. Retry: 5
^C2013-01-20 20:54:47-0500 [-] Received SIGINT, shutting down.
2013-01-20 20:54:47-0500 [ESMTPSender,client] SMTP Client retrying server. Retry: 4
2013-01-20 20:54:47-0500 [-] Main loop terminated.
代码
import sys
import email
import email.mime.application
import sys
from OpenSSL.SSL import SSLv3_METHOD
from twisted.mail.smtp import ESMTPSenderFactory
from twisted.internet.ssl import ClientContextFactory
from twisted.internet.defer import Deferred
from twisted.internet import reactor
from twisted.python import log
try:
from cStringIO import cStringIO as StringIO
except ImportError:
from StringIO import StringIO
def create_email(address, subject, body, data):
print "Creating email"
# email block
# text body
msg = email.mime.Multipart.MIMEMultipart()
msg['Subject'] = subject
# send it to ourselves to make it simple
msg['From'] = address
msg['To'] = address
# body
body = email.mime.Text.MIMEText(body)
msg.attach(body)
att = email.mime.application.MIMEApplication(data, _subtype="binary")
att.add_header('Content-Disposition','attachment',filename="data.bin")
msg.attach(att)
print "Created Message."
# Create a context factory which only allows SSLv3 and does not verify
# the peer's certificate.
return str(msg)
def send_email(smtp_server, smtp_port, username, password, from_, to, msg):
contextFactory = ClientContextFactory()
contextFactory.method = SSLv3_METHOD
resultDeferred = Deferred()
mime_obj = StringIO(str(msg))
senderFactory = ESMTPSenderFactory(
username,
password,
from_,
to,
mime_obj,
resultDeferred,
contextFactory=contextFactory)
reactor.connectTCP(smtp_server, smtp_port, senderFactory)
print "Sending Email"
return resultDeferred
if __name__ == '__main__':
email_address = raw_input("What is your email address? ")
username = raw_input("What is your username (typically same as email address)? ")
password = raw_input("What is your password? ")
sd = raw_input("What is your smtp server details? ")
ss, sp = sd.split(":")
sp = int(sp)
print "-------Email Details-------"
subject = raw_input("Subject: ")
body = raw_input("Body: ")
attachment_file = raw_input("Attachment: ")
o = open(attachment_file, "rb")
data = o.read()
o.close()
print "-------Logging-------"
log.startLogging(sys.stdout)
email_data = create_email(email_address, subject, body, data)
send_email(ss, sp, username, password, email_address, email_address, email_data)
reactor.run()
答案 0 :(得分:1)
我认为,这里有一些令人困惑,令人困惑的术语令人困惑。 “SSL”和“TLS”实际上最常用作相同的东西的不同名称。虽然词汇量略微严格(可能仍然不是绝对技术上的正确),但有一个名为“SSLv2”的协议和另一个名为“SSLv3”的协议(SSLv2的更新)和另一个名为“TLSv1”的协议(SSLv3的更新)。
许多人说“SSL”指的是这三件事中的任何一件,或者也许都是所有这些。
此外,很多人说“TLS”指的是这三件事中的任何一件,或者也许都是这些东西!
此外,还有一个单独的概念,即在已建立的连接上开始说出这些协议之一,已经用于交换某些(非加密)数据。有时 是人们说“TLS”时的意思,当你在问题的顶部说“TLS”时,这就是你的意思。
gmail在端口465上提供的是一个SMTP服务器,它具有强制SSL(SSLv2,SSLv3或TLSv1,我还没有检查哪个),它始于连接的最开始 - 即,在任何SMTP流量开始之前交换。
g7在端口587上提供的是没有任何SSL(任何SSLv2,SSLv3或TLSv1)的SMTP服务器,但它支持SMTP功能,用于协商交换机以在某些时候启用SSL以后。
就客户而言,这里的区别当然是,他们是否应该在建立TCP连接后立即启动SSL(SSLv2,SSLv3或TLSv1),或者是否应该开始说SMTP然后稍后协商“升级”到SSL(SSLv2,SSLv3或TLSv1)。
如果客户端和服务器不同意这里应该发生什么,结果可能是“挂起”连接 - 例如,服务器等待客户端启动SSL握手,客户端等待服务器发送这是一个SMTP问候语。
答案 1 :(得分:0)
解决了问题是我使用smtp.gmail.com:465而不是smtp.gmail.com:587。