簡體   English   中英

使用python替換電子郵件的正文消息

[英]Replace body message of an email using python

我在python中創建了一個類,它將通過我的一個私人服務器發送電子郵件。 它工作,但我想知道是否有一種方法來替換現有的電子郵件正文消息?

電子郵件類

class Emailer:

  def __init__(self, subj=None, message=None, toAddr=None, attachment=None, image=None):
    # initialize email inputs

    self.msg = email.MIMEMultipart.MIMEMultipart()

    self.cidNum = 0

    self.message = []
    if message is not None:
        self.addToMessage(message,image)

    # set the subject of the email if there is one specified
    self.subj = []
    if subj is not None:
        self.setSubject(subj)

    # set the body of the email and any attachements specified
    self.attachment = []
    if attachment is not None:
        self.addAtachment(attachment)

    # set the recipient list
    self.toAddr = []
    if toAddr is not None:
        self.addRecipient(toAddr)

  def addAttachment(self,attachment):
    logger.debug("Adding attachement to email")
    # loop through list of attachments and add them to the email
    if attachment is not None:
        if type(attachment) is not list:
            attachment = [attachment]
        for f in attachment:
            part = email.MIMEBase.MIMEBase('application',"octet-stream")
            part.set_payload( open(f,"rb").read() )
            encoders.encode_base64(part)
            part.add_header('Content-Disposition', 'attachment; filename="{0}"'.format(os.path.basename(f)))
            self.msg.attach(part)

  def addToMessage(self,message,image=None):
    logger.debug("Adding to email message. Content: [%s]" % message)
    # add the plain text message
    self.message.append(message) 
    # add embedded images to message
    if image is not None:
        if type(image) is not list:
            image = [image]
        for i in image:
            msgText = email.MIMEText.MIMEText('<br><img src="cid:image%s"><br>' % self.cidNum, 'html')   
            self.msg.attach(msgText)

            fp = open(i, 'rb')
            img = email.MIMEImage.MIMEImage(fp.read())
            fp.close()
            img.add_header('Content-ID','<image%s>' % self.cidNum)
            self.msg.attach(img)
            self.cidNum += 1

# method to set the subject of the email
  def setSubject(self,subj):
    self.msg['Subject'] = subj

# method to add recipients to the email
  def addRecipient(self, toAddr):
    # loop through recipient list
    for x in toAddr:
        self.msg['To'] = x

# method to configure server settings: the server host/port and the senders login info
  def configure(self,  serverLogin, serverPassword, fromAddr, toAddr, serverHost='myserver', serverPort=465):
    self.server=smtplib.SMTP_SSL(serverHost,serverPort) 
    self.server.set_debuglevel(True)
    # self.server.ehlo()
    # self.server.ehlo()
    self.server.login(serverLogin, serverPassword)  #login to senders email
    self.fromAddr = fromAddr
    self.toAddr = toAddr

# method to send the email
  def send(self):
    logger.debug("Sending email!")
    msgText = email.MIMEText.MIMEText("\n".join(self.message))
    self.msg.attach(msgText) 
    print "Sending email to %s " % self.toAddr
    text = self.msg.as_string() #conver the message contents to string format
    try:
        self.server.sendmail(self.fromAddr, self.toAddr, text)  #send the email
    except Exception as e:
        logger.error(e)

目前, addToMessage()方法是將文本添加到電子郵件正文的內容。 如果已經調用了addToMessage()但我想用新文本替換該正文,那么有辦法嗎?

如果已經調用了addToMessage()但我想用新文本替換該正文,那么有辦法嗎?

是。 如果您總是替換添加到self.message的最后一個條目,則可以使用self.message[-1]引用此元素,因為它是一個列表。 如果要替換特定元素,可以使用index()方法搜索它。

示例#1:替換正文中的最后一個書面文本

def replace_last_written_body_text(new_text):
    if len(self.message) > 0:
        self.message[-1] = new_text

示例#2:替換正文中的指定文本

def replace_specified_body_text(text_to_replace, new_text):
    index_of_text_to_replace = self.message.index(text_to_replace)
    if index_of_text_to_replace is not None:
        self.message[index_of_text_to_replace] = new_text
    else:
        logger.warning("Cannot replace non-existent body text")

如果addToMessage調用了一次addToMessage ,那么:

message是一個列表,它的第一個元素是正文文本,所以你只需要用新文本替換該元素:

def replace_body(self, new_text):
    if len(self.message) > 0:
        self.message[0] = new_text
    else:
        self.message = [new_text]

我沒有測試過,但它應該工作。 確保你為這個項目寫了一些單元測試!

編輯:如果多次調用addToMessage ,那么新的替換函數可以替換整個文本,或者只替換它的一部分。 如果你想要替換所有它,那么只需替換消息,就像上面的else部分: self.message = [new_text] 否則,你將不得不找到你需要替換的元素,就像@BobDylan在他的回答中所做的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM