python 网络编程学习: 4 网络客户端编程之SMTP

邮件工作过程 建议看一下

常见的电子邮件协议有以下几种:SMTP(简单邮件传输协议)、POP3(邮局协议)、IMAP(Internet邮件访问协议)、HTTP、S/MIME。这几种协议都是由TCP/IP协议族定义的。

  • SMTP(Simple Mail Transfer Protocol):SMTP主要负责底层的邮件系统如何将邮件从一台机器传至另外一台机器。
  • POP(Post Office Protocol):目前的版本为POP3,POP3是把邮件从电子邮箱中传输到本地计算机的协议。
  • IMAP(Internet Message Access Protocol):目前的版本为IMAP4,是POP3的一种替代协议,提供了邮件检索和邮件处理的新功能,这样用户可以完全不必下载邮件正文就可以看到邮件的标题摘要,从邮件客户端软件就可以对服务器上的邮件和文件夹目录等进行操作。IMAP协议增强了电子邮件的灵活性,同时也减少了垃圾邮件对本地系统的直接危害,同时相对节省了用户察看电子邮件的时间。除此之外,IMAP协议可以记忆用户在脱机状态下对邮件的操作(例如移动邮件,删除邮件等)在下一次打开网络连接的时候会自动执行。
  • HTTP(S): 通过浏览器使用邮件服务时使用。

Python和SMTP

python 有一个smtplib模块和一个smtplib.SMTP类。

过程为:

  1. 连接服务器
  2. 登录(如果需要)
  3. 发出服务请求
  4. 退出

代码描述为

from smtplib import SMTP
n = SMTP('smtp.yourdomain.com')
.....
n.quit()

smtplib.SMTP类的一些常用方法

 
方法 描述
sendmail(from_addrto_addrsmsg[mail_optionsrcpt_options]) 把msg从from 发送给to(列表或元组),ESMTP设置 (mail_options)和收件人设置 rcpt_options 为可选
quit() 关闭连接,然后退出
login(userpassword) 使用用户名和密码登录到SMTP服务器,只在有SMTP-AUTH时使用

sendmail(from_addrto_addrsmsg[mail_optionsrcpt_options])  的所有参数都要遵循RFC 2822 ,即电子邮件地址必须要有正确的格式,消息体要有正确的前导头,前导头后面是两个回车和换行(\r\n)对。

 

看一下邮件内容包括哪些部分

每一个传统的E-mail都包含两个不同的部分:header和body。header 包含控制数据----例如:寄件人、目的地、信息的标题,而body包含信息本身。

下面是用到header的几种的几种情况:

  • From header 可以想用户表明邮件的发送人。
  • Reply-To header 可以设置一个回复的替换地址
  • Subject header 用于显示邮箱主题
  • Date header 可以用来按照到达时间分类邮箱
  • Message-ID 和In-Reply-To header 可以帮助某些邮件程序实现线索
  • MIME header 可以帮助邮件程序以合适的语言 格式来显示邮件,也可用来处理附件

代码示例

#!/usr/bin/python

import smtplib

sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']

message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

在Python中 产生邮件的模块在email模块里,在这里我们使用MIMEText 来编写一个使用126邮箱发送邮件的程序

#/usr/bin/python
# -*- coding: utf-8 -*-

#导入smtplib和MIMEText
import smtplib
from email.mime.text import MIMEText


mailto = "XXXXXXX@gmail.com"
#设置服务器DateTimeField用户名、口令以及邮箱的后缀
mail_host = "smtp.126.com"
mail_user = "username"
mail_pass = "password"
mail_postfix = "126.com"
######################


def send_mail(to, sub, content):
    '''
    to_list:发给谁
    sub:主题
    content:内容
    send_mail("aaa@126.com","sub","content")
    '''
    me = mail_user + "<" + mail_user + "@" + mail_postfix + ">"
    msg = MIMEText(content)
    msg['Subject'] = sub
    msg['From'] = me
    msg['To'] = to
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user, mail_pass)
        s.sendmail(me, to, msg.as_string())
        s.close()
        print '发送至' + to + '成功'
    except Exception, e:
        print str(e)
        print "发送至'+ to +'失败"


if __name__ == '__main__':
    subject = raw_input('enter subject:> ')
    content = raw_input('enter content:> ')
    send_mail(mailto, subject, content)


作者:GoodSpeed Cheng
出处:http://www.cnblogs.com/cacique/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


原文地址:https://www.cnblogs.com/cacique/p/2655793.html