Используйте Систему пространства имен. Сеть. Почта. Вот ссылка на страницу
MSDN, можно отправить почтовому использованию класс SmtpClient.
я перефразировал пример кода, таким образом, контроль детали MSDNfor.
MailMessage message = new MailMessage(
"fromemail@contoso.com",
"toemail@contoso.com",
"Subject goes here",
"Body goes here");
SmtpClient client = new SmtpClient(server);
client.Send(message);
лучший способ послать много электронных писем состоял бы в том, чтобы поместить что-то вроде этого в forloop и отослать!
filename = "/etc/ipf.conf"
text = open(filename).read()
open(filename, "w").write(text.replace(LASTKNOWN, CURRENT))
from __future__ import with_statement
from contextlib import nested
in_filename, outfilename = "/etc/ipf.conf", "/tmp/ipf.conf"
with nested(open(in_filename), open(outfilename, "w")) as in_, out:
for line in in_:
out.write(line.replace(LASTKNOWN, CURRENT))
os.rename(outfilename, in_filename)
Примечание: "/tmp/ipf.conf" следует заменить на tempfile.NamedTemporaryFile ()
или аналогичный
Примечание: код не тестировался.
Возможно, самым простым способом было бы открыть файл с помощью f = open (имя файла, режим). Затем прочитайте все строки с помощью f.readlines () (это вернет список строк, представляющих строки программы).
Затем вы можете выполнить поиск в этих строках, чтобы найти адрес и заменить его новым (используя стандартную замену строк, регулярные выражения или что угодно).
В конце вы можете записать строки обратно в файл с помощью f.writelines (lines), который удобно возвращает список строк.
ПРИМЕЧАНИЕ: Это неэффективный способ сделать это, он просто самый простой. Пожалуйста,
Пример кода:
f = open(filename, "r")
lines = f.readlines()
# Assume that change_ip is a function that takes a string and returns a new one with the ip changed): example below
ret_lines = [change_ip(lines) for line in lines]
new_file = open(new_filename, "w")
new_file.writelines(lines)
def change_ip(str):
''' Gets a string, returns a new string where the ip is changed '''
# Add implementation, something like: return str.replace(old_ip, new_ip) or something similair.
После проверки комментариев и фрагмента кода, который вы поместили в pastebin, вот рабочее решение. Для начала файл /tmp/iiiipf.conf содержит:
Simply a test file 175.48.204.168
And two times 175.48.204.168 on this line 175.48.204.168
Done.
После запуска кода файл /tmp/iiiipf.conf содержит:
Simply a test file 10.73.144.112
And two times 10.73.144.112 on this line 10.73.144.112
Done.
А вот проверенный рабочий код с моими материалами, слитый с вашим кодом pastebin. :
import socket
import fileinput
import subprocess
import string
import re
CURRENT = socket.getaddrinfo(socket.gethostname(), None)[0][4][0]
LASTKNOWN = '175.48.204.168'
if CURRENT == LASTKNOWN:
print 'Nevermind.'
subprocess.sys.exit()
else:
cf = open("/tmp/iiiipf.conf", "r")
lns = cf.readlines()
# close it so that we can open for writing later
cf.close()
# assumes LASTKNOWN and CURRENT are strings with dotted notation IP addresses
lns = "".join(lns)
lns = re.sub(LASTKNOWN, CURRENT, lns) # This replaces all occurences of LASTKNOWN with CURRENT
cf = open("/tmp/iiiipf.conf", "w")
cf.write(lns)
cf.close()
Этот фрагмент кода будет делать то, что вам нужно, даже если IP-адрес используется несколько раз в файле конфигурации. Он также изменит его в строках комментариев.
Этот метод не требует копирования в / tmp и использует на один вызов подпроцесса меньше при перезапуске брандмауэра и NAT.
Вы пытаетесь «атомарно» обновить содержимое файла, и на эту тему было много восхитительных войн пламени. Но общая картина такова:
1) Запишите новый файл во временный файл и убедитесь, что вы его очистили и закрыли.
2) Используйте возможности вашей операционной системы, чтобы атомарно переименовать временный файл в старый файл.
Теперь вы просто не может атомарно переименовать файл в Windows, но похоже, что вы в любом случае используете unix-подобную систему. Вы атомарно переименовываете, используя os.rename () .
Другой способ простого редактирования файлов на месте - это используйте модуль fileinput
:
import fileinput, sys
for line in fileinput.input(["test.txt"], inplace=True):
line = line.replace("car", "truck")
# sys.stdout is redirected to the file
sys.stdout.write(line)