2016-12-02 31 views
1

標準のnet/smtpを使用してバイナリ添付ファイルを使用してGmailアカウントに電子メールを送信する方法を解明しようとしています。これまでのところ、私は成功したテキストファイルを添付することに成功しました - (やっていることの他に基づいて)次は、このために働く:ruby​​ net/smtpを使用して添付ファイル付きのメールを送信

#!/usr/bin/env ruby 

require 'net/smtp' 

addressee = '[email protected]' 
server = 'smtp.gmail.com' 
port  = 587 
account = 'ACCOUNT' 
from  = addressee 
name  = 'NAME' 
domain = 'gmail.com' 
subject = 'test of smtp using ruby' 
body  = 'Test of SMTP using Ruby.' 
marker = "PART_SEPARATOR" 
filename = "test-attachment" 
filetext = "attachment contents" 

print "Enter password for #{account}: " 
password = $stdin.gets.chomp 

# Define the main headers. 
part1 = <<EOF 
From: #{name} <#{from}> 
To: <#{addressee}> 
Subject: #{subject} 
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: text/plain 
Content-Disposition: attachment; filename="#{File.basename(filename)}" 

#{filetext} 
--#{marker}-- 
EOF 

message = part1 + part2 + part3 

puts message 

smtp = Net::SMTP.new server, port 
smtp.enable_starttls 

smtp.start(domain, account, password, :login) do 
    smtp.send_message message, from, addressee 
end 

問題は、エンコードされたバイナリ添付ファイル付きテキスト添付ファイルを置き換えています。上記の以下の変化が、それは私がGoogleにできましたものに基づいて動作するはずのように見えますが、正しく添付ファイルを送信しません:

#!/usr/bin/env ruby 

require 'net/smtp' 

addressee = '[email protected]' 
server = 'smtp.gmail.com' 
port  = 587 
account = 'ACCOUNT' 
from  = addressee 
name  = 'NAME' 
domain = 'gmail.com' 
subject = 'test of smtp using ruby' 
body  = 'Test of SMTP using Ruby.' 
marker = "PART_SEPARATOR" 
filename = "test-attachment" 
filetext = "attachment contents" 

print "Enter password for #{account}: " 
password = $stdin.gets.chomp 

# Encode contents into base64 format 
encodedcontent = [filetext].pack("m") 

# Define the main headers. 
part1 = <<EOF 
From: #{name} <#{from}> 
To: <#{addressee}> 
Subject: #{subject} 
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="#{File.basename(filename)}" 
Content-Transfer-Encoding:base64 
Content-Disposition: attachment; filename="#{File.basename(filename)}" 

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

message = part1 + part2 + part3 

puts message 

smtp = Net::SMTP.new server, port 
smtp.enable_starttls 

smtp.start(domain, account, password, :login) do 
    smtp.send_message message, from, addressee 
end 

誰もが私が間違ってやっているものを私に伝えることができますか?

答えて

0

私は最終的にバイナリ添付ファイルを送信するために管理してきました - 秘密のメッセージの取付部(その3)で

Content-Type: application/octet-stream; name="#{filename}" 
Content-Disposition: attachment; filename="#{filename}"; size=#{size} 

を使用していました。

これはもう少し小さなテストアタッチメントでうまくいきましたが、大きな(140K)アタッチメントを試したところ、アタッチメントは切り詰められました。

filecontent = File.binread(pathname) 

ではなく

filecontent = File.read(pathname) 

を使用することで問題を解決しているようです。 (私は確信していません。なぜなら)

関連する問題