Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/06/2025, à 15:17

Arbiel

[Résolu] Modifier le comportement ssl lors de l'envoi courriel

Bonjour à tous

J'envoie des courriels par un script écrit en Python avec les instructions ci-dessous, dans lesquelles expéditeur est une balise html qui contient les arguments serveur_sortant, port_sortant, lathraios et mdp :

	with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], expéditeur['port_sortant']) as mailServer :
		if expéditeur.has_attr('lathraios') :
			lat=expéditeur['lathraios']
			if lat[0] == '[' :
				lat=lat[1:].replace(']','')
			else :
				import base64
				lat=base64.b64encode(bytes(expéditeur['lathraios'],encoding='utf-8')).decode(encoding='utf-8')
		else :
			lat=expéditeur['mdp']
		s = mailServer.login(expéditeur['courriel'], lat)
		mailServer.send_message(msg)
		mailServer.close()

L'exécution du script me donne le résultat suivant :

arbiel@arbiel-NJ5x-NJ7xLU:~$ python '/home/arbiel/Bureau/gestion des quittances/loyer V2.py'
Traceback (most recent call last):
  File "/home/arbiel/Bureau/gestion des quittances/loyer V2.py", line 337, in execut
    envoi_quittance (gbl.expéditeur, gbl.locataire, ἁυτόν, '/tmp/'+ἁυτόν.nom_fichier)
  File "/home/arbiel/Bureau/gestion des quittances/loyer V2.py", line 418, in envoi_quittance
    with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], expéditeur['port_sortant']) as mailServer :
  File "/usr/lib/python3.10/smtplib.py", line 1050, in __init__
    SMTP.__init__(self, host, port, local_hostname, timeout,
  File "/usr/lib/python3.10/smtplib.py", line 255, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python3.10/smtplib.py", line 341, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/lib/python3.10/smtplib.py", line 1057, in _get_socket
    new_socket = self.context.wrap_socket(new_socket,
  File "/usr/lib/python3.10/ssl.py", line 513, in wrap_socket
    return self.sslsocket_class._create(
  File "/usr/lib/python3.10/ssl.py", line 1100, in _create
    self.do_handshake()
  File "/usr/lib/python3.10/ssl.py", line 1371, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)

La consultation du site me laisse supposer que je peux modifier le comportement de ssl, mais j'ai trop de lacunes pour y parvenir seul.

Merci d'avance à quiconque pourra me comment je peux faire.

Dernière modification par Arbiel (Le 21/06/2025, à 14:37)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#2 Le 19/06/2025, à 15:32

iznobe

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Bonjour , sans voir le fichier : /home/arbiel/Bureau/gestion des quittances/loyer V2.py"

je ne vois pas comment quelqu ' un pourrait  trouver une piste / solution .


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#3 Le 20/06/2025, à 10:59

Arbiel

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Bonjour iznobe

Je te remercie de l'intérêt que tu portes à ma demande d'aide.

À partir de mon script, j'ai composé le petit programme ci-dessous qui reprend les instructions relatives à l'envoi de message.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Test problème SSL


import sys

from bs4 import BeautifulSoup as btfs
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

class globl():
	def __init__(ἁυτόν):

		annexes='/home/arbiel/Bureau/Comportement SSL/annexes'
		html_correspondants='/'.join((annexes, "exp.xml"))
		with open(html_correspondants, 'r') as f :
			correspondants = btfs(f.read(), 'html.parser')
		ἁυτόν.expéditeur = correspondants.find('section', class_='expéditeur').p
		ἁυτόν.destinataire = correspondants.find('section', class_='destinataire').p
		ἁυτόν.destinateur='/'.join((annexes,sys.path[2]))
		ἁυτόν.pj='/'.join((annexes,'pièce_jointe.pdf'))
		return None
	
def envoi (expéditeur, destinataire, sujet, texte_message, pj):
	
	# 1. Préparer le contenu du message

	msg = MIMEMultipart()
	# 2. Compléter l'entête
	msg['Subject'] =  sujet
	msg['Keywords'] = "test"
	msg['From'] = expéditeur['courriel']
	msg['To'] = destinataire['courriel']
	if expéditeur.has_attr('réponse') :
		msg['Reply-To'] = expéditeur['réponse']
	if expéditeur.has_attr('copie') :
		en_copie=', '.join(expéditeur['copie'].replace(',',' ').strip().split())
		msg['Bcc']=en_copie
	msg.attach(MIMEText(texte_message, 'plain'))
# Insertion de la pièce joints
	part = MIMEBase('application', 'pdf')
	with open(pj, "rb") as f:
		part.set_payload(f.read())
		encoders.encode_base64(part)
		part.add_header(
		'Content-Disposition',
		f'attachment; filename={pj.split("/")[-1]}',
	)	
	msg.attach(part)
	
	with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], expéditeur['port_sortant']) as mailServer :
		if expéditeur.has_attr('lathraios') :
			lat=expéditeur['lathraios']
			if lat[0] == '[' :
				lat=lat[1:].replace(']','')
			else :
				import base64
				lat=base64.b64encode(bytes(expéditeur['lathraios'],encoding='utf-8')).decode(encoding='utf-8')
		else :
			lat=expéditeur['mdp']
		s = mailServer.login(expéditeur['courriel'], lat)
		mailServer.send_message(msg)
		mailServer.close()
	t = str(datetime.now().strftime("%Y-%m-%d %H:%M"))
	message= t + " envoi à " + destinataire['courriel']
	msg = QMessageBox(1, "gestion des quittances", message, QMessageBox.Ok)
	msg.setStyleSheet("QLabel {color:blue;}")
	msg.exec()
	return

def main(args):
	gbl=globl()
	texte_message="""Bonjour Monsieur
	Je vous prie de trouver ci-joint le document que vous m'avez demandé.

	Salutations

	Arbiel Perlacremaz"""
	sujet = "En réponse à votre demande"

	envoi(gbl.expéditeur, gbl.destinataire,sujet,texte_message,gbl.pj)
	return 0
		
if __name__ == '__main__':
	import sys
	sys.exit(main(sys.argv))

Le retour en est le suivant :

arbiel@arbiel-NJ5x-NJ7xLU:~$ python '/home/arbiel/Bureau/Comportement SSL/pb_ssl.py'
Traceback (most recent call last):
  File "/home/arbiel/Bureau/Comportement SSL/pb_ssl.py", line 91, in <module>
    sys.exit(main(sys.argv))
  File "/home/arbiel/Bureau/Comportement SSL/pb_ssl.py", line 86, in main
    envoi(gbl.expéditeur, gbl.destinataire,sujet,texte_message,gbl.pj)
  File "/home/arbiel/Bureau/Comportement SSL/pb_ssl.py", line 56, in envoi
    with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], expéditeur['port_sortant']) as mailServer :
  File "/usr/lib/python3.10/smtplib.py", line 1050, in __init__
    SMTP.__init__(self, host, port, local_hostname, timeout,
  File "/usr/lib/python3.10/smtplib.py", line 255, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python3.10/smtplib.py", line 341, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/lib/python3.10/smtplib.py", line 1057, in _get_socket
    new_socket = self.context.wrap_socket(new_socket,
  File "/usr/lib/python3.10/ssl.py", line 513, in wrap_socket
    return self.sslsocket_class._create(
  File "/usr/lib/python3.10/ssl.py", line 1100, in _create
    self.do_handshake()
  File "/usr/lib/python3.10/ssl.py", line 1371, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)
arbiel@arbiel-NJ5x-NJ7xLU:~$

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#4 Le 20/06/2025, à 13:36

soshy

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Salut,
il est possible que ce soit juste une erreur de port. En général SSL c'est le port 465.
On peut savoir ce que ça vaut expéditeur['serveur_sortant'] et expéditeur['port_sortant'] ?

Hors ligne

#5 Le 20/06/2025, à 14:18

steph810

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Bonjour,
je rejoind @soshy
suppression de Ligne 56 a 66 et insert de test de port. Il reste inchanger par la suite
A tester.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Test problème SSL


import sys

from datetime import datetime
from bs4 import BeautifulSoup as btfs
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from PyQt5.QtWidgets import QMessageBox

class globl():
    def __init__(ἁυτόν):
        
        annexes='/home/arbiel/Bureau/Comportement SSL/annexes'
        html_correspondants='/'.join((annexes, "exp.xml"))
        with open(html_correspondants, 'r') as f :
            correspondants = btfs(f.read(), 'html.parser')
        ἁυτόν.expéditeur = correspondants.find('section', class_='expéditeur').p
        ἁυτόν.destinataire = correspondants.find('section', class_='destinataire').p
        ἁυτόν.destinateur='/'.join((annexes,sys.path[2]))
        ἁυτόν.pj='/'.join((annexes,'pièce_jointe.pdf'))
        return None

def envoi (expéditeur, destinataire, sujet, texte_message, pj):
    
    # 1. Préparer le contenu du message
            
    msg = MIMEMultipart()
    # 2. Compléter l'entête
    msg['Subject'] =  sujet
    msg['Keywords'] = "test"
    msg['From'] = expéditeur['courriel']
    msg['To'] = destinataire['courriel']
    if expéditeur.has_attr('réponse') :
        msg['Reply-To'] = expéditeur['réponse']
    if expéditeur.has_attr('copie') :
        en_copie=', '.join(expéditeur['copie'].replace(',',' ').strip().split())
        msg['Bcc']=en_copie
    msg.attach(MIMEText(texte_message, 'plain'))
    # Insertion de la pièce joints
    part = MIMEBase('application', 'pdf')
    with open(pj, "rb") as f:
        part.set_payload(f.read())
        encoders.encode_base64(part)
        part.add_header(
        'Content-Disposition',
        f'attachment; filename={pj.split("/")[-1]}',
    )	
    msg.attach(part)
    
    # Check port 465
    port = int(expéditeur['port_sortant'])
    
    if expéditeur.has_attr('lathraios') :
        lat=expéditeur['lathraios']
        if lat[0] == '[' :
            lat=lat[1:].replace(']','')
        else :
            import base64
            lat=base64.b64encode(bytes(expéditeur['lathraios'],encoding='utf-8')).decode(encoding='utf-8')
    else :
        lat=expéditeur['mdp']
    
    if port == 465:
        # Port 465 = SSL direct
        with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], port) as mailServer :
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    else:
        # Autres ports = STARTTLS
        with smtplib.SMTP(expéditeur['serveur_sortant'], port) as mailServer :
            mailServer.starttls()
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    
    t = str(datetime.now().strftime("%Y-%m-%d %H:%M"))
    message= t + " envoi à " + destinataire['courriel']
    msg = QMessageBox(1, "gestion des quittances", message, QMessageBox.Ok)
    msg.setStyleSheet("QLabel {color:blue;}")
    msg.exec()
    return

def main(args):
    gbl=globl()
    texte_message="""Bonjour Monsieur
	Je vous prie de trouver ci-joint le document que vous m'avez demandé.

	Salutations

	Arbiel Perlacremaz"""
    sujet = "En réponse à votre demande"

    envoi(gbl.expéditeur, gbl.destinataire,sujet,texte_message,gbl.pj)
    return 0
		
if __name__ == '__main__': 
    import sys 
    sys.exit(main(sys.argv))

Dernière modification par steph810 (Le 20/06/2025, à 14:19)

Hors ligne

#6 Le 20/06/2025, à 14:57

Arbiel

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Bonjour

balise expéditeur a écrit :

<p expéditeur='quelqu'un'
courriel='cmjmb@pm.me'
serveur_sortant=127.0.0.1
port_sortant=1025
mdp=

La messagerie Protonmail chiffre les courriels de bout en bout, c'est-à-dire dès la sortie de mon ordinateur jusqu'à l'entrée dans le terminal du destinataire si celui-ci est également abonné à cette messagerie, ou jusqu'à la sortie du domaine dans le cas contraire.

À priori, les courriels sont traités, en sortie comme en entrée,  par la page internet. Pour permettre aux utilisateurs de communiquer par d'autres moyens, comme, par exemple, Thunderbird, Proton propose un outil, le "Bridge", alors accessible par l'adresse 127.0.0.1 et avec le port 1025.

Le problème ne provient pas du port, mais d'une incompatibilité dans la négociation des paramètres de sécurité entre l'émetteur et le récepteur. J'avais déjà réussi à envoyer un courriel vers le destinateur d'un autre domaine. Je vais essayer de le retrouver pour refaire un test.

Arbiel

Dernière modification par Arbiel (Le 20/06/2025, à 16:59)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#7 Le 20/06/2025, à 15:07

steph810

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

re,
meme chose juste ajouter la condition, ca reste du copier coller enfin tester:
Ligne 58,71

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Test problème SSL


import sys

from datetime import datetime
from bs4 import BeautifulSoup as btfs
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from PyQt5.QtWidgets import QMessageBox

class globl():
    def __init__(ἁυτόν):
        
                annexes='/home/arbiel/Bureau/Comportement SSL/annexes'
        html_correspondants='/'.join((annexes, "exp.xml"))
        with open(html_correspondants, 'r') as f :
            correspondants = btfs(f.read(), 'html.parser')
        ἁυτόν.expéditeur = correspondants.find('section', class_='expéditeur').p
        ἁυτόν.destinataire = correspondants.find('section', class_='destinataire').p
        ἁυτόν.destinateur='/'.join((annexes,sys.path[2]))
        ἁυτόν.pj='/'.join((annexes,'pièce_jointe.pdf'))
        return None

def envoi (expéditeur, destinataire, sujet, texte_message, pj):
    
    # 1. Préparer le contenu du message

    msg = MIMEMultipart()    
    # 2. Compléter l'entête
    msg['Subject'] =  sujet
    msg['Keywords'] = "test"
    msg['From'] = expéditeur['courriel']
    msg['To'] = destinataire['courriel']
    if expéditeur.has_attr('réponse') :
        msg['Reply-To'] = expéditeur['réponse']
    if expéditeur.has_attr('copie') :
        en_copie=', '.join(expéditeur['copie'].replace(',',' ').strip().split())
        msg['Bcc']=en_copie
    msg.attach(MIMEText(texte_message, 'plain'))    
    # Insertion de la pièce joints
    part = MIMEBase('application', 'pdf')
    with open(pj, "rb") as f:
        part.set_payload(f.read())
        encoders.encode_base64(part)
        part.add_header(
        'Content-Disposition',
        f'attachment; filename={pj.split("/")[-1]}',
    )	
    msg.attach(part)
    
    # *** MODIFICATION *** - Check port 465
    port = int(expéditeur['port_sortant'])
    
    if expéditeur.has_attr('lathraios') :
        lat=expéditeur['lathraios']
        if lat[0] == '[' :
            lat=lat[1:].replace(']','')
        else :
            import base64
            lat=base64.b64encode(bytes(expéditeur['lathraios'],encoding='utf-8')).decode(encoding='utf-8')
    else :
        lat=expéditeur['mdp']
    
    # *** MODIFICATION *** - Gestion spécifique Proton Bridge et ports
    if expéditeur['serveur_sortant'] == '127.0.0.1':
        # Proton Bridge - pas de SSL/TLS
        with smtplib.SMTP(expéditeur['serveur_sortant'], port) as mailServer :
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    elif port == 465:
        # Port 465 = SSL direct
        with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], port) as mailServer :
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    else:
        # Autres ports = STARTTLS
        with smtplib.SMTP(expéditeur['serveur_sortant'], port) as mailServer :
            mailServer.starttls()
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    
    t = str(datetime.now().strftime("%Y-%m-%d %H:%M"))
    message= t + " envoi à " + destinataire['courriel']
    msg = QMessageBox(1, "gestion des quittances", message, QMessageBox.Ok)
    msg.setStyleSheet("QLabel {color:blue;}")
    msg.exec()
    return

def main(args):
    gbl=globl()
    texte_message="""Bonjour Monsieur
	Je vous prie de trouver ci-joint le document que vous m'avez demandé.

	Salutations

	Arbiel Perlacremaz"""
    sujet = "En réponse à votre demande"

    envoi(gbl.expéditeur, gbl.destinataire,sujet,texte_message,gbl.pj)
    return 0
		
if __name__ == '__main__': 
    import sys 
    sys.exit(main(sys.argv))

Hors ligne

#8 Le 20/06/2025, à 15:43

soshy

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

@steph810: la doc de config thunderbird en utilisant proton bridge spécifie d'utiliser starttls (https://proton.me/support/protonmail-br … underbird/)

Dernière modification par soshy (Le 20/06/2025, à 15:51)

Hors ligne

#9 Le 20/06/2025, à 17:15

Arbiel

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

@soshy

Effectivement, il faut utiliser starttls avec le bridge de protonmail. Il n'est d'ailleurs pas possible de modifier ce choix dans l'écran de configuration du bridge.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#10 Le 20/06/2025, à 18:57

soshy

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

J'ai fait la remarque pour que tu corriges ton script wink

# *** MODIFICATION *** - Gestion spécifique Proton Bridge et ports
    if expéditeur['serveur_sortant'] == '127.0.0.1':
        # Proton Bridge - pas de SSL/TLS
...

La proposition initiale étant probablement suffisante.

Dernière modification par soshy (Le 20/06/2025, à 18:59)

Hors ligne

#11 Le 20/06/2025, à 19:39

steph810

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Voilà,
il faudra me dire, ajout commentaire et simplement l'appel mailserver.starttls() ligne 75
il lui faut testes.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Test problème SSL


import sys

from datetime import datetime
from bs4 import BeautifulSoup as btfs
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from PyQt5.QtWidgets import QMessageBox

class globl():
    def __init__(ἁυτόν):
        
                annexes='/home/arbiel/Bureau/Comportement SSL/annexes'
        html_correspondants='/'.join((annexes, "exp.xml"))
        with open(html_correspondants, 'r') as f :
            correspondants = btfs(f.read(), 'html.parser')
        ἁυτόν.expéditeur = correspondants.find('section', class_='expéditeur').p
        ἁυτόν.destinataire = correspondants.find('section', class_='destinataire').p
        ἁυτόν.destinateur='/'.join((annexes,sys.path[2]))
        ἁυτόν.pj='/'.join((annexes,'pièce_jointe.pdf'))
        return None

def envoi (expéditeur, destinataire, sujet, texte_message, pj):
    
    # 1. Préparer le contenu du message

    msg = MIMEMultipart()    
    # 2. Compléter l'entête
    msg['Subject'] =  sujet
    msg['Keywords'] = "test"
    msg['From'] = expéditeur['courriel']
    msg['To'] = destinataire['courriel']
    if expéditeur.has_attr('réponse') :
        msg['Reply-To'] = expéditeur['réponse']
    if expéditeur.has_attr('copie') :
        en_copie=', '.join(expéditeur['copie'].replace(',',' ').strip().split())
        msg['Bcc']=en_copie
    msg.attach(MIMEText(texte_message, 'plain'))    
    # Insertion de la pièce joints
    part = MIMEBase('application', 'pdf')
    with open(pj, "rb") as f:
        part.set_payload(f.read())
        encoders.encode_base64(part)
        part.add_header(
        'Content-Disposition',
        f'attachment; filename={pj.split("/")[-1]}',
    )	
    msg.attach(part)
    
    # *** MODIFICATION *** - Check port 465
    port = int(expéditeur['port_sortant'])
    
    if expéditeur.has_attr('lathraios') :
        lat=expéditeur['lathraios']
        if lat[0] == '[' :
            lat=lat[1:].replace(']','')
        else :
            import base64
            lat=base64.b64encode(bytes(expéditeur['lathraios'],encoding='utf-8')).decode(encoding='utf-8')
    else :
        lat=expéditeur['mdp']
    
    # *** MODIFICATION *** - Gestion spécifique Proton Bridge et ports
    if expéditeur['serveur_sortant'] == '127.0.0.1':
        # Proton Bridge - utilise STARTTLS par défaut (port 1025)
        with smtplib.SMTP(expéditeur['serveur_sortant'], port) as mailServer :
            mailServer.starttls()
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    elif port == 465:
        # Port 465 = SSL direct
        with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], port) as mailServer :
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    else:
        # Autres ports = STARTTLS
        with smtplib.SMTP(expéditeur['serveur_sortant'], port) as mailServer :
            mailServer.starttls()
            s = mailServer.login(expéditeur['courriel'], lat)
            mailServer.send_message(msg)
            mailServer.close()
    
    t = str(datetime.now().strftime("%Y-%m-%d %H:%M"))
    message= t + " envoi à " + destinataire['courriel']
    msg = QMessageBox(1, "gestion des quittances", message, QMessageBox.Ok)
    msg.setStyleSheet("QLabel {color:blue;}")
    msg.exec()
    return

def main(args):
    gbl=globl()
    texte_message="""Bonjour Monsieur
	Je vous prie de trouver ci-joint le document que vous m'avez demandé.

	Salutations

	Arbiel Perlacremaz"""
    sujet = "En réponse à votre demande"

    envoi(gbl.expéditeur, gbl.destinataire,sujet,texte_message,gbl.pj)
    return 0
		
if __name__ == '__main__': 
    import sys 
    sys.exit(main(sys.argv))

Dernière modification par steph810 (Le 20/06/2025, à 19:40)

Hors ligne

#12 Le 20/06/2025, à 19:50

steph810

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

re,
ont sais jamais mais vous pouvez rajouter ceci sous la lign 59 pour ajuster le port.
je pense ont est pas mal.

    
    # *** MODIFICATION *** - Ajustement automatique du port pour Proton Bridge
    if expéditeur['serveur_sortant'] == '127.0.0.1' and port != 1025:
        print(f"Attention: Port {port} pour Proton Bridge, port recommandé: 1025")
        # Optionnel: forcer le port 1025 pour Proton Bridge
        # port = 1025
    

Hors ligne

#13 Le 21/06/2025, à 12:02

Arbiel

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Bonjour

J'ai modifié le script à plusieurs reprises. Je le présente de nouveau

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Test problème SSL


import sys

from bs4 import BeautifulSoup as btfs
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

class globl():
	def __init__(ἁυτόν):

		annexes='/home/arbiel/Bureau/Comportement SSL/annexes'
		html_correspondants='/'.join((annexes, "exp.xml"))
		with open(html_correspondants, 'r') as f :
			correspondants = btfs(f.read(), 'html.parser')
		ἁυτόν.expéditeur = correspondants.find('section', class_='expéditeur').p
		print('expéditeur', ἁυτόν.expéditeur['courriel'])
		ἁυτόν.destinataire = correspondants.find('section', class_='destinataire').p
		print('destinataire', ἁυτόν.destinataire['courriel'])
#		ἁυτόν.destinateur='/'.join((annexes,sys.path[2]))
		ἁυτόν.pj='/'.join((annexes,'pièce_jointe.pdf'))
		return None
	
def envoi (expéditeur, destinataire, sujet, texte_message, pj):
	
	# 1. Préparer le contenu du message

	msg = MIMEMultipart()
	# 2. Compléter l'entête
	msg['Subject'] =  sujet
	msg['Keywords'] = "test"
	msg['From'] = expéditeur['courriel']
	msg['To'] = destinataire['courriel']
	print(destinataire)
#	if expéditeur.has_attr('réponse') :
#		msg['Reply-To'] = expéditeur['réponse']
#	if expéditeur.has_attr('copie') :
#		en_copie=', '.join(expéditeur['copie'].replace(',',' ').strip().split())
#		msg['Bcc']=en_copie
	msg.attach(MIMEText(texte_message, 'plain'))
# Insertion de la pièce joints
	part = MIMEBase('application', 'pdf')
	with open(pj, 'rb') as f:
		part.set_payload(f.read())
		encoders.encode_base64(part)
		part.add_header(
		'Content-Disposition',
		f'attachment; filename={pj.split("/")[-1]}',
	)	
	msg.attach(part)
	
     # *** MODIFICATION *** - Check port 465
	port = int(expéditeur['port_sortant'])
    
	if expéditeur.has_attr('lathraios') :
		lat=expéditeur['lathraios']
		if lat[0] == '[' :
			lat=lat[1:].replace(']','')
		else :
			import base64
			lat=base64.b64encode(bytes(expéditeur['lathraios'],encoding='utf-8')).decode(encoding='utf-8')
	else :
		lat=expéditeur['mdp']
    
	# *** MODIFICATION *** - Gestion spécifique Proton Bridge et ports
	print(expéditeur['serveur_sortant'])
	print(msg)
	if expéditeur['serveur_sortant'] == '127.0.0.1':
		# Proton Bridge - pas de SSL/TLS
		with smtplib.SMTP(expéditeur['serveur_sortant'], port) as mailServer :
			mailServer.starttls()
			s = mailServer.login(expéditeur['courriel'], lat)
			mailServer.send_message(msg)
			mailServer.close()
	elif port == 465:
		# Port 465 = SSL direct
		with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], port) as mailServer :
			s = mailServer.login(expéditeur['courriel'], lat)
			mailServer.send_message(msg)
			mailServer.close()
	else:
		# Autres ports = STARTTLS
		with smtplib.SMTP(expéditeur['serveur_sortant'], port) as mailServer :
			mailServer.starttls()
			s = mailServer.login(expéditeur['courriel'], lat)
			mailServer.send_message(msg)
			mailServer.close()
	if False :
		with smtplib.SMTP_SSL(expéditeur['serveur_sortant'], expéditeur['port_sortant']) as mailServer :
			if expéditeur.has_attr('lathraios') :
				lat=expéditeur['lathraios']
				if lat[0] == '[' :
					lat=lat[1:].replace(']','')
				else :
					import base64
					lat=base64.b64encode(bytes(expéditeur['lathraios'],encoding='utf-8')).decode(encoding='utf-8')
			else :
				lat=expéditeur['mdp']
			s = mailServer.login(expéditeur['courriel'], lat)
			mailServer.send_message(msg)
			mailServer.close()
	t = str(datetime.now().strftime("%Y-%m-%d %H:%M"))
	message= t + " envoi à " + destinataire['courriel']
	msg = QMessageBox(1, "gestion des quittances", message, QMessageBox.Ok)
	msg.setStyleSheet("QLabel {color:blue;}")
	msg.exec()
	return

def main(args):
	gbl=globl()
	texte_message="""Bonjour Monsieur
	Je vous prie de trouver ci-joint le document que vous m'avez demandé.

	Salutations

	Arbiel Perlacremaz"""
	sujet = "En réponse à votre demande"

	envoi(gbl.expéditeur, gbl.destinataire,sujet,texte_message,gbl.pj)
	return 0
		
if __name__ == '__main__':
	import sys
	sys.exit(main(sys.argv))

Il n'y a plus d'erreur sur la négociation de la sécurité, mais il y en a une sur l'ajout de la pièce jointe  :
(je n'ai conservé que la première et la dernière ligne en base64 du texte de la pièce jointe)

arbiel@arbiel-NJ5x-NJ7xLU:~$ python '/home/arbiel/Bureau/Comportement SSL/pb_ssl.py'
expéditeur remi.mathieu@protonmail.com
destinataire arbiel.perlacremaz@protonmail.com
<p courriel="arbiel.perlacremaz@protonmail.com" destinataire="M. Arbiel Perlacremaz"></p>
127.0.0.1
Content-Type: multipart/mixed; boundary="===============3027943286068992382=="
MIME-Version: 1.0
Subject: =?utf-8?q?En_r=C3=A9ponse_=C3=A0_votre_demande?=
Keywords: test
From: remi.mathieu@protonmail.com
To: arbiel.perlacremaz@protonmail.com

--===============3027943286068992382==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64

Qm9uam91ciBNb25zaWV1cgoJSmUgdm91cyBwcmllIGRlIHRyb3V2ZXIgY2ktam9pbnQgbGUgZG9j
dW1lbnQgcXVlIHZvdXMgbSdhdmV6IGRlbWFuZMOpLgoKCVNhbHV0YXRpb25zCgoJQXJiaWVsIFBl
cmxhY3JlbWF6

--===============3027943286068992382==
Content-Type: application/pdf
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: =?utf-8?q?attachment=3B_filename=3Dpi=C3=A8ce=5Fjointe=2Epdf?=

JVBERi0xLjUKJeLjz9MKMiAwIG9iago8PC9MZW5ndGggMzczMj4+c3RyZWFtCgogMC41MCB3Cltd
mGGDFQ47L27cYt5/O6gJCAplbmRzdHJlYW0KZW5kb2JqCnN0YXJ0eHJlZgoxMDg1OAolJUVPRgo=

--===============3027943286068992382==--

Traceback (most recent call last):
  File "/home/arbiel/Bureau/Comportement SSL/pb_ssl.py", line 131, in <module>
    sys.exit(main(sys.argv))
  File "/home/arbiel/Bureau/Comportement SSL/pb_ssl.py", line 126, in main
    envoi(gbl.expéditeur, gbl.destinataire,sujet,texte_message,gbl.pj)
  File "/home/arbiel/Bureau/Comportement SSL/pb_ssl.py", line 80, in envoi
    mailServer.send_message(msg)
  File "/usr/lib/python3.10/smtplib.py", line 986, in send_message
    return self.sendmail(from_addr, to_addrs, flatmsg, mail_options,
  File "/usr/lib/python3.10/smtplib.py", line 908, in sendmail
    raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, b'5.0.0 Error: failed to parse message: failed to collect attachments: mime: invalid media parameter')
arbiel@arbiel-NJ5x-NJ7xLU:~$

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#14 Le 21/06/2025, à 12:49

steph810

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

Bonjour,
Fair un essaie remplace L.55 maque guillemet.

f'attachment; filename="{pj.split("/")[-1]}"',  # Correction : filename entre guillemets doubles

Tu peut rajouter ceci aussi.

from datetime import datetime # Si tu veut la date et heures
from PyQt5.QtWidgets import QMessageBox  # pour QMessageBox

Dernière modification par steph810 (Le 21/06/2025, à 12:50)

Hors ligne

#15 Le 21/06/2025, à 14:28

Arbiel

Re : [Résolu] Modifier le comportement ssl lors de l'envoi courriel

@steph810

Bien vu. Je vais modifier mon script en conséquence.

Merci à toi steph810, et à vous, iznobe et soshy. Votre aide qui m'a été très précieuse.

La mer est à 10 km, et je vais pouvoir aller me baigner.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04, GNOME 3.36.8
24.04 en cours de tests
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne