使用python发送文本邮件以及带附件的邮件

python版本:3.6.5

因工作需求使用到python来编写脚本发送工作邮件,查了一些网络资料,完成了两个需求(1.发送文本邮件,2,发送带文本和附件的邮件),现记录如下:

需求1:只发送包含文本内容的邮件:

# !/usr/bin/env python
# -*-coding:utf-8 -*-

#需求1:只发送正文内容


import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))


def send_email(info):
    # 发件人地址
    from_addr = 'xxxxxxxxxx@163.com'
    # 邮箱密码
    password = 'xxxxxxxx'
    # 收件人地址,可同时添加多个
    to_addrs = [
        'xxxxxxxxxx@163.com',
        'xxxxxxxxxx@qq.com',
    ]
    # 邮箱服务器地址
    smtp_server = 'smtp.163.com'

    local_time = time.strftime('%Y-%m-%d %H:%M:%S')

    content = f'''
        您好,                
        {info}

        邮件发送时间时间: {local_time} 
    '''
    # 设置邮件信息
    msg = MIMEText(content, 'plain', 'utf-8')

    msg['From'] = _format_addr('发件人名称 <%s>' % from_addr)
    msg['To'] = _format_addr('收件人名称 <%s>' % to_addrs)
    msg['Subject'] = Header('邮件标题', 'utf-8').encode()
    # 发送邮件
    server = smtplib.SMTP_SSL(host=smtp_server, port=25)
    server.login(from_addr, password)
    server.sendmail(from_addr, to_addrs=to_addrs, msg=msg.as_string())

    server.quit()

if __name__ == '__main__':
    info='''
        早上好,吃饭了吗~
        aaa,bbb,ccc,ddd
    '''
    send_email(info)

说明;1.通过python注释(三个单引号)的方式来构造邮件证明,可以优化显示的格式,比如换行,空格等.当然也可以发送一个html的文本,邮件显示格式化会更好.

        2.发送邮件的邮箱需要开通smtp服务,登录密码为开通服务时设定的授权码.

        3.上面这段代码在连接服务器的时候使用了smtplib.SMTP_SSL()方法来进行连接,貌似不同的邮箱链接方式略有不同.亲测如果网易邮箱的话,使用smtplib.connect()也是可以链接并正常发送邮件的.

        4.通过脚本发送的邮件,在接收方那里可能显示为垃圾邮件,需要设置白名单,移出垃圾箱.


需求2:发送包括正文内容和文本附件的邮件

# !/usr/bin/env python
# -*-coding:utf-8 -*-

#需求2:发送邮件正文加附件

import time
import smtplib

from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))


def send_email(info,file_paths):
    # 发件人地址
    from_addr = 'xxxxxxxxxx@163.com'
    # 邮箱密码
    password = 'xxxxxxxx'
    # 收件人地址,可同时添加多个
    to_addrs = [
        'xxxxxxxxxx@163.com',
        'xxxxxxxxxx@qq.com',
    ]
    # 邮箱服务器地址
    smtp_server = 'smtp.163.com'

    local_time = time.strftime('%Y-%m-%d %H:%M:%S')

    content = f'''
        您好,                
        {info}

        邮件发送时间时间: {local_time} 
    '''
    # 设置邮件信息
    msg = MIMEMultipart()
    body = MIMEText(content.encode(), 'plain', 'utf-8')
    msg.attach(body)


    # 构造附件
    for file_name in file_paths:
        attachment = MIMEBase('application', 'octet-stream')#参数的意义未深究
        attachment.set_payload(open(file_name, 'rb').read())
        encoders.encode_base64(attachment)
        attachment.add_header('Content-Disposition','attachment', filename=file_name)# 前2个参数意义未深究
        msg.attach(attachment)

    msg['From'] = _format_addr('发件人名称 <%s>' % from_addr)
    msg['To'] = _format_addr('收件人名称 <%s>' % to_addrs)
    msg['Subject'] = Header('邮件标题', 'utf-8').encode()

    # 发送邮件
    server = smtplib.SMTP_SSL(host=smtp_server, port=465)
    server.login(from_addr, password)
    server.sendmail(from_addr, to_addrs=to_addrs, msg=msg.as_string())

    server.quit()

if __name__ == '__main__':
    info='''
        早上好,吃饭了吗~
        aaa,bbb,ccc,ddd
    '''
    file_paths=['a.txt','b.txt','c.txt']
    send_email(info,file_paths)

说明;1.这个脚本可以实现需求的功能,但是对于使用的两个方法MIMEBase()方法和add_header()方法中的参数是网上查来的,未进行深入研究,目前文本内容和文本附件是可以正常发送的,如果要发送图片内容和非文本附件,可能需要对这两个方法进行修改.

        2.在同时发送文本内容和附件时,需要用msg.attch()方法来分别添加文本内容和多个附件,这与只发送文本邮件有区别

        3.msg的构造方法也变为MIMEMultipart()方法.



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Python的smtplib库来发送电子邮件,并使用MIME(多用途互联网邮件扩展)来包含视频文件作为附件。 下面是一个示例代码,展示如何使用Python发送包含视频附件的电子邮件: ```python import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders def send_email(sender_email, sender_password, receiver_email, subject, message, file_path): # 创建一个MIMEMultipart对象 msg = MIMEMultipart() # 设置发件人、收件人和主题 msg['From'] = sender_email msg['To'] = receiver_email msg['Subject'] = subject # 添加文本内容 msg.attach(MIMEText(message, 'plain')) # 读取视频文件并添加为附件 attachment = open(file_path, 'rb') part = MIMEBase('application', 'octet-stream') part.set_payload((attachment).read()) encoders.encode_base64(part) part.add_header('Content-Disposition', "attachment; filename= %s" % file_path.split("/")[-1]) msg.attach(part) # 使用SMTP服务器发送邮件 with smtplib.SMTP('smtp.gmail.com', 587) as server: server.starttls() server.login(sender_email, sender_password) server.sendmail(sender_email, receiver_email, msg.as_string()) # 填写您的发件人和收件人信息 sender_email = "your_email@gmail.com" sender_password = "your_password" receiver_email = "recipient_email@example.com" subject = "邮件主题" message = "邮件正文" file_path = "path_to_video_file.mp4" # 发送邮件 send_email(sender_email, sender_password, receiver_email, subject, message, file_path) ``` 请确保您已经安装了smtplib库,如果没有安装,可以使用以下命令进行安装: ``` pip install secure-smtplib ``` 您需要将示例代码中的"your_email@gmail.com"和"your_password"替换为您自己的发件人电子邮件和密码。同时,将"recipient_email@example.com"替换为收件人的电子邮件地址,"邮件主题"替换为您想要的主题,"邮件正文"替换为您想要的内容,并将"path_to_video_file.mp4"替换为实际视频文件的路径。 这样,使用Python发送包含视频附件的电子邮件就完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值