零基础学编程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 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4828
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2030
来自专栏魂祭心

原 canvas绘制clock

4054
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2547
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4698
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2692
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3095
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2142
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5376

扫码关注云+社区