Ruby 在Unix下以编程方式发送带有附件的电子邮件的可移植方式

Ruby 在Unix下以编程方式发送带有附件的电子邮件的可移植方式,ruby,email,unix,Ruby,Email,Unix,我希望有一种可移植的Unix方式,以编程方式发送带有附件的电子邮件。发送电子邮件的“标准”Unix方式似乎是mail(1),但似乎没有指定附件的可移植方式。(是的,我知道有些版本的邮件(1)有一个-a或-a选项,但这不是标准的,所以我不能依赖它。) 为此,我将使用ruby,但我需要一个通用的解决方案,即一个特殊的ruby配置,包括(比如)使用Net::SMTP并指定SMTP服务器等细节。不应在应用程序中,但应用程序应发出类似于mail的命令,并且系统应从该命令发送邮件(使用合适的~/.mailr

我希望有一种可移植的Unix方式,以编程方式发送带有附件的电子邮件。发送电子邮件的“标准”Unix方式似乎是mail(1),但似乎没有指定附件的可移植方式。(是的,我知道有些版本的邮件(1)有一个
-a
-a
选项,但这不是标准的,所以我不能依赖它。)


为此,我将使用ruby,但我需要一个通用的解决方案,即一个特殊的ruby配置,包括(比如)使用Net::SMTP并指定SMTP服务器等细节。不应在应用程序中,但应用程序应发出类似于
mail
的命令,并且系统应从该命令发送邮件(使用合适的~/.mailrc或其他任何东西)。

mail
命令仅在能够找到SMTP主机时才起作用。有很多方法可以做到这一点(sSMTP、Postfix、sendmail)。最“正常”的方式是在计算机上运行
sendmail
,这意味着
localhost
本身就是一个SMTP服务器。如果没有安装
sendmail
,我不知道如何自动获取SMTP配置

因此,假设您从纯Ruby邮件附件中了解SMTP服务器(
localhost
):

require 'net/smtp'

filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m")   # base64

marker = "AUNIQUEMARKER"
body = <<EOF
This is a test email to send an attachement.
EOF

# Define the main headers.
part1 = <<EOF
From: Private Person <me@fromdomain.net>
To: A Test User <test@todmain.com>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary = #{marker}
--#{marker}
EOF

# Define the message action
part2 = <<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit

#{body}
--#{marker}
EOF

# Define the attachment section
part3 = <<EOF
Content-Type: multipart/mixed; name = \"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename = "#{filename}"

#{encodedcontent}
--#{marker}--
EOF

mailtext = part1 + part2 + part3

# Let's put our code in safe area
begin 
   Net::SMTP.start('localhost') do |smtp|
      smtp.sendmail(mailtext, 'me@fromdomain.net', ['test@todmain.com'])
   end
rescue Exception => e  
   print "Exception occured: " + e  
end
需要“net/smtp”
filename=“/tmp/test.txt”
#读取文件并将其编码为base64格式
filecontent=File.read(文件名)
encodedcontent=[filecontent].pack(“m”)#base64
marker=“AUNIQUEMARKER”

body=很高兴知道为什么会有反对票。是什么让使用“邮件”变得通用,而使用“Net::SMTP”却不是?你似乎在要求一个不存在的虚构的外部程序。@Joe:我被这句话弄糊涂了-邮件(1)自从我知道它以来(大约1980年左右)一直是Unix的一部分,所以我认为它可以被视为“标准”。我提到了邮件(1)程序,正是由于这个原因,但是我愿意考虑其他解决方案,只要它们不涉及安装某些随机平台上某个特定版本可能存在的其他随机程序。“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于堆栈溢出来说是离题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决问题所做的工作。”。在发布更多Qs.Tnx之前,请阅读