在Unix下以编程方式发送带附件的电子邮件的便携方式

时间:2017-12-24 03:22:58

标签: ruby email unix

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

我将使用ruby,但我想要一个通用解决方案,即一个特殊的ruby配置,涉及(比如说)使用Net :: SMTP并指定像SMTP服务器这样的细节和C。 应该在应用程序中,但是应用程序应该发出像mail <some other stuff here>这样的命令,系统应该从那里发送邮件(使用合适的〜/ .mailrc或其他)。

1 个答案:

答案 0 :(得分:0)

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

因此,假设您知道SMTP服务器(本例中为localhost),则来自Tutorials Point纯Ruby邮件附件:

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