零基础学编程035:群发邮件并不难

我是GTD的重度用户,GTD中讲究将所有事情先收集起来再说,所以收集操作越快越好,这样才不至于把手边的工作打断。很多老牌的GTD工具软件支持发邮件实现快速收集,比如OmniFocus,所以我的Windows桌面上放着一个script脚本,用于把待办事项一键发送到我的OmniFocus服务器,它会自动同步到我的手机上的OmniFocus,省去了我在手机上繁重的手指录入操作。

永远不要学编程,而是用编程,来和我一起探索如何用Python发邮件吧。

第一步:搜索大法

运用《零基础都需要哪些基础》里提到的第一条技巧:谷歌搜索。我以前学过收发邮件的基本原理,第一组关键词就用python send email,打开VPN和谷歌,看看搜索的结果。

第二步:官方文档

搜索的第一条结果就指向python的官方类库参考手册,以后如果知道某个模块包packages的名字后,这个网站 https://docs.python.org/3 是首选打开的,注意里面的3表示Python 3版本,换成2就是Python 2的帮助手册。

打开搜索的第一个网页,第一段样例代码:

# Import smtplib for the actual sending function
import smtplib
# Import the email modules we'll need
from email.message import EmailMessage

# Open the plain text file whose name is in textfile for reading.
with open(textfile) as fp:
    # Create a text/plain message
    msg = EmailMessage()
    msg.set_content(fp.read())

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

读懂这段例子代码就需要用到以前学过的知识了,这段例子代码中把一个文本文件中的内容作为邮件正文发出去。我们稍微改一下:

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg.set_content("这是申龙斌发出的一封测试邮件")

msg['Subject'] = '邮件标题:零基础学编程'
msg['From'] = 'shenlongbin@qq.com'  #请换成你的邮箱
msg['To'] = 'slb-omnifocus@sync.omnigroup.com' #请换成你的邮箱

s = smtplib.SMTP('smtp.qq.com') #请查询你的邮箱服务商的SMTP域名
s.send_message(msg)
s.quit()

在Python中发邮件还是非常简单的,需要用到2个模块包,即email和smtplib。上面代码中的From和To分别对应着发送邮箱和接收邮箱的地址,请换成你自己的邮箱试试,而SMTP就需要补充一点邮件收发的基础知识了。

第三步:设置SMTP

打开维基百科或者百度百科,搜索SMTP。

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。

详细的原理对于初学者来说比较难懂,但要明白一个SMTP Server概念,你要配置这个发送邮件服务器,通过它你就可以顺利地发出邮件了。你使用谁提供的服务,服务商会给你该服务器的域名,例如:QQ邮箱的发送服务器就是smtp.qq.com。

如果公司有独立的邮件服务器,系统管理员肯定会告诉你这个邮件服务器的地址。

好了,上面代码中的from,to,smtp server这几个关键信息都填好了,运行代码。

第四步:邮箱需要认证

如果你没有收到错误信息,那么就去打开邮箱查收一下,看看邮件是否已经到达。希望你能够一次运行代码成功,但我的环境并不顺利,出现了如下错误:

raise SMTPSenderRefused(code, resp, from_addr) smtplib.SMTPSenderRefused: (530, b'5.7.1 Client was not authenticated', 'shenlongbin@my-mail-server.com')

最早的邮件服务器支持任何人发送邮件,但随着垃圾邮件的泛滥,绝大多数邮件服务器都需要通过用户名和密码的认证后才能发送邮件,上面的出错信息表明我与邮件服务器的连接没有通过认证。

再次利用谷歌搜索,加个关键字authentication:

第二个搜索结果来自于著名的stackoverflow网站,里面的s.login()让人眼前一亮,马上打开该网页,原来需要在send_message()之前增加一行代码:

s.login('shenlongbin', 'Password') 

再测试运行一次,顺利通过,我可以用Python向我的OmniFocus发送邮件了!我用这个功能经常把大段的文字发送到iPhone手机上,省去了我在手机上打字的痛苦。

当然上面只是最简单的示例,其它功能还需要额外的代码,比如:

  • 发送文件附件attachments
  • 接收邮件:这个与发送邮件是两个不同的服务

小结:

  • 学会搜索,多试试不同的关键字
  • python的官方文档是第一手参考资料,记住网址:https://docs.python.org/
  • smtp是简单邮件传输协议的缩写
  • 邮件服务器的主机地址是必填项
  • from是发送邮箱的地址
  • to是接收邮箱的地址
  • email和smtplib是发送邮件的两个模块包
  • stackoverflow是一个查找编程问题的重要网站,里面回答的质量比国内的csdn强百倍
  • 为了减少垃圾邮件,发送邮件都需要通过认证

最终代码:

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg.set_content("这是申龙斌发出的一封测试邮件")

msg['Subject'] = '邮件标题:零基础学编程'
msg['From'] = 'shenlongbin@qq.com'  #请换成你的邮箱
msg['To'] = 'slb-omnifocus@sync.omnigroup.com' #请换成你的邮箱

s = smtplib.SMTP('smtp.qq.com') #请查询你的邮箱服务商的SMTP主机域名
s.login('shenlongbin', 'Password') #请换成你的邮箱用户名和密码
s.send_message(msg)
s.quit()

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

每个极客都应该知道的Linux技巧

检查不是由你运行的程序 难度:高级 应用程序:bash(译注:UNIX或者LINUX的shell) 想象下这个场景-你已经准备好了要和同事在办公室里对战一局快速...

26310
来自专栏大数据

Scrapy递归抓取简书用户信息

好久没有录制实战教程视频,大邓就在圣诞节后直接上干货。 之前写过一期【视频教程-用python批量抓取简书用户信息】的文章,是自己造的轮子,今天我趁着刚入门sc...

2307
来自专栏FreeBuf

自己动手打造工具系列之自动刷新简历

话说搞安全的大佬们都非常忙,自己在一步一步成长中无暇顾及其他琐碎的事情,比如让猎头注意到各位大佬。如何让猎头和大厂注意到自己呢?第一、提高自己在整个行业的曝光度...

705
来自专栏哲学驱动设计

搭建 WPF 上的 UI 自动化测试框架

简要说明 OEA 1.0-2.0 框架中,界面都是以 WPF 技术作为基础平台开发的。我们需要对开发出来的系统进行自动化测试,而 .NET 平台的自动化测试平...

20711
来自专栏听雨堂

VPC下访问FTP的问题

        最近用VPC一直用的很爽,用来调试安装包,实在太好用了。但是,最近却遇到一个问题,FTP总是无法正常工作,经过漫长而痛苦的跟踪定位,找到原因: ...

1958
来自专栏云加新鲜事儿

如何在腾讯云上开发一款O2O书签?

作者在看书的时候突发奇想,通过一张书签的二维码扫一扫就能知道自己最近在读哪本书,于是自己在腾讯云中从0到1开发一款O2O书签。

1910
来自专栏张戈的专栏

WordPress发布文章自动同步到新浪微博(带特色图片)

WordPress 发博客后自动同步到新浪微博,这是我从无主题博客看到的方法,一直沿用至今。感觉对博客宣传和提升“逼格”都有显著的作用: ? 一、老版代码 先来...

3807
来自专栏琯琯博客

awesome-javascript-cn

JS 资源列表,内容包括:包管理器、加载器、测试框架、运行器、QA、MVC框架和库、模板引擎、数据可视化、时间轴、编辑器等等。 包管理器 管理着 JavaScr...

4118
来自专栏小樱的经验随笔

【全网最全的博客美化系列教程】04.访客量统计的实现

相信大家也看到了右侧公告栏的访客量统计的效果,我们可以看到有两个样式,一个是单独统计人数的,一个是统计访客来源的,是不是感觉还挺不错的?

766
来自专栏SeanCheney的专栏

《Python分布式计算》 第5章 云平台部署Python (Distributed Computing with Python)云计算和AWS创建AWS账户创建一个EC2实例使用Amazon S3存

上一章介绍了创建Python分布式应用的Celery和其它工具。我们学习了不同的分布式计算架构:分布任务队列和分布对象。然而,还有一个课题没有涉及。这就时在多台...

3076

扫描关注云+社区