отправка электронной почты через unix с помощью cat с uuencode - PullRequest
1 голос
/ 06 января 2020

здесь я работаю на солнце Solaris 10, раньше я пытался отправить обычное письмо с приложением и без него, и оно работало нормально со мной, но сейчас я пытаюсь найти элемент cat-file и отправить вложение в тот же адрес электронной почты, но он не работает

это мое тело файла result.txt:

Total Number of Files = 8
Total Number of Fixed Files = 4
Total Number of Notification Files = 4

Total Number of Courrpted Files = 0

Total Execution Time = 3 Seconds.

это мое тело файла data.txt:

Notification Files : 
file number 1
file number 2

unix команда:

RECEIPIENTS="mm@gmail.com"
SUBJECT="!! testtt !!"
(cat Results.txt ; uuencode Data.txt Data.txt) | mailx -s "$SUBJECT" -c mm@gmail.com,dd@gmail.com -r zz@gmail.com $RECEIPIENTS

вот что я получил после отправки электронного письма:

Total Number of Files = 8
Total Number of Fixed Files = 4
Total Number of Notification Files = 4

Total Number of Courrpted Files = 0

Total Execution Time = 3 Seconds.
begin 777 Data
M#0I.;W1I9FEC871I;VX@1FEL97,@.B -"@T*,2U#1$M(34LU2D]21DPP,#0R
M,@T*,BU#1$Q454]-2D]21DPP-S$Q- T*,RU#1$Q454]-2D]21DPP-S$Q-@T* M-"U#1$Q604Q-2D]21DPP-#0U, T*#0I&:7AE9"!&:6QE<R Z( T*#0HQ+4-$ M051'2SE*3U)&3# P,3$T#0HR+4-$051'2SE*3U)&3# P,3$U#0HS+4-$0TA.
C0U5*3U)&3#,Q.3DT#0HT+4-$0TA.0U5*3U)&3#,Q.3DU#0HU

end

примечание: если я использую echo или echo -e или прикрепляю файл с помощью uuencode без кота все работало нормально, проблема только при использовании cat с uuencode

1 Ответ

2 голосов
/ 07 января 2020

В прошлом тысячелетии было время, когда uuencode имело смысл, но вы действительно должны использовать MIME вместо этого в наши дни.

Вот простой Python 3 скрипт, который объединяет сообщение из стандартного ввода с вложением в действительное сообщение RFC822, которое вы можете отправить с sendmail или аналогичным. Это довольно близко основано на примерах документации Python.

#!/usr/bin/env python3

from email.message import EmailMessage
import sys

msg = EmailMessage()
msg['From'] = sys.argv[1]
msg['To'] = sys.argv[2]
msg['Subject'] = sys.argv[3]
# Don't mess with the preamble, the documentation is wrong to suggest you do

msg.set_content(''.join([line for line in sys.stdin]))

with open(sys.argv[4], 'r') as attachment:
    msg.add_attachment(attachment.read(), maintype='text', subtype='plain')

print(msg.as_string())

Чтобы использовать это в вашем примере,

# If `sendmail` is not in your `PATH`, maybe add it.
# For example, if you have it in `/usr/lib/sendmail`
# and `/usr/lib´ is not in your `PATH`, you can add it with
#PATH=$PATH:/usr/lib

# Don't use upper case for private variables; check spelling of "recipients"
# To demo an example of sending to multiple addresses, adds a second recipient
recipients="mm@gmail.com,another@example.com"
subject="!! testtt !!"

python3 path/to/script.py "zz@gmail.com" "$recipients" "$subject" Data.txt <Results.txt |
sendmail -oi -t

Вы можете опустить трубу на sendmail, чтобы увидеть, как выглядит сообщение. Вместо uuencode smack dab в теле сообщения он создает составное MIME-сообщение, состоящее из двух частей, одна из которых является встроенной и содержит текст из стандартного ввода, а другая правильно помечена как вложение. Это немного громоздко, но я привожу здесь пример, просто чтобы показать вам.

From: zz@gmail.com
To: mm@gmail.com,another@example.com
Subject: !! testtt !!
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="===============2189027902917283968=="

--===============2189027902917283968==
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit

Total Number of Files = 8
Total Number of Fixed Files = 4
Total Number of Notification Files = 4

Total Number of Courrpted Files = 0

Total Execution Time = 3 Seconds.

--===============2189027902917283968==
Content-Type: text/plain
Content-Transfer-Encoding: base64
MIME-Version: 1.0
Content-Disposition: attachment

Tm90aWZpY2F0aW9uIEZpbGVzIDogCmZpbGUgbnVtYmVyIDEKZmlsZSBudW1iZXIgMgo=

--===============2189027902917283968==--

Вложение довольно бесполезно base64 кодируется в этом конкретном примере; Вы можете настроить код Python, если вам абсолютно необходимо, чтобы он был удобочитаемым для человека (но тогда не было и uuencode).

(Кроме того, не знаю, почему часть тела имеет отдельный MIME-Version: заголовок - это похоже на ошибку.)

...