Python 發送郵件


SMTP發送郵件

SMTP是郵件發生的協議,Python內置對SMTP的支持,可以通過Pytho發送純文本郵件、Html郵件以及帶附件的郵件
其中PYthon對SMTP只有的有smtplib和email兩個模塊,email負責構造郵件,smtplib負責郵件發送

1.首先來一個純文本郵件的demo

from email.mime.text import MIMEText
import smtplib
info = MIMEText('Hello World','plain','utf-8')
#構造MIMEText對象時,第一個參數是郵件正文,第二個參數是MIME的subtype,'plain'表示純文本,最終MIME就是'text/plain',第三個為字符集 
#定義Email地址和密碼
from_addr = 'xxx@xxx.com'
password = 'xxxxxx'
#收件人郵箱地址
to_user = 'xxxxx@xxx.com'
#SMTP郵件服務器地址
smtp_server = 'xxx.smtp.com'

s = smtplib.SMTP(smtp_server,25) #定義一個s對象
s.set_debuglevel(1) #打印debug日志
s.login(from_server,password) #auth發件人信息
server.sendmail(from_addr,to_addr,info.as_string())
s.quit()

測試下,OK可以收到郵件,但是這個郵件沒有主題和發件人等信息,這樣的郵件很容易被郵件管理系統標記為垃圾郵件甚至被直接拒絕,所以,我們需要對郵件進行添加主題等信息

2.對一個郵件添加主題等信息

#!/bin/env python
#-*- coding:utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

from_addr = 'xxx'
passwd = 'xxx'
to_addr = 'xxx'
smtp_addr = 'xxx'
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

msg = MIMEText('Hello 這封是帶主題的', 'plain', 'utf-8')
msg['From'] = _format_addr('我是發件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('這是郵件主題', 'utf-8').encode()

s = smtplib.SMTP(smtp_addr,25) #定義一個s對象
s.set_debuglevel(1) #打印debug日志
s.login(from_addr,passwd) #auth發件人信息
s.sendmail(from_addr,to_addr,msg.as_string())
s.quit()

這里寫了一個函數_format_addr()用來格式化郵件的地址

HTMl格式的郵件
msg = MIMEText('

Hello

' +
'

send by Python...

' +
'', 'html', 'utf-8')

3.大招 發送附件

#!/bin/env python
#-*- coding:utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
import smtplib

from_addr = 'xxx'
passwd = 'xxx'
to_addr = 'xxx'
smtp_addr = 'xxx'
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

msg = MIMEMultipart()
msg['From'] = _format_addr('我是發件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('這是郵件主題', 'utf-8').encode()

# 郵件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
# 添加附件就是加上一個MIMEBase,從本地讀取一個圖片:
with open('/tmp/1.png', 'rb') as f:
    # 設置附件的MIME和文件名,這里是png類型:
    mime = MIMEBase('image', 'png', filename='1.png')
    # 加上必要的頭信息:
    mime.add_header('Content-Disposition', 'attachment',
    filename='1.png')
    mime.add_header('Content-ID', '<0>')

同時支持HTML和Plain格式
如果發html格式郵件,收件人如果不支持就無法瀏覽,so可以選擇同時支持

msg = MIMEMultipart('alternative')
msg['From'] = ...
msg['To'] = ...
msg['Subject'] = ...

msg.attach(MIMEText('hello', 'plain', 'utf-8'))
msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html',     'utf-8'))
# 正常發送msg對象...

加密SMTP

smtp_server = 'smtp.gmail.com'
smtp_port = 587
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
# 剩下的代碼和前面的一模一樣:
server.set_debuglevel(1)

總結:
smtplib 只需要掌握構造方法 設置好郵件開頭 就可以順利發送郵件
構造一個郵件對象就是一個Messag對象,如果構造一個MIMEText對象,就表一個文本郵件對象,如果構造一個MIMEImage對象,就表示一個作為附件的圖片,要把多個對象組合起來,就用MIMEMultipart對象,而MIMEBase可以表示任何對象。它們的繼承關系如下:

        Message
    +- MIMEBase
       +- MIMEMultipart
       +- MIMENonMultipart
          +- MIMEMessage
          +- MIMEText
          +- MIMEImage


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM