Python用SMTP自动发送邮件email

发送邮件是一个常见的需求,一般会采用SMTP代理的形式,进行邮件自动发送

在发送邮件时,主要有如下准备工作

        ① 发件人、收件人、抄送人

        ② 发件人邮箱授权码

        ③ 邮件主题

        ④ 邮件正文

        ⑤ 附件

发送邮件上,由浅到深,可以大致分为以下5种格式

        ① 只有正文;

        ② 正文+html+超链接;

        ③ 正文+正文图片;

        ④ 正文+附件;

        ⑤ 正文+html+可跳转url+正文图片+附件(这里会规范写一下)

其中,授权码的获取这里需要各自操作一下,示例如:QQ邮箱的授权码,需要在电脑上登录自己的QQ邮箱,在“设置” - “账户” - “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”中,开启相关服务,获取授权码

如图所示操作,点击生成授权码,发送短信即可获取到SMTP邮件代理授权码,将发送人邮箱授权码复制下来以便后面SMTP代理使用


 

接下来用QQ邮箱,示例自动发送以上类型的邮件(注意:带邮件和不带邮件中,实例不一样)

1、发送只有文本正文的邮件

# 发送只有文本正文的邮件
import smtplib
from email.mime.text import MIMEText

# 配置邮件信息
email = {
        'from': '111@qq.com',
        'to': ['222@qq.com'],
        'cc': ['333@qq.com'],
        'subject': '自动发送邮件',
        'license': '这里是你们的授权码',
        'text': '示例:发送只含有文本的邮件' ,
    }

# 创建一个文本实例
# 正文
msg = MIMEText(email['text'], 'plain', 'utf-8')
# 发件人
msg['From'] = email['from']
# 收件人
msg['To'] = ','.join(email['to'])
# 抄送
msg['Cc'] = ','.join(email['cc'])
# 邮件标题
msg['Subject'] = email['subject']

# 登录邮箱服务器
email_server = smtplib.SMTP_SSL('smtp.qq.com', 465)
email_server.login(email['from'], email['license'])

# 发送邮件
try:
    email_server.sendmail(email['from'], email['to'], msg.as_string())
    print('发送成功')
except:
    print('Error:发送失败')

2、发送包含正文、超链接的邮件

# 发送包含正文、可跳转URL链接的邮件
import smtplib
from email.mime.text import MIMEText

# 配置邮件信息
email = {
        'from': '111@qq.com',
        'to': ['222@qq.com'],
        'cc': ['333@qq.com'],
        'subject': '自动发送邮件',
        'license': '这里是你们的授权码',
        'text': '示例:发送只含有文本的邮件' ,
        'html': '<p>欢迎进入我的博客:&nbsp&nbsp<a href="https://blog.csdn.net/wang1qqqq">点击进入</a></p>',
    }

# 创建一个文本实例
# 添加文本(可有可无)
msg = MIMEText(email['text'], 'plain', 'utf-8')
# 添加带url的html文本链接
msg_html = MIMEText(email['html'], 'html', 'utf-8')
msg.attach(msg_html)
# 发件人
msg['From'] = email['from']
# 收件人
msg['To'] = ','.join(email['to'])
# 抄送
msg['Cc'] = ','.join(email['cc'])
# 邮件标题
msg['Subject'] = email['subject']

# 登录邮箱服务器
email_server = smtplib.SMTP_SSL('smtp.qq.com', 465)
email_server.login(email['from'], email['license'])

# 发送邮件
try:
    email_server.sendmail(email['from'], email['to'], msg.as_string())
    print('发送成功')
except:
    print('Error:发送失败')

3、发送包含正文、图片的邮件

# 发送包含正文、图片的邮件
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText

# 配置邮件信息
email = {
        'from': '111@qq.com',
        'to': ['222@qq.com'],
        'cc': ['333@qq.com'],
        'subject': '自动发送邮件',
        'license': '这里是你们的授权码',
        'text': '示例:发送只含有文本的邮件' ,
    }

# 创建一个文本实例
# 添加文本(可有可无)
msg = MIMEText(email['text'], 'plain', 'utf-8')
# 插入图片html,命名图片id为i_image
img_html = '<p><img src="cid:i_image"></p>'
msg.attach(MIMEText(img_html, 'html', 'utf-8'))
# 打开图片
img_open = open(i_attach, 'rb')
img = MIMEImage(img_open.read())
# 插入图片
img.add_header('Content-ID', '<i_image>')
msg.attach(img)
# 关闭图片
img_open.close()


# 发件人
msg['From'] = email['from']
# 收件人
msg['To'] = ','.join(email['to'])
# 抄送
msg['Cc'] = ','.join(email['cc'])
# 邮件标题
msg['Subject'] = email['subject']

# 登录邮箱服务器
email_server = smtplib.SMTP_SSL('smtp.qq.com', 465)
email_server.login(email['from'], email['license'])

# 发送邮件
try:
    email_server.sendmail(email['from'], email['to'], msg.as_string())
    print('发送成功')
except:
    print('Error:发送失败')

4、发送包含正文、附件的邮件

# 发送包含正文、附件的邮件
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText

# 配置邮件信息
email = {
        'from': '111@qq.com',
        'to': ['222@qq.com'],
        'cc': ['333@qq.com'],
        'subject': '自动发送邮件',
        'license': 'autmmyrqmqpcbace',
        'text': '示例:发送只含有文本的邮件' ,
    }

# 创建一个带附件的示例
msg = MIMEMultipart()
# 打开图片
img_open = open(i_attach, 'rb')
# 设置图片信息
att = MIMEText(img_open.read(), 'base64', 'utf-8')
att['Content-Type'] = 'application/octet-stream'
# 添加到附件
att.add_header('Content-Disposition', 'attachment', filename='疫情大数据.png')
msg.attach(att)
# 关闭图片
img_open.close()


# 发件人
msg['From'] = email['from']
# 收件人
msg['To'] = ','.join(email['to'])
# 抄送
msg['Cc'] = ','.join(email['cc'])
# 邮件标题
msg['Subject'] = email['subject']

# 登录邮箱服务器
email_server = smtplib.SMTP_SSL('smtp.qq.com', 465)
email_server.login(email['from'], email['license'])

# 发送邮件
try:
    email_server.sendmail(email['from'], email['to'], msg.as_string())
    print('发送成功')
except:
    print('Error:发送失败')

5、发送包含正文、html、超链接、正文图片、附件的邮件

# 发送包含正文、html、可点击url、正文图片、附件的邮件
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


def email_header(email):
    # 设置邮件信息
    # 无附件邮件使用:msg = MIMEText(email['text'], 'plain', 'utf-8')
    # MIMEMultipart:创建一个带附件的实例
    msg = MIMEMultipart()
    # 可以自定义发件人抬头(不理想,QQ邮箱列表上看不到发件人名称):Header('发送机器人', 'utf-8')
    msg['From'] = email['from']
    msg['To'] = ','.join(email['to'])
    msg['Cc'] = ','.join(email['cc'])
    msg['Subject'] = email['subject']
    return msg


def email_body(email, msg):
    # 添加文本(如果有html,文本会被覆盖)
    # msg.attach(MIMEText(email['text'], 'plain', 'utf-8'))
    # 添加html
    msg.attach(MIMEText(email['text'], 'html', 'utf-8'))
    msg.attach(MIMEText(email['html'], 'html', 'utf-8'))

    for i_attach in email['attach']:
        # 添加正文图片(图片需要在html的情况下使用)
        img_html = '<p><img src="cid:i_image"></p>'
        msg.attach(MIMEText(img_html, 'html', 'utf-8'))
        img_open = open(i_attach, 'rb')
        img = MIMEImage(img_open.read())
        img.add_header('Content-ID', '<i_image>')
        msg.attach(img)
        # 关闭图片
        img_open.close()


def email_att(email, msg):
    # 添加附件
    for i_attach in email['attach']:
        img_open = open(i_attach, 'rb')
        att = MIMEText(img_open.read(), 'base64', 'utf-8')
        att['Content-Type'] = 'application/octet-stream'
        att.add_header('Content-Disposition', 'attachment', filename='中国疫情大数据.png')
        msg.attach(att)

        # 关闭图片
        img_open.close()


def email_login(email):
    # 登录邮箱服务器
    email_server = smtplib.SMTP_SSL('smtp.qq.com', 465)
    email_server.login(email['from'], email['license'])
    return email_server


def email_send(email, email_server):
    # 发送邮件
    try:
        email_server.sendmail(email['from'], email['to'], msg.as_string())
        print('发送成功')
    except:
        print('Error:发送失败')

if __name__ == '__main__':
    # 配置附件路径
    img_path = 'auto_img/'
    # 定义发送邮件信息
    email = {
        'from': '111@qq.com',
        'to': ['222@qq.com'],
        'cc': ['333@qq.com'],
        'subject': '每日疫情数据推送',
        'license': '这里是你们的授权码',
        'text': '每日疫情数据推送:' + str(datetime.datetime.now().strftime("%Y-%m-%d")),
        'html': '<p>欢迎进入我的博客:&nbsp&nbsp<a href="https://blog.csdn.net/wang1qqqq">点击进入</a></p>',
        'attach': [img_path + '中国疫情大数据.png']
    }
    # 配置收件人、发件人、抄送人、标题
    msg = email_header(email)
    # 配置正文内容
    email_body(email, msg)
    # 配置附件
    email_att(email, msg)
    # 登录邮件服务器
    email_server = email_login(email)
    # 发送邮件
    email_send(email, email_server)

如上,就是自动发送邮件的示范,可以根据自身情况,选择发送带正文、html、超链接、正文图片、附件的邮件。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用selenium结合email模块实现自动发送邮件的功能。以下是一个简单的示例代码: ```python from selenium import webdriver import time import smtplib from email.mime.text import MIMEText from email.header import Header # 邮件发送者和接收者的信息 sender = 'sender@example.com' receiver = 'receiver@example.com' password = 'your_password' # 构建邮件内容 message = MIMEText('这是一封自动发送邮件', 'plain', 'utf-8') message['From'] = Header(sender, 'utf-8') message['To'] = Header(receiver, 'utf-8') message['Subject'] = Header('自动发送邮件', 'utf-8') # 使用selenium完成登录操作 browser = webdriver.Chrome() browser.get('https://mail.example.com') browser.find_element_by_name('username').send_keys(sender) browser.find_element_by_name('password').send_keys(password) browser.find_element_by_id('login_button').click() time.sleep(1) # 发送邮件 browser.find_element_by_id('compose_button').click() time.sleep(1) browser.find_element_by_name('to').send_keys(receiver) browser.find_element_by_name('subjectbox').send_keys('自动发送邮件') browser.find_element_by_xpath('//div[text()="发送"]').click() time.sleep(1) # 关闭浏览器 browser.quit() # 发送邮件 smtp_server = 'smtp.example.com' smtp_port = 25 smtp_sender = smtplib.SMTP(smtp_server, smtp_port) smtp_sender.login(sender, password) smtp_sender.sendmail(sender, [receiver], message.as_string()) smtp_sender.quit() ``` 需要注意的是,以上示例代码只是一个简单的示例,实际应用中还需要根据具体情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值