Отправка SMTP не работает с 4G, несмотря на работу с WiFi

#python #python-3.x #smtp #gmail #smtplib

#python #python-3.x #smtp #gmail #smtplib

Вопрос:

Я работаю над школьным проектом с помощью waveshare 4g hat и sim-карты, подключенной к raspberry pi 4. Он удаленно снимает изображения и отправляет их по электронной почте указанному пользователю, используя учетную запись, настроенную моей командой. Когда я подключен к Wi-Fi, изображение отправляется по электронной почте нормально, однако, когда я отключаю Wi-Fi и использую sim-карту, этого не происходит. Я использую скрипт bash, предоставленный waveshare, который настраивает сетевое подключение (к att) для http, и я могу просматривать веб-страницы и получать доступ к веб-сайтам с использованием 4g, однако, когда я пытаюсь отправить изображение на python с помощью smtplib, он подключается к учетной записи электронной почты и регистрируется нормально, но затем зависает без отправки изображения по адресу:

  s.send_message(m)
  File "/usr/lib/python3.7/smtplib.py", line 967, in send_message
    rcpt_options)
  File "/usr/lib/python3.7/smtplib.py", line 882, in sendmail
   (code, resp) = self.data(msg)
  File "/usr/lib/python3.7/smtplib.py", line 568, in data
    self.send(q)
  File "/usr/lib/python3.7/smtplib.py", line 354, in send
    self.sock.sendall(s)
  File "/usr/lib/python3.7/ssl.py", line 1015, in sendall
    v = self.send(byte_view[count:])
  File "/usr/lib/python3.7/ssl.py", line 984, in send
    return self._sslobj.write(data)
  

Не имея четкого понимания этих протоколов, я предполагаю, что это как-то связано с тем фактом, что http и smtp — это разные протоколы, и для этого требуется какое-то безопасное соединение, как это выглядит? что делает подключение к сети через моего провайдера, чего не делает моя служба 4g? Есть ли простое исправление? Я прочитал в другом месте, чтобы убедиться, что учетная запись gmail, к которой я подключаюсь для отправки изображения, имеет «разрешить менее безопасные приложения», что я и сделал. Любое направление было бы с благодарностью, спасибо.

 import smtplib
import ssl
import re

from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

USERNAME = <removed>
PASSWORD = <removed>

ADDRESS = "<removed>@gmail.com"
 
def send_mail(picture_path, text_string):
print("sending email")
to_address = get_email(text_string)
if to_address == FAIL:
    return
picture = get_picture(picture_path)

m = MIMEMultipart()
m["To"] = to_address
m["From"] = USERNAME
m["Subject"] = "Wildlife Remote"
m.attach(MIMEImage(picture))
print("photo attached")

s = smtplib.SMTP(host='smtp.gmail.com', port=587)
s.ehlo()
s.starttls()

s.login(USERNAME, PASSWORD)
print("email successfully logged in")
s.send_message(m)
s.quit()
print("email sent")
  

и в случае, если это полезно, скрипт оболочки для настройки 4g hat, который я использую:

 
sudo qmicli -d /dev/cdc-wdm0 --dms-set-operating-mode='online'

sudo qmicli --d /dev/cdc-wdm0 -w

sudo ip link set wwan0 down

echo 'Y' | sudo tee /sys/class/net/wwan0/qmi/raw_ip

sudo ip link set wwan0 up

sudo qmicli -p -d /dev/cdc-wdm0 --device-open-net='net-raw-ip|net-no-qos-header' --wds- 
start-network="apn='phone',ip-type=4" --client-no-release-cid

sudo qmi-network /dev/cdc-wdm0 start

sudo udhcpc -i wwan0

  

Комментарии:

1. У разных провайдеров могут быть разные политики в отношении того, разрешают ли они прямой smtp-доступ к серверам исходящей почты, отличным от их собственных; некоторые могут блокировать такие подключения, чтобы заставить вас использовать их собственный почтовый сервер, в рамках мер по борьбе со спамом.

2. ах, хорошо, это очень полезно, спасибо! Итак, будет ли это вопросом для ATT тогда?

3. Стоило бы спросить. Также посмотрите, можете ли вы узнать имя (и номер порта) для использования на их smtp-сервере, а затем посмотрите, работает ли это, если вы используете его вместо gmail при отправке почты из их сети.

4. Обратная трассировка ошибки, похоже, усечена, не могли бы вы предоставить полную обратную трассировку, пожалуйста?