博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python调用sendcloud接口实现邮件批量发送收取及url回调
阅读量:7270 次
发布时间:2019-06-29

本文共 3869 字,大约阅读时间需要 12 分钟。

前言:

今天和朋友聊起了邮件的发送,他那边有个业务是定期给大量的用户发新事物邮件,经常会有被拒的情况,还有就是他们的报警有点多,搞得exchange时常有压力,现在这哥们正琢磨着要搞邮件集群,我觉得没必要这么纠结,咱们可以利用第三方的邮件api。


国外有mailgun,国内有个sohu的sendcloud,这东西好多公司再用,比如youku,letv,安全宝、csdn等。。。

sendcloud不是简单的类似qq企业邮箱的方案,他的接口很是丰富,有发邮件,收邮件,webhook,url回调等功能。


咱们看看官网的介绍:

SendCloud为邮件提供DKIM签名及SPF、负责发送过程中ESP门户申诉与白名单确认,多重措施确保您的邮件高效送达。

SendCloud专注邮件发送领域,ESP白名单确认、发送频率控制、邮件发送追踪,每一个细节都确保无误,让开发者有更多时间专注开发!

SendCloud拥有的数据追踪功能,可以统计邮件送达过程中各种数据,并以多种图表形式呈现,一目了然。


怎么用sendcloud?

1.  需要注册,当然你要有一个域名,如果用过qq,163的企业邮箱,你就可以想成你的邮件服务器在sendcloud那边运维,发信收信的域名,肯定是你的域名了。


2.  需要在域名的授权处加入ESP、SPF、DKIM信息


3. 创建子账号:这样很安全,你的账号密码不会暴露给他们,发邮件的时候,调用临时的账号和token密码就可以啦。

欧了,咱们开始测试,sendcloud支持很多语言的接口,他本身就提供了很多的例子,我这边用python的版本。

利用SMTPLIB的方法    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding:utf-
8 
-*-
import 
smtplib
import 
json
from email 
import 
Encoders
from email.mime.base 
import 
MIMEBase
from email.mime.multipart 
import 
MIMEMultipart
from email.mime.text 
import 
MIMEText
from email.header 
import 
Header
fromEmail = 
'alert@xiaorui.cc' 
# 用正确邮件地址替代
toEmail=[
'rfyiamcool@163.com'
,
'754520135@qq.com'
]               # 用正确邮件地址替代收件人地址
msg = MIMEMultipart(
'alternative'
)
msg[
'Subject'
] = 
"大家好,我是峰云"
msg[
'From'
] = fromEmail
msg[
'To'
] = 
', '
.join(toEmail)
html = 
""
"<html><head></head><body><p>Hi! -name-<br>hello world!!!</p></body></html>"
""
part = MIMEText(html, 
'html'
)
msg.attach(part)
#不同于登录SendCloud站点的帐号,您需要登录后台创建发信子帐号,使用子帐号和密码才可以进行邮件的发送。
username = 
'postmaster@rfyiamcool.sendcloud.org'
password = 
'123123123' 
#密码
s = smtplib.SMTP(
'smtpcloud.sohu.com:25'
)
s.login(username, password)
s.sendmail(fromEmail, toEmail, msg.as_string())
s.quit()

好了~ 咱们再来测试sendcloud的webapi调用方式 !

提交带附件的邮件,必须使用 POST 方式提交,并且参数使用 multipart/form-data, 可以使用Requests,MultipartPostHandler, urllib2_file,poster 进行附件的发送。

他可以加多个附件 !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
#coding:utf-
8
import 
requests
url=
"https://sendcloud.sohu.com/webapi/mail.send.xml"
files={
"file1"
: (
"clusterops.tar.gz"
, open(
"/root/clusterops.tar.gz"
"rb"
)), \
        
"file2"
: (u
"smtp_test.py"
, open(u
"smtp_test.py"
))}
# 不同于登录SendCloud站点的帐号,您需要登录后台创建发信子帐号,使用子帐号和密码才可以进行邮件的发送。
params = {
"api_user"
"postmaster@rfyiamcool.sendcloud.org"
, \
    
"api_key" 
"123123"
,\
    
"to" 
"rfyiamcool@163.com"
, \
    
"from" 
"alert@xiaorui.cc"
, \
    
"fromname" 
"from"
, \
    
"subject" 
"主题"
, \
    
"html"
"正文" 
\
}
r = requests.post(url, files=files, data=params)
print r.text
~

博客原文

官网还给提供Python SDK的调用示例,我用了下,还真不错,挺方便的。

sdk下载地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python
# -*- coding:utf-
8 
-*-
#xiaorui.cc
import 
sendcloud
# 不同于登录SendCloud站点的帐号,您需要登录后台创建发信域名,获得对应发信域名下的帐号和密码才可以进行邮件的发送。
server = sendcloud.SendCloud(
'postmaster@rfyiamcool.sendcloud.org'
'123123'
, tls=False) # 目前tls 不可用
message = sendcloud.Message((
"from@sendcloud.com"
"来自SendCloud(fromname)"
), 
"峰云就她了"
, html=
"<h1>大家好,这里是地球 !!! xiaorui.cc </h1>"
)
message.add_to([
"rfyiamcool@163.com"
], [
"toname1"
])
message.add_attachment(
"文件1.pdf"
"/root/CreditCardReckoning201311.pdf"
)
#message.add_attachment(
"文件2.pdf"
"/path/to/文件2.pdf"
)
#server.set_host_port(
'smtpcloud.sohu.com'
'25'
)
# server.set_debuglevel(
1
)
server.smtp.send(message)

博客原文

这边还有用CURL的使用示例,大家可以参考下,替换下邮件地址,用户名,密码就行了。

没有特殊字符时,可以使用-d参数进行post提交

1
2
3
curl -d "api_user=yourusername&api_key=password&to=example1@sendcloud.com; \
example2@sencloud.com&from=user@sendcloud.com&fromname=测试用户& \
subject=主题&html=正文" https:
//sendcloud.sohu.com/webapi/mail.send.xml


有特殊字符时,使用–data-urlencode参数进行post提交

1
2
3
4
curl -d "api_user=yourusername&api_key=password&to=example1@sendcloud.com;\
example2@sendcloud.com&from=user@sendcloud.com&fromname=测试用户" \
--data-urlencode subject=
"我是有特殊字符的主题,如特殊字符&a=1" 
\
--data-urlencode html=
"我是正文,特殊字符&b=2" 
\

URL回调,能选择东西还挺多的。



好了,测试ok了~  看下sendcloud里面统计的数据 ~



  本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1364713,如需转载请自行联系原作者

你可能感兴趣的文章
CCNA2.0笔记_OSPF v3
查看>>
测试工程师应该知道的数据库基本操作(增删改查)
查看>>
求二叉树中的节点个数、求二叉树的深度(高度)
查看>>
看到一些前端面试题没答案,自己做了一下如果有错请指出
查看>>
Selenium2(WebDriver)总结(四)---基本元素操作
查看>>
应用程序框架实战三十五:服务概述
查看>>
C#中一道关于多线程的编程题
查看>>
附加数据库 对于 服务器“00-PC”失败
查看>>
AgileEAS.NET SOA中间件平台更新日志 2015-04-28
查看>>
系统共享内存的修改(ORA-27102: out of memory)
查看>>
设备树(device tree)学习笔记
查看>>
hdu 3518 (后缀数组)
查看>>
C#类的一些概念
查看>>
bzoj 4001 [TJOI2015]概率论 数学
查看>>
基于.net开发chrome核心浏览器【二】
查看>>
LeetCode - Isomorphic Strings
查看>>
android UI 仿 win 8 模块化 标题,并实现 可长按拖动交换图片位置、可点击,且伴随动画特效...
查看>>
Maven发布工程到公共库
查看>>
@RenderBody、@RenderSection、@RenderPage、Html.RenderPartial、Html.RenderAction的作用和区别...
查看>>
MSMQ实现自定义序列化存储
查看>>