#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. Обратная трассировка ошибки, похоже, усечена, не могли бы вы предоставить полную обратную трассировку, пожалуйста?