这段代码工作,并向我发送电子邮件就好:

import smtplib
#SERVER = "localhost"

FROM = 'monty@python.com'

TO = ["jon@mycompany.com"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP('myserver')
server.sendmail(FROM, TO, message)
server.quit()

然而,如果我试图将它包装在这样一个函数中:

def sendMail(FROM,TO,SUBJECT,TEXT,SERVER):
    import smtplib
    """this is some test documentation in the function"""
    message = """\
        From: %s
        To: %s
        Subject: %s
        %s
        """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    # Send the mail
    server = smtplib.SMTP(SERVER)
    server.sendmail(FROM, TO, message)
    server.quit()

我得到以下错误:

 Traceback (most recent call last):
  File "C:/Python31/mailtest1.py", line 8, in <module>
    sendmail.sendMail(sender,recipients,subject,body,server)
  File "C:/Python31\sendmail.py", line 13, in sendMail
    server.sendmail(FROM, TO, message)
  File "C:\Python31\lib\smtplib.py", line 720, in sendmail
    self.rset()
  File "C:\Python31\lib\smtplib.py", line 444, in rset
    return self.docmd("rset")
  File "C:\Python31\lib\smtplib.py", line 368, in docmd
    return self.getreply()
  File "C:\Python31\lib\smtplib.py", line 345, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed

有人能告诉我为什么吗?


当前回答

只是为了补充答案,以便您的邮件传递系统可以扩展。

我建议有一个配置文件(可以是.json, .yml, .ini等),包含发件人的电子邮件配置,密码和收件人。

通过这种方式,您可以根据需要创建不同的可定制项目。

下面是一个包含3个文件,config, functions和main的小示例。纯文本邮件。

config_email.ini

[email_1]
sender = test@test.com
password = XXXXXXXXXXX
recipients= ["email_2@test.com", "email_2@test.com"]

[email_2]
sender = test_2@test.com
password = XXXXXXXXXXX
recipients= ["email_2@test.com", "email_2@test.com", "email_3@test.com"]

这些项将从main.py调用,它将返回它们各自的值。

函数functions_email.py文件:

import smtplib,configparser,json
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def get_credentials(item):
    parse = configparser.ConfigParser()
    parse.read('config_email.ini')
    sender = parse[item]['sender ']
    password = parse[item]['password']
    recipients= json.loads(parse[item]['recipients'])
    return sender,password,recipients

def get_msg(sender,recipients,subject,mail_body):
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = sender 
    msg['To'] = ', '.join(recipients)       
    text = """\
    """+mail_body+""" """
    part1 = MIMEText(text, "plain")
    msg.attach(part1)
    return msg

def send_email(msg,sender,password,recipients):
    s = smtplib.SMTP('smtp.test.com')
    s.login(sender,password)
    s.sendmail(sender, recipients, msg.as_string())
    s.quit()    

文件main.py:

from functions_email import *

sender,password,recipients = get_credenciales('email_2')
subject= 'text to subject'
mail_body = 'body....................'
msg = get_msg(sender,recipients ,subject,mail_body)    
send_email(msg,sender,password,recipients)

最好的问候!

其他回答

import smtplib

s = smtplib.SMTP(your smtp server, smtp port) #SMTP session

message = "Hii!!!"

s.sendmail("sender", "Receiver", message) # sending the mail

s.quit() # terminating the session

使用gmail的另一个实现让我们说:

import smtplib

def send_email(email_address: str, subject: str, body: str):
"""
send_email sends an email to the email address specified in the
argument.

Parameters
----------
email_address: email address of the recipient
subject: subject of the email
body: body of the email
"""

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("email_address", "password")
server.sendmail("email_address", email_address,
                "Subject: {}\n\n{}".format(subject, body))
server.quit()

我对发送电子邮件的包选项不满意,我决定制作并开源我自己的电子邮件发送器。它易于使用,并支持高级用例。

如何安装:

pip install redmail

用法:

from redmail import EmailSender
email = EmailSender(
    host="<SMTP HOST ADDRESS>",
    port=<PORT NUMBER>,
)

email.send(
    sender="me@example.com",
    receivers=["you@example.com"],
    subject="An example email",
    text="Hi, this is text body.",
    html="<h1>Hi,</h1><p>this is HTML body</p>"
)

如果您的服务器需要用户和密码,只需将user_name和密码传递给EmailSender。

我在send方法中包含了很多特性:

包含附件 将图像直接包含到HTML主体中 金贾的模板 漂亮的HTML表格开箱即用

文档: https://red-mail.readthedocs.io/en/latest/

源代码:https://github.com/Miksus/red-mail

它可能会在你的信息中添加标签。在你把它传递给sendMail之前打印出消息。

值得注意的是,SMTP模块支持上下文管理器,因此不需要手动调用quit(),这将确保即使出现异常也始终调用它。

    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
        server.ehlo()
        server.login(user, password)
        server.sendmail(from, to, body)