我尝试使用 python 来了解有关 smtp 协议的更多信息。更准确地说,我一直在尝试将邮件直接发送到主机的 smtp 服务器,但收效甚微。
例如,假设我想向 gmail.com 地址发送邮件,我会查找 gmail.com 的 mx 记录:
>> nslookup -type=MX gmail.com
gmail.com MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com
gmail.com MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
Run Code Online (Sandbox Code Playgroud)
然后我在 python 中执行以下操作:
import smtplib
# Tried both port 465 and 587 (can't test port 25 since it's blocked by my ISP)
s = smtplib.SMTP("alt1.gmail-smtp-in.l.google.com", 587)
Run Code Online (Sandbox Code Playgroud)
我尝试了几个,除了一个之外的每个人我总是得到一个:
“[Errno 10051]尝试对无法访问的网络进行套接字操作”或
“[Errno 10060]连接尝试失败,因为连接方在一段时间后没有正确响应时间过长,或建立的连接失败,因为连接的主机未能响应”异常。
我在某处读到一些邮件服务器对您的 IP …
我知道,同一个查询有数百个问题。为此事道歉。我几乎每一个都尝试过。但仍然没有得到解决方案。事实上,我从 stackoverflow 查询之一复制了一些代码,并根据我的要求对其进行了改进。
我正在编写一个脚本,使用 python 为我们的一台服务器发送错误报告。我的问题是Email is sending to first member of RECIPIENTS only.它需要一次发送给经理团队以及管理员。
RECIPIENTS = ["mail1@gmail.com", 'mail2@mydomain.in' ]
TO = ", ".join(RECIPIENTS)
USER = "user30@gmail.com"
PASSWD = "userpass"
def sendmail():
msg = MIMEMultipart('alternative')
msg['Subject'] = subject()
msg['From'] = USER
msg['To'] = TO
mime_text = MIMEText(get_msg_text(), 'plain')
msg.attach(mime_text)
#-- Auth by Gmail
SERVER = smtplib.SMTP("smtp.gmail.com:587")
SERVER.starttls()
try:
SERVER.login(USER,PASSWD)
except SMTPAuthenticationError, e:
logit(e)
return False
try:
SERVER.sendmail(msg['From'], msg['To'], msg.as_string())
except Exception, e:
logit(e)
return False
finally:
SERVER.quit()
return True …Run Code Online (Sandbox Code Playgroud) 我使用 Python 的 SMTPLib 编写了一个简单的 SMTP 客户端。只是尝试添加一些错误处理 - 特别是在这种情况下,当要连接的目标服务器不可用时(例如,指定了错误的 IP!)
目前,回溯如下所示:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "smtplib_client.py", line 91, in runClient
try:
File "/usr/local/lib/python2.7/smtplib.py", line 251, in __init__
(code, msg) = self.connect(host, port)
File "/usr/local/lib/python2.7/smtplib.py", line 311, in connect
self.sock = self._get_socket(host, port, self.timeout)
File "/usr/local/lib/python2.7/smtplib.py", line 286, in _get_socket
return socket.create_connection((host, port), timeout)
File "/usr/local/lib/python2.7/socket.py", line 571, in create_connection
raise err
socket.error: [Errno 111] Connection refused
Run Code Online (Sandbox Code Playgroud)
很明显,socket.py 中的“create_connection”正在爆炸。这有它自己的 try / except 块: …
Python 新手在这里。我正在尝试在处理命令后发送电子邮件。当我测试时,我收到了两封重复的电子邮件,而另一封则为 1。我的代码如下。
import smtplib
import os.path
from email.mime.text import MIMEText
msg = MIMEText("The report at *link* has been updated")
msg['Subject'] = "Test Report Notification **TEST**"
#put your host and port here
s = smtplib.SMTP_SSL('###########.net:465')
s.login('system@#########','#####')
s.sendmail('system@#####.com','bryan#########', msg.as_string())
s.quit()
print("done")
Run Code Online (Sandbox Code Playgroud)
提前致谢。我确实尝试过研究。
找到了很多如何发送邮件的例子,但我如何阅读收件箱?例如 yandex。
import smtplib as smtp
email = "me@example.com"
password = "password"
server = smtp.SMTP_SSL('smtp.yandex.com')
server.set_debuglevel(1)
server.ehlo(email)
server.login(email, password)
server.auth_plain()
# server.get_and_print_your_inbox_magic_method()
server.quit()
Run Code Online (Sandbox Code Playgroud) 如何在同一正文中发送文本格式和 html 格式的电子邮件?有什么用MIMEmultipart?
MIMEMultipart([MIMEText(msg, 'text'),MIMEtext(html,'html')])
Run Code Online (Sandbox Code Playgroud)
我能够使用此功能收到一封电子邮件,但正文为空白
PS:我正在尝试发送文本并在同一正文中附加表格。我不想将表格作为附件发送。
html = """
<html>
<head>
<style>
table, th, td {{ border: 1px solid black; border-collapse: collapse; }} th, td {{ padding: 5px; }}
</style>
</head>
<body><p>Hello, Friend This data is from a data frame.</p>
<p>Here is your data:</p>
{table}
<p>Regards,</p>
<p>Me</p>
</body>
</html> """
text = """
Hello, Friend.
Here is your data:
{table}
Regards,
Me"""
text = text.format(table=tabulate(df, headers=list(df.columns), tablefmt="grid"))
html = html.format(table=tabulate(df, headers=list(df.columns), tablefmt="html"))
if(df['date'][0].year==1900 and df['date'][0].month==datetime.date.today().month and df['date'][0].day==datetime.date.today().day): …Run Code Online (Sandbox Code Playgroud) 我有一个使用python smtplib发送邮件的程序。我的邮件发送部分工作正常,但是在发送邮件之后,我还需要捕获服务器返回消息。例如,postfix在邮件排队后返回以下消息:
reply: '250 2.0.0 Ok: queued as EB83821273B\r\n'
reply: retcode (250); Msg: 2.0.0 Ok: queued as EB83821273B
data: (250, '2.0.0 Ok: queued as EB83821273B')
Run Code Online (Sandbox Code Playgroud)
我真正感兴趣的是错误代码(250)和队列ID(EB83821273B)。如果设置set_debuglevel(1),则可以打印这些,但是我需要将其捕获到变量中以进行进一步的日志记录和处理。
谢谢并恭祝安康,
拉吉
如您所知,python smtplib具有调试级别.当我将其设置为真正的参数时,它将打印一些发送信息.
问题是,我尝试将调试信息记录到一个文件中,但它们只停留在我的cmd控制台上.如何记录它们?
像这样的信息:
connect: ('192.168.1.101', 25)
connect: (25, '192.168.1.101')
reply: '220 ESMTP on WinWebMail [3.8.1.3] ready. http://www.winwebmail.com\r\n'
reply: retcode (220); Msg: ESMTP on WinWebMail [3.8.1.3] ready. http://www.winw
ebmail.com
connect: ESMTP on WinWebMail [3.8.1.3] ready. http://www.winwebmail.com
send: 'ehlo [169.254.63.67]\r\n'
reply: '250-SIZE\r\n'
reply: '250 AUTH LOGIN\r\n'
reply: retcode (250); Msg: SIZE
AUTH LOGIN
bla bla bla bla........
Run Code Online (Sandbox Code Playgroud) 我已经阅读了几篇文章,但我找不到帮助.
我有一个使用smtplib发送邮件的python脚本.它从命令行调用时有效.
我有#!/usr/bin/python第一行,可以使用/home/pi/ipsender.py和运行它python /home/pi/ipsender.py.
我的crontab是*/1 * * * * /home/pi/ipsender.py,但我自己也尝试*/1 * * * * python /home/pi/ipsender.py和*/1 * * * * /usr/bin/python /home/pi/ipsender.py.
这样做which python,我得到/usr/bin/pyhton和命令行我可以导入和使用的smtplib就好运行蟒蛇.
在/var/log/syslog我得到:
Nov 27 22:57:01 raspberrypi /USR/SBIN/CRON[3764]: (pi) CMD (python /home/pi/ipsender.py)
Nov 27 22:57:01 raspberrypi /USR/SBIN/CRON[3763]: (CRON) info (No MTA installed, discarding output)
Run Code Online (Sandbox Code Playgroud)
我猜测没有MTA ......只是关于Cron没有发送关于它正在做什么的电子邮件,或者不是吗?
我该如何运行这个脚本.
[编辑]
脚本的权限是
-rwxr-xr-x 1 pi pi 551 Nov 27 22:37 ipsender.py
Run Code Online (Sandbox Code Playgroud)
[Edit2]使用来自D Read的提示我得到以下日志 …
我正在开发一个项目,我必须使用Python 3.4中的smtplib和email模块发送电子邮件.
我能够自己创建电子邮件,我可以连接到服务器,但它会返回此异常:
reply: b'235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: b'2.7.0 Accepted'
send: 'QUIT\r\n'
reply: b'221 2.0.0 closing connection s66sm8304113yhp.2 - gsmtp\r\n'
reply: retcode (221); Msg: b'2.0.0 closing connection s66sm8304113yhp.2 - gsmtp'
Traceback (most recent call last):
File "base.py", line 108, in <module>
send(fromaddr, toaddrs, msg)
File "base.py", line 61, in send
server.send_message(fromaddr, toaddrs, msg)
File "/usr/lib/python3.4/smtplib.py", line 829, in send_message
resent = msg.get_all('Resent-Date')
AttributeError: 'str' object has no attribute 'get_all'
Run Code Online (Sandbox Code Playgroud)
代码(直接链接到麻烦的线)可用在这里.奇怪的是,代码实际上在实际发送任何电子邮件正文之前发送了QUIT - 不确定这是否会影响这一点.
有谁知道导致此错误的原因是什么?
编辑原来我的部分问题是我使用的格式不正确.send_message()需要变量的顺序 …