情况是这样的: 我有一张excel表,其中包含电子邮件列表以及位置(2列)。这些位置有时与相同的电子邮件相关联。我需要向每个电子邮件地址发送一封电子邮件,其中包含正文中 EACH 相关位置的文字。
示例:
hollis example@example.net
nashua example@example.net
concord example@example.net
Email: To: example@example.net
You have 3 locations (Hollis, Nashua, Concord)
是否有一种简单的方法以编程方式大致 1500 times
?我对python/vb/perl
拥有非常轻松的经验以及java
的丰富经验。
这是为了工作,我想要一个简单的方法来做到这一点,不仅是我自己,而是其他不那么技术的人都能理解。也许是某种类型的剧本。
编辑:我可以将其保存为CSV格式。
答案 0 :(得分:1)
在我的帖子uploading file from Access 2010中查看SMTP CDO下的Microsoft CDO。
这是Ron de Bruin的一个例子:
Sub CDO_Mail_Small_Text()
Dim iMsg As Object
Dim iConf As Object
Dim strbody As String
' Dim Flds As Variant
Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
' iConf.Load -1 ' CDO Source Defaults
' Set Flds = iConf.Fields
' With Flds
' .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
' .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") _
' = "Fill in your SMTP server here"
' .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
' .Update
' End With
strbody = "Hi there" & vbNewLine & vbNewLine & _
"This is line 1" & vbNewLine & _
"This is line 2" & vbNewLine & _
"This is line 3" & vbNewLine & _
"This is line 4"
With iMsg
Set .Configuration = iConf
.To = "ron@debruin.nl"
.CC = ""
.BCC = ""
.From = """Ron"" <ron@something.nl>"
.Subject = "New figures"
.TextBody = strbody
.Send
End With
End Sub
它适用于Access 2003和2007,它应该在Excel中工作。您只需根据需要调整它,您就不需要使用任何附加组件(即自定义Python脚本 - 所有这些都在VBA中)。
答案 1 :(得分:0)
我必须做类似的事情。所有过滤和类似过程都是在excel上完成的。
对于邮件,我认为最简单的方法是python(我不记得从哪里获得此代码,归功于其作者):
SMTP_SERVER = 'yourserver'
SMTP_PORT = 25
SMTP_USERNAME = 'username'
SMTP_PASSWORD = 'supersecretpass'
SMTP_FROM = 'foo@bar.com'
SMTP_TO =['recipients@example.com', '']
MESSAGE=""" Here goes the message"""
import smtplib, email
from email import encoders
import os
msg = email.MIMEMultipart.MIMEMultipart()
body = email.MIMEText.MIMEText(MESSAGE)
msg.attach(body)
msg.add_header('From', SMTP_FROM)
msg.add_header('To', ', '.join(SMTP_TO))
msg.add_header('Subject', 'This is a test')
mailer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
mailer.login(SMTP_USERNAME, SMTP_PASSWORD)
mailer.sendmail(SMTP_FROM, SMTP_TO, msg.as_string())
mailer.close()
所以我在excel中准备了一切,然后sed + awk为每封电子邮件生成一个python脚本。然后,执行每个循环。它不是很优雅,但它是我能得到的最快捷方式:)。
希望有所帮助
答案 2 :(得分:0)
如果我们使用制表符分隔文件,则收集每个电子邮件地址的位置非常简单:
#!/usr/bin/perl
use strict; use warnings;
my %email_to_location;
while (<>) {
my ($location, $email) = split /\t/;
$location = ucfirst $location;
$email = lc $email;
push @{ $email_to_location{$email} }, $location;
}
# the data is now loaded.
for my $email (sort keys %email_to_location) {
print $email, "\t", join(", ", @{ $email_to_location{$email} }), "\n";
}
输入:
hollis example@example.net
nashua example@example.net
concord example@example.net
输出:
example@example.net Hollis, Nashua, Concord
输入文件可以指定为命令行参数,也可以作为STDIN给出。输出转到STDOUT。
您也可以调用邮件程序脚本,而不是打印输出,例如
while (my ($email, $locations) = each %email_to_location) {
my $loc_string = join ", ", @$locations;
system("mailer-script", $email, $loc_string) == 0
or die "Mailer script failed: $?";
}
邮件程序脚本不需要进行任何进一步的解析;电子邮件地址和位置字符串作为命令行参数给出。
当然,在Perl脚本中进行邮件也是最好的,但我没有相关的技术诀窍。也许使用其他答案。