现代社会中,自动发送邮件是一项非常有用的任务,无论是用于自动化报告的发送,还是用于通知、提醒等用途。Python提供了强大的库来实现自动发送邮件的功能,本文将详细介绍如何使用Python发送邮件,包括各种示例代码,帮助大家更好地理解和应用这一功能。
在开始之前,确保已经完成以下准备工作:
Python的smtplib库是用于发送电子邮件的标准库之一。
以下是一个基本示例,演示如何使用smtplib库发送简单的文本邮件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 发件人和收件人信息
sender_email = "你的邮箱@gmail.com"
receiver_email = "收件人邮箱@example.com"
password = "你的邮箱密码"
# 创建邮件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "自动发送邮件示例"
# 添加邮件正文
message.attach(MIMEText("这是一封自动发送的邮件。", "plain"))
# 连接到SMTP服务器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("邮件已发送成功!")
在这个示例中,首先导入必要的模块,然后设置发件人、收件人和邮件主题。接下来,创建邮件正文,并使用smtplib库连接到SMTP服务器,然后登录并发送邮件。
如果需要发送带附件的邮件,可以使用MIME(Multipurpose Internet Mail Extensions)来创建邮件。
以下是一个示例,演示如何发送带附件的邮件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
# 发件人和收件人信息
sender_email = "你的邮箱@gmail.com"
receiver_email = "收件人邮箱@example.com"
password = "你的邮箱密码"
# 创建邮件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "带附件的邮件示例"
# 添加邮件正文
message.attach(MIMEText("这是一封带附件的邮件。", "plain"))
# 添加附件
with open("附件文件.txt", "rb") as attachment:
part = MIMEApplication(attachment.read(), Name="附件文件.txt")
part["Content-Disposition"] = f'attachment; filename="附件文件.txt"'
message.attach(part)
# 连接到SMTP服务器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("带附件的邮件已发送成功!")
在这个示例中,使用MIMEApplication来添加附件,并设置附件的文件名。然后,将附件添加到邮件中,发送邮件的过程与前一个示例相似。
除了smtplib库外,还有一些第三方库可以帮助你更轻松地发送邮件,例如yagmail和smtplib-cli。
以下是一个使用yagmail库的示例:
import yagmail
# 发件人和收件人信息
sender_email = "你的邮箱@gmail.com"
receiver_email = "收件人邮箱@example.com"
password = "你的邮箱密码"
# 创建yagmail客户端
yag = yagmail.SMTP(sender_email, password)
# 发送邮件
subject = "使用yagmail发送邮件示例"
contents = ["这是一封使用yagmail发送的邮件。"]
yag.send(receiver_email, subject, contents)
print("邮件已发送成功!")
在这个示例中,首先安装yagmail库(使用pip install yagmail),然后创建yagmail客户端并使用它发送邮件。这个库提供了更简单的接口来发送邮件。
除了发送普通文本邮件,还可以发送HTML格式的邮件,以更好地格式化内容。
以下是一个示例,演示如何发送HTML邮件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 发件人和收件人信息
sender_email = "你的邮箱@gmail.com"
receiver_email = "收件人邮箱@example.com"
password = "你的邮箱密码"
# 创建邮件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "HTML格式的邮件示例"
# 添加HTML邮件内容
html_content = """
<!DOCTYPE html>
<html>
<head>
<title>HTML邮件示例</title>
</head>
<body>
<h1>这是一封HTML格式的邮件</h1>
<p>你可以在邮件中使用HTML标记来格式化内容。</p>
</body>
</html>
"""
message.attach(MIMEText(html_content, "html"))
# 连接到SMTP服务器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("HTML格式的邮件已发送成功!")
在这个示例中,创建了一个HTML邮件内容的字符串,并将其添加到邮件中。这样,收件人将以HTML格式看到邮件内容。
如果需要在邮件中嵌入图片,也可以很容易地实现。
以下是一个示例,演示如何发送带图片的邮件:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
# 发件人和收件人信息
sender_email = "你的邮箱@gmail.com"
receiver_email = "收件人邮箱@example.com"
password = "你的邮箱密码"
# 创建邮件
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "带图片的邮件示例"
# 添加文本内容
message.attach(MIMEText("这是一封带图片的邮件示例。", "plain"))
# 添加图片
with open("image.png", "rb") as image_file:
image = MIMEImage(image_file.read(), name="image.png")
message.attach(image)
# 连接到SMTP服务器
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("带图片的邮件已发送成功!")
在这个示例中,通过MIMEImage模块添加了一张图片,并将其嵌入到邮件中。这样,收件人将能够在邮件中看到图片。
除了smtplib库外,还可以使用SMTP库来发送邮件。
以下是一个使用SMTP库的示例:
import smtplib
# 发件人和收件人信息
sender_email = "你的邮箱@gmail.com"
receiver_email = "收件人邮箱@example.com"
password = "你的邮箱密码"
# 创建SMTP连接
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
# 登录到SMTP服务器
server.login(sender_email, password)
# 创建邮件内容
subject = "SMTP库发送邮件示例"
body = "这是一封使用SMTP库发送的邮件。"
message = f"Subject: {subject}\n\n{body}"
# 发送邮件
server.sendmail(sender_email, receiver_email, message)
# 关闭SMTP连接
server.quit()
print("SMTP库发送的邮件已发送成功!")
在这个示例中,首先创建了SMTP连接,然后登录到SMTP服务器并发送邮件。这种方法也可以用来发送邮件。
希望通过本文的详细教程和示例代码,现在已经学会了如何使用Python自动发送邮件,包括发送普通文本邮件、HTML邮件、带附件的邮件和带图片的邮件。自动发送邮件是一个非常有用的任务,可以帮助大家自动化通知、报告和通信。无论你是初学者还是有经验的开发者,都可以使用这些技巧来实现自动发送邮件的需求。
源 | 数据分析与统计学之美
这是一个很好的Python自动化的案例。对于小公司,采用手动方式一个个发送邮件还是可以的。如果一个上百号,上千号,或者更大规模的公司,我们再一个个发送工资条邮件,就太浪费时间了。鉴于此,我写了一个这样的程序,实现Python自动化群发工资条的功能。
原始数据源如下:
最终效果如下:
看到这里,你肯定也觉得很好玩儿吧?那么这样一个自动化程序,应该怎么做呢?接着往下看。
其实这样一个代码,总结下来,就只有如下5步:
① 导入相关模块;
② 读取Excel表格;
③ 登录邮箱;
④ 准备要发送的邮件正文;
⑤ 发送邮件;
from openpyxl import load_workbook # 用于操作Excel的模块
import yagmail # 用于存储邮箱地址和密码的模块
import keyring # 用于记录你邮箱地址和密码的模块
from datetime import * # 用于获取当前系统时间的模块
# 加载Excel文件
wb = load_workbook("群发工资条.xlsx",data_only=True)
sheet = wb.active
print(sheet)
-------------------------------------------------------
for row in sheet:
row_text = ""
for cell in row:
if cell.column == "B":
continue
row_text += f"{cell.value},"
print(row_text)
------------------------------------------------------
print("年:", date.today.year)
print("月:", date.today.month)
print(f"{date.today.year}-{date.today.month}月")
结果如下:
yagmail.register("1127421544@qq.com","flmyucvntuvbjbcb")
pwd = keyring.get_password("yagmail","1127421544@qq.com")
yag = yagmail.SMTP(user="1127421544@qq.com",host="smtp.qq.com",password=pwd)
需要注意的是:第一行代码是用于存储你的邮件地址和密码。第二行代码使用keyring是为了记录你的邮件地址和密码。第三行代码直接登录邮箱。
关于Python怎么发送邮件,我之前写了一篇文章,进行了详细的介绍,下方是这篇文章的链接,大家可以参考。
Python发邮件:http://suo.im/60ylZ1
4)准备要发送的正文
由于发送的正文里面,需要我们发送一个带表格的邮件,这就有必要我们了解一点前端知识。因此,我在最后面花一个章节为大家讲解。
yag.send(f"{email}",f"数据分析与统计学之美有限公司{date.today.year}-{date.today.month}月工资情况",contents)
上述代码共有3个参数:第一个参数是收件人的邮箱;第二个参数是邮件的标题;第三个参数是发送的内容。
会用Python发送邮件的人都知道,邮件正文内容可以写html代码。你可能觉得自己啥也不会,但是不用担心,我们不需要学习太高深的前端代码,做过爬虫的人耳濡目染,都能够看懂一些。
我们可以直接用Pycharm创建一个新的html文件,里面会显示初始的前端代码,我们进行简单的添加,就可以获得一个表格啦!
最终在浏览器中显示效果如下:
从上图中根本看不出这是一个表格,那是因为我们没有为它设置一个样式,下面要做的就是为表格设置样式。
最终在浏览器中显示效果如下:
从上图可以看出,整个前端代码就是用一些列的标签组成,同时标签都是成对出现的。因此,在Python中写前端代码时,只需要在对应位置添加对应的标签即可。
for row in sheet:
row_text = "<tr>"
for cell in row:
if cell.column == "B":
continue
row_text += f"<td>{cell.value}</td>"
row_text += "</tr>"
print("\n")
print(row_text)
结果如下:
为了文章的完整性,我在文章最后放上我的代码。但是限于文章篇幅,最后我只粘贴一张图片,详细代码,大家可以去文末获取。
avaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,不再需要考虑底层的通讯细节如:Socket而是关注在逻辑层面。JavaMail可以发送各种复杂MIME格式的邮件内容,注意JavaMail仅支持JDK4及以上版本。虽然JavaMail是JDK的API但它并没有直接加入JDK中,所以我们需要另外添加依赖,下面我们开始讲解本章的内容。
将Java提供的JavaMail类库与SpringBoot项目进行整合,并且简单封装下JavaMail类库。
本章项目无关Web相关内容,所以创建项目时选择Jar形式创建,并且不需要预先导入依赖。项目结构如下图1所示:
图1
可以看到上图1内容,多余的依赖并没有添加,如果你选择的是War项目也没有关系名,那好,我们接下来把我们的主角JavaMail请出来吧,把对应的依赖添加到pom.xml配置文件内。如下图2所示:
图2
依赖我们已经导入成功了,接下来我们开始编写JavaMail的封装,我这里简单的对JavaMail做出封装,如果您需要更完美的封装,请对我的代码做出修改即可,先来编写一个MailEntity类来保存发送邮件时需要的参数字段,如下图3所示:
图3
我们的MailEntity包含了上图3的字段内容,都是一些必填选项,下面我们来创建一个MailSender也就是邮件发送者实体,主要作用就是用来配置发送邮件参数以及执行发送邮件,代码如下图4、5、6、7、8所示:
图4
图5
图6
图7
图8
下次编写文章使用MarkDown方式来写,类过长贴起来图挺费劲。上面可以看到我使用到了MailContentTypeEnum以及PropertiesUtil工具类。
MailContentTypeEnum
这是一个我自定义的枚举类型,枚举类型包含了邮件内容的类型,目前我仅仅添加了两种,一种是html另外一种则是text形式,具体代码如下图9所示:
图9
PropertiesUtil
PropertiesUtil是用于读取*.properties配置文件的工具类,使用JavaMail需要配置SMTP以及用户名、密码等也就是MailEntity内的字段,那么我们在/resource目录下创建一个名字叫mail.properties的配置文件,里面存放我们定义的邮件发送参数配置,这样方便修改,我分别贴出PropertiesUtil、mail.properties代码内容,如下图10、图11所示:
图10
图11
我使用的QQ邮箱地址作为测试,如果你需要使用你的QQ地址作为测试,请先到QQ邮箱开启POP3/SMTP服务,开启步骤如下。
开启POP3/SMTP
第一步:进入邮箱点击“设置”,如下图12所示:
图12
第二步:点击“账户”后往下拉找到POP3/IMAP/SMTP...,如下图13所示:
图13
我的POP3以及SMTP以及开启了所以这里显示的状态是已开启,如果您第一次使用QQ邮箱的SMTP服务,请点击“开启”并且按照提示步骤完成获取“授权码”即可,授权码就是发送邮件参数的smtp.pwd属性。
我们创建一个TestMail类来作为测试入口,因为我们的项目是jar形式,所以我们直接新建一个main方法直接调用发送邮件就可以了,如下图14所示测试代码:
图14
我是向我的钉钉邮箱发送了一条文本类型的测试邮件,发送效果图如下图15所示:
图15
可以看到我们的邮件收到了,证明我们已经完成了邮件发送的功能了,但是你在发送中配置mail.properties文件时配置昵称的时候最有可能出现的问题就是乱码,那么该问题如何解决呢?
昵称乱码问题解决
第一步:修改InteiiJ IDEA工具的properties文件的编码,点击File->Setting->Editor->File Encodings将下面的Default encoding设置为UTF-8,如下图16所示:
图16
那么我们的mail.properties内使用ASCII编码进行配置昵称就可以了,具体中文如何转换ASCII,请大家访问tool.oschina.net/encode在线转换即可。修改完成后再次测试发送邮件,你就会发现乱码问题解决了。
上述内容就是本章的所有讲解,本章主要讲解了在SpringBoot项目内是如何使用JavaMail来进行发送简单邮件,简单封装了下MailSender类以及对象实体MailEntity,如果需要发送HTML内容的邮件修改contentType(MailContentTypeEnum.HTML)然后content("html代码")即可。
本号已开设如下二十大专题,欢迎关注,查看相关专题!
*请认真填写需求信息,我们会在24小时内与您取得联系。