我正在尝试使用smtplib在Python中发送消息。我有一个sendEmail(消息)函数:
def sendEmail(message)
server = smtplib.SMTP_SSL('mailserver.example.com', 465)
server.ehlo()
server.login("username", "password")
print message
msg = message
fromaddr = "myaddr@someplace.com"
toaddr = "theiraddr@someotherplace.com"
server.sendmail(fromaddr, toaddr, msg)
server.quit()
我正在尝试做这样的事情:
myMessage = "A String Literal" + someString
sendEmail(myMessage)
但是当我这样做时,我有时会收到一封空的电子邮件。 someString是从sqlite中提取的unicode字符串。我尝试了各种字符串连接,将文字与文字相结合,sqlite字符串与sqlite字符串,sqlite字符串与文字,每个自己。我已经使用了+和.join以及我能想到的任何其他东西来加入字符串。似乎一切都有效,但每次都无效。
sendEmail函数中的“打印消息”始终打印出我期望的字符串。 smtplib始终将电子邮件消息发送到正确的电子邮件地址而不会抱怨,它有时只是一条空消息。
由于我已经完成了所有工作而且也没有工作,如果我不完全了解发生了什么,我真的不相信我提出的任何解决方案。任何人都可以帮助我理解这些字符串发生了什么,这样我就能以最恰当的方式构建我的信息,并确信我的应用程序能够可靠地工作吗?
以下是我正在尝试做的更详细的示例:
#connect to the database
dbconn = sqlite3.connect(config["database"])
dbconn.row_factory = sqlite3.Row
dbc = dbconn.cursor()
while true:
#step 1: Check the things and set alarm status in the alarms table
#this step reads from and writes to the database
#step 2: Check each alarm and send a message if necessary
dbc.execute('SELECT * FROM alarms')
theAlarms = dbc.fetchall()
for theAlarm in theAlarms:
if bool(theAlarm['alertShouldBeSent'):
sendEmail('ALARM!!: ' + theAlarm['message'])
dbc.execute('UPDATE alarms SET alertShouldBeSent=0 WHERE id=?',(theAlarm['id']),)
elif bool(theAlarm['allClearShouldBeSent']):
sendEmail('NORMAL: ' + theAlarm['message'])
dbc.execute('UPDATE alarms SET allClearShouldBeSent=0 WHERE id=?',(theAlarm['id'],))
dbconn.commit()
警报表中的每一行都定义了一个应该触发警报的条件,并且有一个字段指示是否满足警报条件使警报激活
来自数据库的警报['消息']类似于“电池着火”或“有人把门打开”。报警表中目前只有4行或5行。确定警报['alertShouldBeSent']的逻辑确保警报仅在每个警报条件下发送一次,并且如果警报未首先重置则不会连续发送警报。对于theAlarm ['allClearShouldBeSent']也是如此。循环连续运行,但不经常发送电子邮件。在测试中,我将一行设置为警报状态。我可以验证发送电子邮件的代码是否应该被触发。