注册
登录
新闻动态
python
返回
如何使用 Python 免费发送短信 | 使用 Python 通过电子邮件发送短信
作者:
糖果
发布时间:
2024-04-13 07:28:50 (6天前)
来源:
https://www.alfredosequeida.com/blog/how
如果你想跳过这项工作,你可以使用etext - 我创建的一个 Python 模块,使用的技术与这篇博文中解释的相同。 好的,首先让我们与条款进入同一页面,我们将使用它来构建它。SMS 或短消息服务就是文本消息;限制为 160 个字符并通过移动网络发送。彩信或彩信服务与短信基本上是一样的,但它具有嵌入的多媒体,如图像视频甚至 pdf 文件,直到昨天我才知道你可以通过短信发送。为了发送免费文本消息,我们将使用 SMS 网关,它们是充当中间人的服务器,可用于通过移动网络将我们的消息传递到手机。 # 发送短信 与 Twilio 之类的替代方案不同,它允许您使用其 API 以编程方式发送文本消息并收取费用,这些 SMS 和 MMS 网关可以免费使用,因为我们与它们交互的一种方式是使用电子邮件。换句话说,这些由移动提供商设置的网关允许我们以电子邮件消息的形式发送我们的文本消息,然后通过 SMS 或 MMS 将我们的消息转发到手机。 为了让您的生活更轻松,我冒昧地为美国电话提供商汇总了 SMS 和 MMS 电子邮件域列表: 提供者.py ```python PROVIDERS = { "AT&T": {"sms": "txt.att.net", "mms": "mms.att.net", "mms_support": True}, "Boost Mobile": { "sms": "sms.myboostmobile.com", "mms": "myboostmobile.com", "mms_support": True, }, "C-Spire": {"sms": "cspire1.com", "mms_support": False}, "Cricket Wireless": { "sms": "sms.cricketwireless.net ", "mms": "mms.cricketwireless.net", "mms_support": True, }, "Consumer Cellular": {"sms": "mailmymobile.net", "mms_support": False}, "Google Project Fi": {"sms": "msg.fi.google.com", "mms_support": True}, "Metro PCS": {"sms": "mymetropcs.com", "mms_support": True}, "Mint Mobile": {"sms": "mailmymobile.net", "mms_support": False}, "Page Plus": { "sms": "vtext.com", "mms": "mypixmessages.com", "mms_support": True, }, "Republic Wireless": { "sms": "text.republicwireless.com", "mms_support": False, }, "Sprint": { "sms": "messaging.sprintpcs.com", "mms": "pm.sprint.com", "mms_support": True, }, "Straight Talk": { "sms": "vtext.com", "mms": "mypixmessages.com", "mms_support": True, }, "T-Mobile": {"sms": "tmomail.net", "mms_support": True}, "Ting": {"sms": "message.ting.com", "mms_support": False}, "Tracfone": {"sms": "", "mms": "mmst5.tracfone.com", "mms_support": True}, "U.S. Cellular": { "sms": "email.uscc.net", "mms": "mms.uscc.net", "mms_support": True, }, "Verizon": {"sms": "vtext.com", "mms": "vzwpix.com", "mms_support": True}, "Virgin Mobile": { "sms": "vmobl.com", "mms": "vmpix.com", "mms_support": True, }, "Xfinity Mobile": { "sms": "vtext.com", "mms": "mypixmessages.com", "mms_support": True, }, } ``` 作为奖励,我最近发现了这个网站,它有多个国家/地区的 SMS 网关,如果您不在美国,这可能会有所帮助:https://email2sms.info/ 作为一个简单的解释,这是使用 10 位美国电话号码的工作原理: 我们可以取电话号码后跟@符号,然后是 SMS 或 MMS 服务器的域。 ```python number@gateway-domain.com ``` 除了为您的提供商提供 SMS 或 MMS 的电子邮件域之外,您还需要有一个电子邮件提供商,它可以让您访问其 SMTP 服务器。对于我们的示例,我们将使用 Gmail 和 Gmail 的 SMTP 服务器。因此,您需要有一个 Gmail 帐户。您还应该设置应用程序密码,作为登录 SMTP 服务器的一种方式,无需两步验证。 您可以通过访问https://myaccount.google.com/apppasswords来执行此操作。为应用程序下拉列表和任何设备选择电子邮件;然后您将获得一个密码,我们稍后可以使用该密码对 Gmail 的 SMTP 服务器进行身份验证。 现在让我们来看看代码。我们要做的第一件事是导入一些我们将要使用的模块,我们稍后将使用这些模块email来格式化电子邮件。我们还需要smtp我们将使用它来通过 SMTP 服务器发送电子邮件的库。我们还需要ssl并且我们将使用它作为与 SMTP 服务器的连接。然后,我们要添加的另一件事是之前的提供程序。 ##### 主文件 ```python importemail, smtplib, ssl from providers import PROVIDERS ``` 现在我们有了这个,让我们开始制作 SMS 部分现在我们的程序。它需要几个参数: ##### 主文件 ```python def send_sms_via_email( number: str, message: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): ``` 第一个是最明显的一个,它是我们将用于发送这些电子邮件的实际数字。我们还需要我们将要发送的实际消息,接下来这将再次是字符串类型,我们还将使用字符串类型的提供者,提供者将成为运营商,这再次对应于来自这些提供者之一前。然后我们需要发件人凭据,凭据不仅包括用于发送这些凭据的电子邮件,还包括我们之前使用 Google 应用程序密码获得的密码。 主题也将是字符串类型。这里有一件事是我注意到某些 SMS 网关不允许您在没有结构正确的电子邮件的情况下发送电子邮件,这就是我们包含主题的原因。接下来,我们将为 SMTP 服务器添加一个参数。 在本例中,我们使用 Gmail 发送电子邮件,因此默认值为smtp.gmail.com. 我们需要的另一件事是将用于发送这些电子邮件的端口。如果您使用的是 Gmail,则不需要对此了解太多,但如果您使用的是不同的 SMPT 提供商或不同的电子邮件服务器,您可能需要继续查看他们是否使用不同的端口发送电子邮件。在我们的例子中,SMTP 端口将是整数类型。 我们应该定义的第一件事是发件人的电子邮件和该发件人的电子邮件密码,现在我们将从发件人凭据中获取这些信息 ##### 主文件 ```python def send_sms_via_email( number: str, message: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials ``` 就像我之前提到的,接收者的电子邮件由一个电话号码和 SMS 网关的域组成。要格式化,我将在这里使用 f 字符串。 ##### 主文件 ```python def send_sms_via_email( number: str, message: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' ``` 太棒了,现在让我们格式化我们的电子邮件。我们现在将创建一个名为 email message 的变量,就像我之前所说的,一些提供商不允许您发送消息,除非它的结构类似于实际的电子邮件,这意味着我们发送的内容不仅需要消息,还需要主题以及再次发送给谁,我们将在这里使用 f 字符串。 ##### 主文件 ```python def send_sms_via_email( number: str, message: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' email_message = f"Subject:{subject}\nTo:{receiver_email}\n{message}" ``` 要发送电子邮件,我们将使用上下文管理器。如果您不熟悉它,这只是 SMTP 服务器连接在我们完成所有操作后优雅退出的一种方式,所以我们将在smtp这里使用lib,我们将使用SMTP_SSL以及创建一个对象使用该实例向 SMTP 服务器进行身份验证: ##### 主文件 ```python def send_sms_via_email( number: str, message: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' email_message = f"Subject:{subject}\nTo:{receiver_email}\n{message}" with smtplib.SMTP_SSL( smtp_server, smtp_port, context=ssl.create_default_context() ) as email: email.login(sender_email, email_password) email.sendmail(sender_email, receiver_email, email_message) ``` 让我们发送一条短信!我只是要快速创建 main 方法,然后在这个 main 方法中让我们调用send_sms_via_email ##### 主文件 ```python def main(): number = "5623720883" message = "hello world!" provider = "T-Mobile" sender_credentials = ("email@domain.com", "password") send_sms_via_email(number, message, provider, sender_credentials) ``` 为了运行我们的程序,我们将使用 __name__dunder 方法 ##### 主文件 ```python if __name__ == "__main__": main() ``` # 发送彩信 现在我们有了,让我向您展示如何发送 MMS 消息。一切都非常相似,所以我将从这个开始: ```python main.py def send_mms_via_email( number: str, message: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' ``` 由于我们需要一个文件来发送彩信,因此我们将其添加为参数。它将是字符串类型的文件路径。我们还需要文件的 mime 类型,所以让我们在参数中添加一个 mime 主类型和一个 mime 子类型。我稍后会谈到这意味着什么。 main.py def send_mms_via_email( number: str, message: str, file_path: str, mime_maintype: str, mime_subtype: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): 让我们导入更多需要发送彩信的东西。 ```python main.py from email import encoders from email.mime.base import MIMEBase from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from os.path import basename ``` 现在,彩信功能将发生变化的是我们发送电子邮件的方式。因此,不要发送显示主题、收件人和消息的电子邮件;我们需要创建一个多部分的电子邮件。多部分是 (1) 我们发送的消息本身和 (2) 我们附加到该电子邮件的文件。 如果我们返回到我们的提供商列表,您会注意到某些提供商可能无法让您发送彩信,或者将使用单个域来同时发送短消息和彩信,因此我在我汇总的列表。使用支持 SMS 的密钥。 例如,T-Mobile 没有彩信密钥,但它确实支持彩信,这意味着我们可以使用同一个短信域来发送短信和彩信。但是,例如,AT&T 同时拥有 SMS 和 MMS 域。因此,您需要根据您发送的内容使用合适的。 我们将email_message像以前一样使用,但相反,我们将使用多部分对象。我们还需要添加我们的电子邮件属性。我们将使用email_message添加主题、接收者(接收我们的电子邮件的人)和发件人(发送电子邮件的人)。 ```python main.py def send_mms_via_email( number: str, message: str, file_path: str, mime_maintype: str, mime_subtype: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' email_message = MIMEMultipart() email_message["Subject"] = subject email_message["From"] = sender_email email_message["To"] = receiver_email ``` 让我们将消息附加到我们的电子邮件中,这是我的普通类型(纯文本)。 ```python main.py def send_mms_via_email( number: str, message: str, file_path: str, mime_maintype: str, mime_subtype: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' email_message = MIMEMultipart() email_message["Subject"] = subject email_message["From"] = sender_email email_message["To"] = receiver_email email_message.attach(MIMEText(message, "plain")) ``` # 什么是 MIME 类型? 如果您不熟悉 MIME 类型,它只是一种文件类型或一种内容类型的声明。在这种情况下,mime 文本告诉我们,我们正在使用的内容是文本。同样,要附加我们要发送的文件,我们必须更改指定 MIME 类型。 # 附加文件 使用上下文管理器,我们将添加我们在参数中传递的文件路径。然后我们还需要指定读取类型,在这种情况下我们将读取字节。使用MIMEBase,我们可以指定文件的 MIME 类型。首先是主要类型,然后是地雷子类型。然后我们将设置我们将使用的内容的有效负载。在这种情况下,这是文件附件。要发送文件,我们需要将其编码为 base64,因此从我们之前导入的编码器中,我们会将媒体编码为 base64。我们还需要添加一个标题。标头将是 content-disposition 类型,为此,我们要添加我们要发送的文件名。然后,我们可以将其附加到我们的电子邮件中,我们必须将我们的实际文件附加到我们的电子邮件中,就像我们之前使用消息电子邮件所做的那样: ```python main.py def send_mms_via_email( number: str, message: str, file_path: str, mime_maintype: str, mime_subtype: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' email_message = MIMEMultipart() email_message["Subject"] = subject email_message["From"] = sender_email email_message["To"] = receiver_email email_message.attach(MIMEText(message, "plain")) with open(file_path, "rb") as attachment: part = MIMEBase(mime_maintype, mime_subtype) part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header( "Content-Disposition", f"attachment; filename={basename(file_path)}", ) email_message.attach(part) ``` 我们要做的最后一件事是发送电子邮件,但我们不能只发送 mime multi-part 类型的电子邮件。我们必须将其转换为上下文管理器之外的文本。 ```python main.py def send_mms_via_email( number: str, message: str, file_path: str, mime_maintype: str, mime_subtype: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' email_message = MIMEMultipart() email_message["Subject"] = subject email_message["From"] = sender_email email_message["To"] = receiver_email email_message.attach(MIMEText(message, "plain")) with open(file_path, "rb") as attachment: part = MIMEBase(mime_maintype, mime_subtype) part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header( "Content-Disposition", f"attachment; filename={basename(file_path)}", ) email_message.attach(part) text = email_message.as_string() ``` 所以现在如果我们到这里,我们会从 SMS 功能中得到和以前一样的东西,但是我们必须将我们的电子邮件消息更改为我们刚刚创建的文本。 ```python main.py def send_mms_via_email( number: str, message: str, file_path: str, mime_maintype: str, mime_subtype: str, provider: str, sender_credentials: tuple, subject: str = "sent using etext", smtp_server: str = "smtp.gmail.com", smtp_port: int = 465, ): sender_email, email_password = sender_credentials receiver_email = f'{number}@{PROVIDERS.get(provider).get("sms")}' email_message = MIMEMultipart() email_message["Subject"] = subject email_message["From"] = sender_email email_message["To"] = receiver_email email_message.attach(MIMEText(message, "plain")) with open(file_path, "rb") as attachment: part = MIMEBase(mime_maintype, mime_subtype) part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header( "Content-Disposition", f"attachment; filename={basename(file_path)}", ) email_message.attach(part) text = email_message.as_string() with smtplib.SMTP_SSL( smtp_server, smtp_port, context=ssl.create_default_context() ) as email: email.login(sender_email, email_password) email.sendmail(sender_email, receiver_email, text) ``` 让我们创建 main 函数(没有 SMS 版本)。和 SMS 版本类似,但我们必须添加文件路径和 mime 类型。发送一个将成为主要类型图像的 png 图像,然后子类型几乎总是文件的实际扩展名,这给了我们一个 png。 ##### 主文件 ```python def main(): file_path = "/path/to/file/file.png" mime_maintype = "image" mime_subtype = "png" phone_number = "5623720883" message = "hello world!" provider = "T-Mobile" sender_credentials = ("email@domain.com", "password") send_mms_via_email( phone_number, message, file_path, mime_maintype, mime_subtype, provider, sender_credentials, ) if __name__ == "__main__": main() ``` 如果您不发送 png 图像,以下是一些常见的 MIME 类型: 延期 文件种类 MIME 类型 .aac AAC 音频 音频/aac .abw AbiWord 文档 应用程序/x-abiword .arc 存档文档(嵌入多个文件) 应用程序/x-freearc .avi AVI:音频视频交错 视频/x-msvideo .azw 亚马逊 Kindle 电子书格式 应用程序/vnd.amazon.ebook .bin 任何类型的二进制数据 应用程序/八位字节流 .bmp Windows OS/2 位图图形 图片/bmp .bz BZip 存档 应用程序/x-bzip .bz2 BZip2 存档 应用程序/x-bzip2 .cda CD 音频 应用程序/x-cdf .csh C-Shell 脚本 应用程序/x-csh .css 级联样式表 (CSS) 文本/CSS .csv 逗号分隔值 (CSV) 文本/csv .doc 微软Word 应用程序/msword .docx 微软 Word (OpenXML) 应用程序/vnd.openxmlformats-officedocument.wordprocessingml.document .eot MS 嵌入式 OpenType 字体 应用程序/vnd.ms-fontobject .epub 电子出版物 (EPUB) 应用程序/epub+zip .gz GZip 压缩存档 应用程序/gzip .gif 图形交换格式 (GIF) 图片/gif .htm .html 超文本标记语言 (HTML) 文本/html .ico 图标格式 图片/vnd.microsoft.icon .ics iCalendar 格式 文字/日历 .jar Java 存档 (JAR) 应用程序/java-归档 .jpeg .jpg JPEG 图像 图片/JPEG .js JavaScript text/javascript(规范:HTML 及其推理,以及 IETF) .json JSON格式 应用程序/json .jsonld JSON-LD 格式 应用程序/ld+json .mid .midi 乐器数字接口 (MIDI) 音频/midi 音频/x-midi .mjs JavaScript 模块 文本/javascript .mp3 MP3 音频 音频/MPEG .mp4 MP4 视频 视频/mp4 .mpeg MPEG 视频 视频/MPEG .mpkg Apple 安装程序包 应用程序/vnd.apple.installer+xml .odp OpenDocument 演示文档 应用程序/vnd.oasis.opendocument.presentation .ods OpenDocument 电子表格文档 应用程序/vnd.oasis.opendocument.spreadsheet .odt OpenDocument 文本文档 应用程序/vnd.oasis.opendocument.text .oga OGG音频 音频/ogg .ogv OGG视频 视频/ogg .ogx OGG 应用程序/ogg .opus 作品音频 音频/作品 .otf OpenType 字体 字体/otf .png 便携式网络图形 图片/png .pdf Adobe 便携式文档格式 (PDF) 申请/pdf .php 超文本预处理器(个人主页) 应用程序/x-httpd-php .ppt 微软PowerPoint 应用程序/vnd.ms-powerpoint .pptx 微软 PowerPoint (OpenXML) 应用程序/vnd.openxmlformats-officedocument.presentationml.presentation .rar RAR 存档 应用程序/vnd.rar .rtf 富文本格式 (RTF) 应用程序/rtf .sh Bourne shell 脚本 应用程序/x-sh .svg 可缩放矢量图形 (SVG) 图片/svg+xml .swf 小型 Web 格式 (SWF) 或 Adobe Flash 文档 应用程序/x-shockwave-flash 。柏油 磁带存档 (TAR) 应用程序/x-tar .tif .tiff 标记图像文件格式 (TIFF) 图片/tiff .ts MPEG 传输流 视频/mp2t .ttf TrueType 字体 字体/ttf .txt 文本,(通常为 ASCII 或 ISO 8859-n) 文本/纯文本 .vsd 微软视觉 应用程序/vnd.visio .wav 波形音频格式 音频/wav .weba WEBM 音频 音频/网络 .webm WEBM视频 视频/网络 .webp WEBP图像 图片/webp .woff Web 开放字体格式 (WOFF) 字体/woff .woff2 Web 开放字体格式 (WOFF) 字体/woff2 .xhtml XHTML 应用程序/xhtml+xml .xls 微软Excel 应用程序/vnd.ms-excel .xlsx 微软 Excel (OpenXML) 应用程序/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xml XML 从 RFC 7303(第 4.1 节)开始推荐 application/xml,但有时仍使用 text/xml。您可以将特定的 MIME 类型分配给扩展名为 .xml 的文件,具体取决于其内容的解释方式。例如,一个 Atom 提要是 application/atom+xml,但 application/xml 是一个有效的默认值。 .xul 许尔 应用程序/vnd.mozilla.xul+xml .zip 压缩档案 应用程序/压缩包 .3gp 3GPP 音视频容器 视频/3gpp;音频/3gpp 如果它不包含视频 .3g2 3GPP2 音视频容器 视频/3gpp2;音频/3gpp2 如果它不包含视频 .7z 7-zip 存档 应用程序/x-7z-压缩 [来源](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types "来源") 这就是您可以使用 Python 免费发送 SMS 和 MMS 的方式!
收藏
举报
1 条回复
动动手指,沙发就是你的了!
登录
后才能参与评论