专栏首页申龙斌的程序人生零基础学编程035:群发邮件并不难

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

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

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

第一步:搜索大法

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

第二步:官方文档

搜索的第一条结果就指向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)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 参加steemit数学x程式大赛(第八回)

    前一段时间参加了Steemit社区的两个活动,比如“接龙”创作大赛,五个人根据几张图片素材编出一篇小说,事先没有任何沟通,人员报名之后,顺序是随机指定的,我第一...

    申龙斌
  • 零基础学编程030:像黑客般玩玩字符艺术

    经常安装盗版软件的朋友可能会看到一些由字母组成的奇怪图案,比如下面这张图: ? (图片来自于网络) 在Python里,我们无法用字母拼出如此复杂的图案,但也可以...

    申龙斌
  • 零基础学编程010:最终可以输出完整的复利数据表了

    我为了用Python打印这365行枯燥的《复利数据表》: (1+0.01) ^ 1 = 1.01 (1+0.01) ^ 2 = 1.02 (1+0.01) ^...

    申龙斌
  • [享学Eureka] 五、Eureka核心概念:应用(Application)和注册表(Applications)

    代码下载地址:https://github.com/f641385712/netflix-learning

    YourBatman
  • 硬核老爸为脑瘫女儿打造“超级”轮椅:红外雷达判断路况,拉英特尔合作,还开了公司

    提到智能轮椅,这可能并不是什么新鲜事,不少公司都希望通过智能轮椅提升残疾人的出行。但是,一位硬核老爸信不过这些公司,为了让自己患有脑瘫的女儿在人流中自在穿行,更...

    大数据文摘
  • 从一次线上故障来看redis删除机制

    公司去年上线一个抽奖系统,主要用来拉新、提升流量,所有新注册的用户在指定时间都可以抽奖,为了保证安全性,程序中做了频率限制,每个用户30秒只能抽1次,...

    心平气和
  • JavaScript OOP(三):prototype原型对象(即构造函数的prototype属性)

    通过构造函数生成的实例化对象,无法共享属性或方法(即每个实例化对象上都有构造函数中的属性和方法);造成了一定的资源浪费 1 function Obj(name...

    用户1149564
  • 低功耗 | 从综合到PostRoute 功耗的Gap 有多大

    PPA, Performance, Power, Area 是衡量一颗芯片的基本指标,这三大指标中Power 是最诡诈的,它不像Performance 跟Are...

    老秃胖驴
  • LeetCode 702. 搜索长度未知的有序数组(二分查找)

    给定一个升序整数数组,写一个函数搜索 nums 中数字 target。 如果 target 存在,返回它的下标,否则返回 -1。注意,这个数组的大小是未知的。...

    Michael阿明
  • 磁盘挂载、磁盘格式化、swap分区 原

    语法: mke2fs [选项] [参数] 选项: -L:=label,预设该分区的标签 -t:用来指定文件系统的类型(xfs、ext4、ext3、ext2...

    阿dai学长

扫码关注云+社区

领取腾讯云代金券