【问题标题】:How do I send a string + variable as sms using python?如何使用 python 将字符串 + 变量作为短信发送?
【发布时间】:2019-09-27 20:11:58
【问题描述】:

我需要在我的程序运行完成后发送一条消息,但我还想在文本中包含变量,例如程序运行多长时间。

这是我的短信代码:

import smtplib

carriers = {
    'att': '@mms.att.net',
    'tmobile': ' @tmomail.net',
    'verizon': '@vtext.com',
    'sprint': '@page.nextel.com'
}


def send(message):
    # Replace the number with your own, or consider using an argument\dict for multiple people.
    to_number = 'xxxxxxxxxx{}'.format(carriers['verizon'])
    auth = ('xxxxx', 'xxxx')

    # Establish a secure session with gmail's outgoing SMTP server using your gmail account
    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.starttls()
    server.login(auth[0], auth[1])

    # Send text message through SMS gateway of destination number
    server.sendmail(auth[0], to_number, message)

显然,我用 xxx 替换了我的信息。 现在,要发送我的文本,我正在使用以下方法调用该函数:

found = 'The program is done!'
timetook = "Time took: %s (HOUR:MIN:SEC)" % timedelta(seconds=round(elapsed_time_secs))
send(found)
send(timetook)

它只是为时间发送空白文本,但程序完成消息工作正常。如何发送时间?

【问题讨论】:

  • timedelta 返回一个datetime.timedelta 对象,您可能希望将其包装在字符串中以使%s 工作。
  • 我也试过了,好像不行。奇怪的是,我在技术上发送了一个变量(找到),但不能发送一个内部有另一个变量的变量。
  • 这可能与时间和格式化字符串的存储方式有关。你试过f-string或.format()吗?
  • 我试过 f-string 但不是 .format(),你建议我如何格式化它?
  • 我刚试过 .format(),不工作

标签: python sms sms-gateway


【解决方案1】:

问题是您没有遵守 SMTP 的规则。以下是我多年前为自己编写的等效解决方案。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""SMS (short message service) functions."""

import logging
import smtplib
import sys
import rate_limiting

SMTP_GATEWAY = 'localhost'
FROM_ADDR = 'me@domain.us'
PHONE_NUMBER = '4081234567'
# T-Mobile SMS email gateway
# TO_ADDR = PHONE_NUMBER + '@tmomail.net'
# Verizon SMS email gateway
TO_ADDR = PHONE_NUMBER + '@vtext.com'

# Allow only three SMS messages per minute and five per hour.
short_term_rate_limiter = rate_limiting.SimpleRateLimiter(3, 60)
long_term_rate_limiter = rate_limiting.SimpleRateLimiter(5, 60 * 60)


def SendSms(msg, why=''):
    """Send a SMS message."""
    short_term_rate_exceeded = short_term_rate_limiter()
    long_term_rate_exceeded = long_term_rate_limiter()
    if short_term_rate_exceeded or long_term_rate_exceeded:
        logging.warning('SMS message rate exceeded, dropping msg: %s', msg)
        return

    smtp_conn = smtplib.SMTP(SMTP_GATEWAY)
    hdrs = 'From: {}\r\nTo: {}\r\n\r\n'.format(FROM_ADDR, TO_ADDR)
    if why:
        hdrs += 'Subject: {}\r\n'.format(why[:20])
    hdrs += "\r\n\r\n"
    max_msg_len = 140 - 3 - min(20, len(why))
    msg = hdrs + msg[:max_msg_len]
    # Make sure the message has only ASCII characters.
    msg = msg.encode('ascii', errors='replace').decode('ascii')
    smtp_conn.sendmail(FROM_ADDR, [TO_ADDR], msg)
    smtp_conn.quit()


if __name__ == '__main__':
    SendSms(' '.join(sys.argv[1:]))

【讨论】:

    猜你喜欢
    • 2022-07-16
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多