本文为SMTP邮件投递代码调用示例,适用于Python3.6及以上。
钉钉企业邮箱配置
SMTP服务器地址:smtp.em.dingtalk.com
端口:非加密25,SSL加密465
# -*- coding:utf-8 -*- import smtplib import email # import json # import base64 from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # from email.mime.image import MIMEImage # from email.mime.base import MIMEBase # from email.mime.application import MIMEApplication from email.header import Header from email.utils import formataddr # import urllib.request # import ssl # username,通过控制台创建的发信地址 username = 'XXXXXXXX' # password,通过控制台创建的SMTP密码 password = 'XXXXXXXX' # 自定义的回信地址,与控制台设置的无关。邮件推送发信地址不收信,收信人回信时会自动跳转到设置好的回信地址。 replyto = 'XXXXXXXX' # 显示的To收信地址 rcptto = ['address1@example.net', 'address2@example.net'] # 显示的Cc收信地址 rcptcc = ['address3@example.net', 'address4@example.net'] # Bcc收信地址,密送人不会显示在邮件上,但可以收到邮件 rcptbcc = ['address5@example.net', 'address6@example.net'] # 全部收信地址,包含抄送地址,单次发送不能超过300人 receivers = rcptto + rcptcc + rcptbcc # 构建alternative结构 msg = MIMEMultipart('alternative') msg['Subject'] = Header('自定义信件主题') msg['From'] = formataddr(["自定义发信昵称", username]) # 昵称+发信地址(或代发) # list转为字符串 msg['To'] = ",".join(rcptto) msg['Cc'] = ",".join(rcptcc) msg['Reply-to'] = replyto #用于接收回复邮件,需要收信方支持标准协议 msg['Return-Path'] = 'test@example.net' #用于接收退信邮件,需要收信方支持标准协议 msg['Message-id'] = email.utils.make_msgid() msg['Date'] = email.utils.formatdate() # 构建alternative的text/plain部分 # textplain = MIMEText('自定义TEXT纯文本部分', _subtype='plain', _charset='UTF-8') # msg.attach(textplain) # 构建alternative的text/html部分 texthtml = MIMEText('自定义HTML超文本部分', _subtype='html', _charset='UTF-8') msg.attach(texthtml) # # 发送本地附件 # files = [r'C:UsersDownloads est1.jpg', r'C:UsersDownloads est2.jpg'] # for t in files: # filename = t.rsplit('/', 1)[1] # part_attach1 = MIMEApplication(open(t, 'rb').read()) # 打开附件 # part_attach1.add_header('Content-Disposition', 'attachment', filename=filename) # 为附件命名 # msg.attach(part_attach1) # 添加附件 # #发送url附件 # files = [r'https://example.oss-cn-shanghai.aliyuncs.com/xxxxxxxxxxx.png'] # for t in files: # filename=t.rsplit('/', 1)[1] # response = urllib.request.urlopen(t) # part_attach1 = MIMEApplication(response.read()) # 打开附件,非本地文件 # part_attach1.add_header('Content-Disposition', 'attachment', filename=filename) # 为附件命名 # msg.attach(part_attach1) # 添加附件 # 发送邮件 try: # 若需要加密使用SSL,可以这样创建client # client = smtplib.SMTP_SSL('smtp.em.dingtalk.com', 465) # python 3.10/3.11新版本若出现ssl握手失败,请使用下列方式处理: # ctxt = ssl.create_default_context() # ctxt.set_ciphers('DEFAULT') # client = smtplib.SMTP_SSL('smtp.em.dingtalk.com', 465, context=ctxt) # SMTP普通端口为25或80 client = smtplib.SMTP('smtp.em.dingtalk.com', 80) # 开启DEBUG模式 client.set_debuglevel(0) # 发件人和认证地址必须一致 client.login(username, password) client.sendmail(username, receivers, msg.as_string()) # 支持多个收件人,最多300个 client.quit() print('邮件发送成功!') except smtplib.SMTPConnectError as e: print('邮件发送失败,连接失败:', e.smtp_code, e.smtp_error) except smtplib.SMTPAuthenticationError as e: print('邮件发送失败,认证错误:', e.smtp_code, e.smtp_error) except smtplib.SMTPSenderRefused as e: print('邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error) except smtplib.SMTPRecipientsRefused as e: print('邮件发送失败,收件人被拒绝:', e.smtp_code, e.smtp_error) except smtplib.SMTPDataError as e: print('邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error) except smtplib.SMTPException as e: print('邮件发送失败, ', str(e)) except Exception as e: print('邮件发送异常, ', str(e))