Attachments an E-Mail PGM senden

German support forum

Moderators: Hacker, Stefan2, white

Post Reply
STEPHANK
Junior Member
Junior Member
Posts: 24
Joined: 2019-04-18, 10:51 UTC

Attachments an E-Mail PGM senden

Post by *STEPHANK »

Ich versuche, über das Startermenü Attachments and Thunderbird zu senden. Mit einer Datei hat es auch einigermaßen geklappt.

%P%N,%N

Nur ein Komma im Dateinamen klappt nicht. Ich habe es als direkten Aufruf und auch über eine Batch Datei versucht.

"c:\Program Files\Thunderbird\Thunderbird.exe" -compose "to='xx@xx.xx',from='yy@yyg.yy',subject='%2',attachment='%1'"

Subject nur der Dateiname, attachment natürlich mit Pfad. Klappt, nur nicht wenn Komma im Dateinamen.

Eigentlich will ich aber ALLE markierten Dateien senden. Ich habe eine Weile mit lst2str rumprobiert, aber ich bekomme es einfach nicht hin.

Könnt Ihr mir helfen?
User avatar
white
Power Member
Power Member
Posts: 5895
Joined: 2003-11-19, 08:16 UTC
Location: Netherlands

Re: Attachments an E-Mail PGM senden

Post by *white »

Versuch das mal:

Kommando: Thunderbird.cmd
Parameter: %S


Thunderbird.cmd (Nach Wunsch anpassen)

Deutsche Version:

Code: Select all

@echo off
title Erstelle Thunderbird-Anhangeliste

Rem
Rem  Thunderbird.cmd v1.0, von Benutzer white, Total Commander Forum (https://www.ghisler.ch/board/)
Rem
Rem  Erstellt eine Thunderbird-E-Mail mit angehängten Dateien.
Rem
Rem  Verwendung:
Rem
Rem  Thunderbird datei [datei ...]
Rem
Rem  datei      Gibt die Datei oder Dateien an, die angehängt werden sollen.
Rem

:: Verwende DisableDelayedExpansion, um "!" in den als Parameter übergebenen Dateinamen zu bewahren
setlocal EnableExtensions DisableDelayedExpansion

::
:: Einstellungen, nach Bedarf anpassen
::
:: Betreffpräfixe (für eine Datei oder mehrere Dateien) können die Maske {COUNT} für die Dateianzahl enthalten
::
set "receiver_email=xx@xx.xx"
set "sender_email=yy@yy.yy"
set "subject_prefix1=Datei: "
set "subject_prefix2=Dateien ({COUNT}): "
set "thunderbird_path=c:\Program Files\Mozilla Thunderbird\thunderbird.exe"

:: Variablen initialisieren
set "file_count=0"

:: Anfängliche Fortschrittsmeldung anzeigen
<nul set /p=Erstelle Thunderbird-Anhangeliste

:: Jeden Dateinamen, der als Argument übergeben wurde, verarbeiten
:process_filename
set "fullname=%~f1"
set "basename=%~nx1"
set "attributes=%~a1"
if not defined fullname goto :fertig_dateinamen_verarbeiten
if not defined basename call :warn_skip_file fullname & goto :next_argument
if not defined attributes call :warn_skip_file fullname & goto :next_argument
if /I "%attributes:~0,1%"=="d" call :warn_skip_file fullname & goto :next_argument
set /a file_count+=1
:: Dateinamen kodieren; langsame Methode verwenden, wenn der vollständige Dateiname ein Ausrufezeichen enthält
set fullname | findstr /I /R /C:"^fullname=.*!" >nul
if %ERRORLEVEL% EQU 0 (
	call :encode_filename_slow fullname encoded_fullname
) else (
	call :encode_filename_fast fullname encoded_fullname
)
:: Basisnamen kodieren; langsame Methode verwenden, wenn der Basisname ein Ausrufezeichen enthält
set basename | findstr /I /R /C:"^basename=.*!" >nul
if %ERRORLEVEL% EQU 0 (
	call :encode_basename_slow basename encoded_basename
) else (
	call :encode_basename_fast basename encoded_basename
)
:: Anhangeliste und Betreffliste erstellen
if %file_count%==1 (
	set "attachment_list=file:///%encoded_fullname%"
	set "subject_list=[%encoded_basename%]"
) else (
	set "attachment_list=%attachment_list%,file:///%encoded_fullname%"
	set "subject_list=%subject_list% [%encoded_basename%]"
)
<nul set /p=.
:next_argument
shift /1
goto :process_filename
:fertig_dateinamen_verarbeiten

:: Abbruch, wenn keine Dateien gefunden wurden
if %file_count%==0 (
	echo. & echo.
	echo FEHLER: "Keine Dateien gefunden!" (Thunderbird nicht gestartet^)
	pause
	exit /b 1
)

:: Betreffzeile erstellen
if %file_count%==1 (
	set "prefix=%subject_prefix1%"
) else (
	set "prefix=%subject_prefix2%"
)
call set "prefix=%%prefix:{COUNT}=%file_count%%%"
set "subject=%prefix%%subject_list%"

:: Thunderbird mit dem Compose-Parameter starten
start "E-Mail erstellen" "%thunderbird_path%" -compose "to='%receiver_email%',from='%sender_email%',subject='%subject%',attachment='%attachment_list%'"

endlocal
exit /b 0

::
:: warn_skip_file: Warnung anzeigen, wenn eine Datei übersprungen wird
::
:: Parameter:
::   %1: Name der Variable, die den Dateinamen enthält
::
:warn_skip_file
setlocal EnableDelayedExpansion
set "dateiname=!%1!"
echo. & echo.
echo WARNUNG: "Datei nicht gefunden^!" (Datei wird übersprungen)
if defined dateiname (
	set dateiname | findstr /I /R /C:"^dateiname="
) else (
	echo dateiname=
)
pause
endlocal
exit /b

::
:: encode_filename_slow: Dateinamen kodieren (langsame Methode) für die Thunderbird-Anhangeliste (% zu %25, , zu %2C, ' zu %27)
::
:: Parameter:
::   %1: Name der Variable, die den Dateinamen enthält
::   %2: Name der Variable zum Speichern des kodierten Dateinamens
::
:encode_filename_slow
setlocal EnableDelayedExpansion
set "filename=!%1!"
set "encoded_filename="
set "idx=0"
if not defined filename goto :done_encoding_filename
:get_char_filename
set "char=!filename:~%idx%,1!"
if defined char (
	if "!char!"=="%%" (
		set "encoded_filename=!encoded_filename!%%25"
	) else if "!char!"=="," (
		set "encoded_filename=!encoded_filename!%%2C"
	) else if "!char!"=="'" (
		set "encoded_filename=!encoded_filename!%%27"
	) else (
		set "encoded_filename=!encoded_filename!!char!"
	)
	set /a idx+=1
	goto :get_char_filename
)
:done_encoding_filename
endlocal & set "%2=%encoded_filename%"
exit /b

::
:: encode_filename_fast: Dateinamen kodieren (schnelle Methode) für die Thunderbird-Anhangeliste (% zu %25, , zu %2C, ' zu %27)
::
:: Parameter:
::   %1: Name der Variable, die den Dateinamen enthält
::   %2: Name der Variable zum Speichern des kodierten Dateinamens
::
:encode_filename_fast
setlocal EnableDelayedExpansion
set "filename=!%1!"
set "encoded_filename=!filename:%%=%%25!"
set "encoded_filename=!encoded_filename:,=%%2C!"
set "encoded_filename=!encoded_filename:'=%%27!"
endlocal & set "%2=%encoded_filename%"
exit /b

::
:: encode_basename_slow: Basisnamen kodieren (langsame Methode) für die Betreffzeile von Thunderbird (ersetzt ', durch '_KOMMA_')
::
:: Parameter:
::   %1: Name der Variable, die den Basisnamen enthält
::   %2: Name der Variable zum Speichern des kodierten Basisnamens
::
:encode_basename_slow
setlocal EnableDelayedExpansion
set "basename=!%1!"
set "encoded_basename="
set "idx=0"
if not defined basename goto :done_encoding_basename
:get_chars_basename
set "chars=!basename:~%idx%,2!"
if defined chars (
	if "!chars!"=="'," (
		set "encoded_basename=!encoded_basename!'_KOMMA_"
		set /a idx+=2
	) else (
		set "char=!basename:~%idx%,1!"
		set "encoded_basename=!encoded_basename!!char!"
		set /a idx+=1
	)
	goto :get_chars_basename
)
:done_encoding_basename
endlocal & set "%2=%encoded_basename%"
exit /b

::
:: encode_basename_fast: Basisnamen kodieren (schnelle Methode) für die Betreffzeile von Thunderbird (ersetzt ', durch '_KOMMA_')
::
:: Parameter:
::   %1: Name der Variable, die den Basisnamen enthält
::   %2: Name der Variable zum Speichern des kodierten Basisnamens
::
:encode_basename_fast
setlocal EnableDelayedExpansion
set "basename=!%1!"
set "encoded_basename=!basename:',='_KOMMA_!"
endlocal & set "%2=%encoded_basename%"
exit /b
Englische Version:

Code: Select all

@echo off
title Creating Thunderbird attachment list

Rem
Rem  Thunderbird.cmd v1.0, by user white, Total Commander forum (https://www.ghisler.ch/board/)
Rem
Rem  Compose a Thunderbird email with attached files.
Rem
Rem  Usage:
Rem
Rem  Thunderbird file [file ...]
Rem
Rem  file       Specifies the file or files to be attached.
Rem

:: Use DisableDelayedExpansion to preserve "!" in filenames passed as parameters
setlocal EnableExtensions DisableDelayedExpansion

::
:: Settings, adjust to preference
::
:: Subject prefixes (for 1 file or multiple files) can include the mask {COUNT} for file count
::
set "receiver_email=xx@xx.xx"
set "sender_email=yy@yy.yy"
set "subject_prefix1=File: "
set "subject_prefix2=Files ({COUNT}): "
set "thunderbird_path=c:\Program Files\Mozilla Thunderbird\thunderbird.exe"

:: Initialize variables
set "file_count=0"

:: Display initial progress message
<nul set /p=Creating Thunderbird attachment list

:: Process each filename passed as argument
:process_filename
set "fullname=%~f1"
set "basename=%~nx1"
set "attributes=%~a1"
if not defined fullname goto :done_processing_filenames
if not defined basename call :warn_skip_file fullname & goto :next_argument
if not defined attributes call :warn_skip_file fullname & goto :next_argument
if /I "%attributes:~0,1%"=="d" call :warn_skip_file fullname & goto :next_argument
set /a file_count+=1
:: Encode filename; use slow method if the full filename contains an exclamation mark
set fullname | findstr /I /R /C:"^fullname=.*!" >nul
if %ERRORLEVEL% EQU 0 (
	call :encode_filename_slow fullname encoded_fullname
) else (
	call :encode_filename_fast fullname encoded_fullname
)
:: Encode basename; use slow method if the base name contains an exclamation mark
set basename | findstr /I /R /C:"^basename=.*!" >nul
if %ERRORLEVEL% EQU 0 (
	call :encode_basename_slow basename encoded_basename
) else (
	call :encode_basename_fast basename encoded_basename
)
:: Build attachment and subject lists
if %file_count%==1 (
	set "attachment_list=file:///%encoded_fullname%"
	set "subject_list=[%encoded_basename%]"
) else (
	set "attachment_list=%attachment_list%,file:///%encoded_fullname%"
	set "subject_list=%subject_list% [%encoded_basename%]"
)
<nul set /p=.
:next_argument
shift /1
goto :process_filename
:done_processing_filenames

:: Abort if no files found
if %file_count%==0 (
	echo. & echo.
	echo ERROR: "No files found!" (Thunderbird not started^)
	pause
	exit /b 1
)

:: Construct the subject line
if %file_count%==1 (
	set "prefix=%subject_prefix1%"
) else (
	set "prefix=%subject_prefix2%"
)
call set "prefix=%%prefix:{COUNT}=%file_count%%%"
set "subject=%prefix%%subject_list%"

:: Launch Thunderbird with the compose parameter
start "Compose email" "%thunderbird_path%" -compose "to='%receiver_email%',from='%sender_email%',subject='%subject%',attachment='%attachment_list%'"

endlocal
exit /b 0

::
:: warn_skip_file: Show warning when a file is skipped
::
:: Parameters:
::   %1: Variable name holding the filename
::
:warn_skip_file
setlocal EnableDelayedExpansion
set "filename=!%1!"
echo. & echo.
echo WARNING: "File not found^!" (file is skipped)
if defined filename (
	set filename | findstr /I /R /C:"^filename="
) else (
	echo filename=
)
pause
endlocal
exit /b

::
:: encode_filename_slow: Encode filename (slow method) for Thunderbird's attachment list (% to %25, , to %2C, ' to %27)
::
:: Parameters:
::   %1: Variable name holding the filename
::   %2: Variable name for storing the encoded filename
::
:encode_filename_slow
setlocal EnableDelayedExpansion
set "filename=!%1!"
set "encoded_filename="
set "idx=0"
if not defined filename goto :done_encoding_filename
:get_char_filename
set "char=!filename:~%idx%,1!"
if defined char (
	if "!char!"=="%%" (
		set "encoded_filename=!encoded_filename!%%25"
	) else if "!char!"=="," (
		set "encoded_filename=!encoded_filename!%%2C"
	) else if "!char!"=="'" (
		set "encoded_filename=!encoded_filename!%%27"
	) else (
		set "encoded_filename=!encoded_filename!!char!"
	)
	set /a idx+=1
	goto :get_char_filename
)
:done_encoding_filename
endlocal & set "%2=%encoded_filename%"
exit /b

::
:: encode_filename_fast: Encode filename (fast method) for Thunderbird's attachment list (% to %25, , to %2C, ' to %27)
::
:: Parameters:
::   %1: Variable name holding the filename
::   %2: Variable name for storing the encoded filename
::
:encode_filename_fast
setlocal EnableDelayedExpansion
set "filename=!%1!"
set "encoded_filename=!filename:%%=%%25!"
set "encoded_filename=!encoded_filename:,=%%2C!"
set "encoded_filename=!encoded_filename:'=%%27!"
endlocal & set "%2=%encoded_filename%"
exit /b

::
:: encode_basename_slow: Encode basename (slow method) for Thunderbird's subject line (replace ', with '_COMMA_)
::
:: Parameters:
::   %1: Variable name holding the basename
::   %2: Variable name for storing the encoded basename
::
:encode_basename_slow
setlocal EnableDelayedExpansion
set "basename=!%1!"
set "encoded_basename="
set "idx=0"
if not defined basename goto :done_encoding_basename
:get_chars_basename
set "chars=!basename:~%idx%,2!"
if defined chars (
	if "!chars!"=="'," (
		set "encoded_basename=!encoded_basename!'_COMMA_"
		set /a idx+=2
	) else (
		set "char=!basename:~%idx%,1!"
		set "encoded_basename=!encoded_basename!!char!"
		set /a idx+=1
	)
	goto :get_chars_basename
)
:done_encoding_basename
endlocal & set "%2=%encoded_basename%"
exit /b

::
:: encode_basename_fast: Encode basename (fast method) for Thunderbird's subject line (replace ', with '_COMMA_)
::
:: Parameters:
::   %1: Variable name holding the basename
::   %2: Variable name for storing the encoded basename
::
:encode_basename_fast
setlocal EnableDelayedExpansion
set "basename=!%1!"
set "encoded_basename=!basename:',='_COMMA_!"
endlocal & set "%2=%encoded_basename%"
exit /b
STEPHANK
Junior Member
Junior Member
Posts: 24
Joined: 2019-04-18, 10:51 UTC

Re: Attachments an E-Mail PGM senden

Post by *STEPHANK »

Vielen Dank! Ich bekomme eine Fehlermeldung. Schwer zu debuggen, aber ich glaube

attachment='%list%'

braucht Dateinamen mit Pfad.
User avatar
white
Power Member
Power Member
Posts: 5895
Joined: 2003-11-19, 08:16 UTC
Location: Netherlands

Re: Attachments an E-Mail PGM senden

Post by *white »

STEPHANK wrote: 2025-05-03, 03:01 UTC braucht Dateinamen mit Pfad.
Leider habe ich es nur mit laufendem Thunderbird getestet.

Ich habe die Batchdatei jetzt in meiner vorherigen Datei aktualisiert. Bitte versuchen Sie es erneut.
STEPHANK
Junior Member
Junior Member
Posts: 24
Joined: 2019-04-18, 10:51 UTC

Re: Attachments an E-Mail PGM senden

Post by *STEPHANK »

Wow! Das funktioniert prima! Ich habe sehr intensiv getestet, mit Files in mehreren Verzeichnissen, Sonderzeichen usw.

Vielen vielen Dank!

Wenn man auf dem Doppelpunkt steht, gibt es (natürlich) keine Datei.

Ich konnte nur noch nicht rausfinden, wie ich die Anzahl der Dateien abfangen kann. Ich hatte versucht zu testen ob %S1 = %S2 ist, aber das geht nicht.

Also
0 Dateien set "subject=xyz"
1 Datei set "subject=Dateie: "
>1 set "subject=Dateien: "

Aber das ist nur mein Drang zu Perfektion ;-)
Last edited by STEPHANK on 2025-05-03, 12:48 UTC, edited 1 time in total.
User avatar
white
Power Member
Power Member
Posts: 5895
Joined: 2003-11-19, 08:16 UTC
Location: Netherlands

Re: Attachments an E-Mail PGM senden

Post by *white »

STEPHANK wrote: 2025-05-03, 11:08 UTC Vielen vielen Dank!
Gern geschehen. Ich habe ein weiteres Problem behoben, bei dem ein Dateiname ein Prozentzeichen enthält. Ich habe diesen Code hinzugefügt:

Code: Select all

:: Kodiert Prozentzeichen im Dateiname
set "fn=!fn:%%=%%25!"
Ich habe die Batchdatei jetzt in meiner vorherigen Datei aktualisiert.
STEPHANK
Junior Member
Junior Member
Posts: 24
Joined: 2019-04-18, 10:51 UTC

Re: Attachments an E-Mail PGM senden

Post by *STEPHANK »

Oh super, war mir gar nicht aufgefallen.
User avatar
white
Power Member
Power Member
Posts: 5895
Joined: 2003-11-19, 08:16 UTC
Location: Netherlands

Re: Attachments an E-Mail PGM senden

Post by *white »

STEPHANK wrote: 2025-05-03, 13:20 UTC Oh super, war mir gar nicht aufgefallen.
Nun, ich habe mich nicht deutlich genug ausgedrückt. Das Problem trat nur auf, wenn auf das Prozentzeichen eine Hexadezimalzahl folgte.
STEPHANK
Junior Member
Junior Member
Posts: 24
Joined: 2019-04-18, 10:51 UTC

Re: Attachments an E-Mail PGM senden

Post by *STEPHANK »

Ahh, okay, das macht Sinn. Ich hatte wirklich viel getestet, aber Prozentzeichen und Hexadezimalzahl nicht ;-)
User avatar
white
Power Member
Power Member
Posts: 5895
Joined: 2003-11-19, 08:16 UTC
Location: Netherlands

Re: Attachments an E-Mail PGM senden

Post by *white »

STEPHANK wrote: 2025-05-03, 14:53 UTC Ahh, okay, das macht Sinn. Ich hatte wirklich viel getestet, aber Prozentzeichen und Hexadezimalzahl nicht ;-)
Es besteht noch ein Problem mit Ausrufezeichen.

Ich konnte keine Lösung finden, die Dateinamen mit Prozentzeichen und Ausrufezeichen unterstützt und trotzdem schnell funktioniert. Deshalb habe ich jetzt eine schnelle Version (mit dem bekannten Problem) und eine langsame Version (mit Fortschrittsanzeige ;) ) hinzugefügt.

Ich habe die Batchdateien in meinem vorherigen Beitrag aktualisiert.
STEPHANK
Junior Member
Junior Member
Posts: 24
Joined: 2019-04-18, 10:51 UTC

Re: Attachments an E-Mail PGM senden

Post by *STEPHANK »

Funktioniert echt super, vielen Dank!

Hast Du eine Idee, wie man abfragen kann, wieviele Dateien selektiert sind? Dann könnte man bei 0 die Ausführung abbrechen oder bei 1 den Text anpassen.
User avatar
white
Power Member
Power Member
Posts: 5895
Joined: 2003-11-19, 08:16 UTC
Location: Netherlands

Re: Attachments an E-Mail PGM senden

Post by *white »

STEPHANK wrote: 2025-05-11, 14:29 UTC Hast Du eine Idee, wie man abfragen kann, wieviele Dateien selektiert sind? Dann könnte man bei 0 die Ausführung abbrechen oder bei 1 den Text anpassen.
Ich habe die Batch-Dateien überarbeitet. Die gewünschten Optionen sind jetzt dabei, Fehler werden verhindert, und falls eine Datei fehlt, gibt es eine Warnung.

Ich habe die Batchdateien in meinem vorherigen Beitrag erneut aktualisiert.
eylnet
New Member
New Member
Posts: 1
Joined: 2025-05-12, 13:26 UTC

Re: Attachments an E-Mail PGM senden

Post by *eylnet »

Tolle Funktion! Sowas habe ich schon lange nicht gesucht. Leider klappt es nicht, wenn man auf einem Folder steht. Könnt Ihr da nochmal reinschauen?
STEPHANK
Junior Member
Junior Member
Posts: 24
Joined: 2019-04-18, 10:51 UTC

Re: Attachments an E-Mail PGM senden

Post by *STEPHANK »

Super! Vielen Dank! Funktioniert prima!
User avatar
white
Power Member
Power Member
Posts: 5895
Joined: 2003-11-19, 08:16 UTC
Location: Netherlands

Re: Attachments an E-Mail PGM senden

Post by *white »

STEPHANK wrote: 2025-05-12, 14:04 UTC Super! Vielen Dank! Funktioniert prima!
Ich habe die beiden Versionen nun zu einer zusammengefasst. Bei Bedarf wird automatisch die langsame Methode verwendet.

Es gibt jetzt eine deutsche und eine englische Version.

Beachten Sie, dass ich jetzt den Standardinstallationsordner "c:\Programme\Mozilla Thunderbird\thunderbird.exe" verwende. Sie müssen diesen daher an Ihr System anpassen, wenn Sie einen anderen Ordner verwenden.

Ich habe die Batchdateien in meinem vorherigen Beitrag erneut aktualisiert.
Post Reply